Explorar o código

ajax表单提交组件优化

update
jqh %!s(int64=5) %!d(string=hai) anos
pai
achega
bc670442e9

+ 14 - 4
resources/assets/dcat/js/Dcat.js

@@ -124,12 +124,22 @@ export default class Dcat {
      * @param url
      */
     reload(url) {
-        let container = this.config.pjax_container_selector;
-        let opt = {container: container};
+        let container = this.config.pjax_container_selector,
+            opt = {container: container};
 
-        url && (opt.url = url);
+        if ($(container).length) {
+            url && (opt.url = url);
 
-        $.pjax.reload(opt);
+            $.pjax.reload(opt);
+
+            return;
+        }
+
+        if (url) {
+            location.href = url;
+        } else {
+            location.reload();
+        }
     }
 
     /**

+ 110 - 45
resources/assets/dcat/js/extensions/Form.js

@@ -1,8 +1,7 @@
 
 import '../jquery-form/jquery.form.min';
 
-let $eColumns = {},
-    formCallbacks = {
+let formCallbacks = {
         before: [], success: [], error: []
     };
 
@@ -13,10 +12,14 @@ class Form {
         _this.options = $.extend({
             // 表单的 jquery 对象或者css选择器
             form: null,
+            // 开启表单验证
+            validate: false,
             // 表单错误信息class
             errorClass: 'has-error',
+            // 表单错误信息容器选择器
+            errorContainerSelector: '.with-errors',
             // 表单组css选择器
-            groupSelector: '.form-group',
+            groupSelector: '.form-group,.form-label-group',
             // tab表单css选择器
             tabSelector: '.tab-pane',
             // 错误信息模板
@@ -29,10 +32,15 @@ class Form {
             before: function () {},
             // 表单提交之后事件监听,返回false可以中止后续逻辑
             after: function () {},
+            // 成功事件,返回false可以中止后续逻辑
+            success: function () {},
+            // 失败事件,返回false可以中止后续逻辑
+            error: function () {},
         }, options);
 
         _this.originalValues = {};
         _this.$form = $(_this.options.form).first();
+        _this._errColumns = {};
 
         _this.submit();
     }
@@ -41,30 +49,50 @@ class Form {
         let Dcat = window.Dcat,
             _this = this,
             $form = _this.$form,
-            options = _this.options;
+            options = _this.options,
+            $submitButton = $form.find(':submit');
 
-        // 移除错误信息
-        removeFieldError(_this);
+        // 移除所有错误信息
+        _this.removeErrors();
 
         $form.ajaxSubmit({
-            beforeSubmit: function (fields, $form, _opt) {
-                if (options.before(fields, $form, _opt, _this) === false) {
+            beforeSubmit: function (fields, form, _opt) {
+                if (options.before(fields, form, _opt, _this) === false) {
                     return false;
                 }
 
-                if (fire(formCallbacks.before, fields, $form, _opt, _this) === false) {
+                // 触发全局事件
+                if (fire(formCallbacks.before, fields, form, _opt, _this) === false) {
                     return false;
                 }
+
+                // 开启表单验证
+                if (options.validate) {
+                    $form.validator('validate');
+
+                    if ($form.find('.' + options.errorClass).length > 0) {
+                        return false;
+                    }
+                }
+
+                $submitButton.buttonLoading();
             },
             success: function (response) {
+                $submitButton.buttonLoading(false);
+
                 if (options.after(true, response, _this) === false) {
                     return;
                 }
 
+                if (options.success(response, _this) === false) {
+                    return;
+                }
+
                 if (fire(formCallbacks.success, response, _this) === false) {
                     return;
                 }
 
+
                 if (! response.status) {
                     Dcat.error(response.message || 'Save failed!');
                     return;
@@ -85,25 +113,32 @@ class Form {
                 }
             },
             error: function (response) {
+                $submitButton.buttonLoading(false);
+
                 if (options.after(false, response, _this) === false) {
                     return;
                 }
 
+                if (options.error(response, _this) === false) {
+                    return;
+                }
+
                 if (fire(formCallbacks.error, response, _this) === false) {
                     return;
                 }
 
                 try {
-                    var error = JSON.parse(response.responseText), i;
+                    var error = JSON.parse(response.responseText),
+                        key;
 
                     if (response.status != 422 || ! error || ! Dcat.helpers.isset(error, 'errors')) {
                         return Dcat.error(response.status + ' ' + response.statusText);
                     }
                     error = error.errors;
 
-                    for (i in error) {
+                    for (key in error) {
                         // 显示错误信息
-                        $eColumns[i] = _this.showFieldError($form, i, error[i]);
+                        _this._errColumns[key] = _this.showError($form, key, error[key]);
                     }
 
                 } catch (e) {
@@ -114,11 +149,16 @@ class Form {
     }
 
     // 显示错误信息
-    showFieldError($form, column, errors) {
+    showError($form, column, errors) {
         let _this = this,
-            $field = _this.queryFieldByName($form, column);
+            $field = _this.queryFieldByName($form, column),
+            render = function (msg) {
+                $group.find(_this.options.errorContainerSelector).first().append(
+                    _this.options.errorTemplate.replace('{message}', msg)
+                );
+            };
 
-        queryTabTitleError(_this, $field).removeClass('hide');
+        queryTabTitleError(_this, $field).removeClass('d-none');
 
         // 保存字段原始数据
         _this.originalValues[column] = _this.getFieldValue($field);
@@ -134,10 +174,12 @@ class Form {
 
         $group.addClass(_this.options.errorClass);
 
-        for (j in errors) {
-            $group.find('error').eq(0).append(
-                _this.options.errorTemplate.replace('{message}', errors[j])
-            );
+        if (typeof errors === 'string') {
+            render(errors)
+        } else {
+            for (j in errors) {
+                render(errors[j])
+            }
         }
 
         if (! _this.options.disableAutoRemoveError) {
@@ -175,7 +217,7 @@ class Form {
     queryFieldByName($form, column) {
         if (column.indexOf('.') !== -1) {
             column = column.split('.');
-            
+
             let first = column.shift(),
                 i,
                 sub = '';
@@ -207,7 +249,8 @@ class Form {
         return $c;
     }
 
-    removeError($field) {
+    // 移除给定字段的错误信息
+    removeError($field, column) {
         let parent = $field.parents(this.options.groupSelector),
             errorClass = this.options.errorClass;
 
@@ -216,15 +259,39 @@ class Form {
 
         // tab页下没有错误信息了,隐藏title的错误图标
         let tab;
-        
+
         if (! queryTabByField(this, $field).find('.'+errorClass).length) {
             tab = queryTabTitleError(this, $field);
-            if (! tab.hasClass('hide')) {
-                tab.addClass('hide');
+            if (! tab.hasClass('d-none')) {
+                tab.addClass('d-none');
             }
         }
 
-        delete $eColumns[column];
+        delete this._errColumns[column];
+    }
+
+    // 删除所有错误信息
+    removeErrors() {
+        let _this = this,
+            column,
+            tab;
+
+        // 移除所有字段的错误信息
+        _this.$form.find(_this.options.errorContainerSelector).each(function (_, $err) {
+            $($err).parents(_this.options.groupSelector).removeClass(_this.options.errorClass);
+            $($err).html('');
+        });
+
+        // 移除tab表单tab标题错误信息
+        for (column in _this._errColumns) {
+            tab = queryTabTitleError(_this._errColumns[column]);
+            if (! tab.hasClass('d-none')) {
+                tab.addClass('d-none');
+            }
+        }
+
+        // 重置
+        _this._errColumns = {};
     }
 }
 
@@ -247,7 +314,7 @@ Form.submitted = function (success, error) {
 function removeErrorWhenValChanged(form, $field, column) {
     let _this = form,
         removeError = function () {
-            _this.removeError($field)
+            _this.removeError($field, column)
         };
 
     $field.one('change', removeError);
@@ -274,24 +341,6 @@ function removeErrorWhenValChanged(form, $field, column) {
     handle();
 }
 
-// 删除错误有字段的错误信息
-function removeFieldError(form) {
-    let i, parent, tab;
-
-    for (i in $eColumns) {
-        parent = $eColumns[i].parents(form.options.groupSelector);
-        parent.removeClass(form.options.errorClass);
-        parent.find('error').html('');
-
-        tab = queryTabTitleError($eColumns[i]);
-        if (! tab.hasClass('hide')) {
-            tab.addClass('hide');
-        }
-
-    }
-    // 重置
-    $eColumns = {};
-}
 
 function getTabId(form, $field) {
     return $field.parents(form.options.tabSelector).attr('id');
@@ -309,7 +358,7 @@ function queryTabByField(form, $field)
 }
 
 function queryTabTitleError(form, $field) {
-    return queryTabByField(form, $field).find('.text-red');
+    return queryTabByField(form, $field).find('.text-danger');
 }
 
 // 触发钩子事件
@@ -336,4 +385,20 @@ function fire(callbacks) {
     }
 }
 
+
+// 开启form表单模式
+$.fn.form = function (options) {
+    let $this = $(this);
+
+    options = $.extend(options, {
+        form: $this,
+    });
+
+    $this.find(':submit').click(function (event) {
+        Dcat.Form(options);
+
+        return false;
+    });
+};
+
 export default Form

+ 7 - 3
resources/assets/dcat/js/extensions/Loading.js

@@ -87,7 +87,7 @@ function extend(Dcat) {
         $container.loading(options);
     };
 
-    //
+    // 给元素附加加载状态
     $.fn.loading = function (opt) {
         if (opt === false) {
             return $(this).find(loading).remove();
@@ -99,17 +99,21 @@ function extend(Dcat) {
         return new Loading(Dcat, opt);
     };
 
+    // 按钮加载状态
     $.fn.buttonLoading = function (start) {
         let $this = $(this),
-            loadingId = $this.data('loading'),
+            loadingId = $this.attr('data-loading'),
             content;
 
         if (start === false) {
             if (! loadingId) {
                 return $this;
             }
+
+            $this.find('.waves-ripple').remove();
+
             return $this
-                .removeClass('disabled btn-loading')
+                .removeClass('disabled btn-loading waves-effect')
                 .removeAttr('disabled')
                 .removeAttr('data-loading')
                 .html(

+ 9 - 1
resources/assets/dcat/sass/components/_form.scss

@@ -40,7 +40,15 @@ select.form-control:not([multiple=multiple]) {
   margin-bottom: 4px;
 }
 
-.has-error .checkbox, .has-error .checkbox-inline, .has-error .control-label, .has-error .help-block, .has-error .radio, .has-error .radio-inline, .has-error.checkbox label, .has-error.checkbox-inline label, .has-error.radio label, .has-error.radio-inline label {
+.has-error .checkbox,
+.has-error .checkbox-inline,
+.has-error .control-label, .has-error .help-block,
+.has-error .radio,
+.has-error .radio-inline,
+.has-error.checkbox label,
+.has-error.radio label,
+.has-error .form-control-position i,
+.has-error .form-control:focus ~ .form-control-position i {
   color: $red-darker;
 }
 

+ 36 - 36
resources/dist/css/plugins/loaders/animations/ball-grid-beat.css

@@ -27,66 +27,66 @@
 }
 
 .ball-grid-beat > div:nth-child(1) {
-  -webkit-animation-delay: -0.02s;
-          animation-delay: -0.02s;
-  -webkit-animation-duration: 0.92s;
-          animation-duration: 0.92s;
+  -webkit-animation-delay: 0.69s;
+          animation-delay: 0.69s;
+  -webkit-animation-duration: 1.45s;
+          animation-duration: 1.45s;
 }
 
 .ball-grid-beat > div:nth-child(2) {
-  -webkit-animation-delay: 0.51s;
-          animation-delay: 0.51s;
-  -webkit-animation-duration: 0.62s;
-          animation-duration: 0.62s;
+  -webkit-animation-delay: 0.27s;
+          animation-delay: 0.27s;
+  -webkit-animation-duration: 1.23s;
+          animation-duration: 1.23s;
 }
 
 .ball-grid-beat > div:nth-child(3) {
-  -webkit-animation-delay: -0.03s;
-          animation-delay: -0.03s;
-  -webkit-animation-duration: 1.35s;
-          animation-duration: 1.35s;
+  -webkit-animation-delay: 0.5s;
+          animation-delay: 0.5s;
+  -webkit-animation-duration: 1.34s;
+          animation-duration: 1.34s;
 }
 
 .ball-grid-beat > div:nth-child(4) {
-  -webkit-animation-delay: 0.7s;
-          animation-delay: 0.7s;
-  -webkit-animation-duration: 1.28s;
-          animation-duration: 1.28s;
+  -webkit-animation-delay: -0.11s;
+          animation-delay: -0.11s;
+  -webkit-animation-duration: 0.83s;
+          animation-duration: 0.83s;
 }
 
 .ball-grid-beat > div:nth-child(5) {
-  -webkit-animation-delay: 0.73s;
-          animation-delay: 0.73s;
-  -webkit-animation-duration: 1.43s;
-          animation-duration: 1.43s;
+  -webkit-animation-delay: 0.08s;
+          animation-delay: 0.08s;
+  -webkit-animation-duration: 0.83s;
+          animation-duration: 0.83s;
 }
 
 .ball-grid-beat > div:nth-child(6) {
-  -webkit-animation-delay: -0.19s;
-          animation-delay: -0.19s;
-  -webkit-animation-duration: 1.24s;
-          animation-duration: 1.24s;
+  -webkit-animation-delay: 0.76s;
+          animation-delay: 0.76s;
+  -webkit-animation-duration: 1s;
+          animation-duration: 1s;
 }
 
 .ball-grid-beat > div:nth-child(7) {
-  -webkit-animation-delay: 0.23s;
-          animation-delay: 0.23s;
-  -webkit-animation-duration: 1.26s;
-          animation-duration: 1.26s;
+  -webkit-animation-delay: 0.06s;
+          animation-delay: 0.06s;
+  -webkit-animation-duration: 1.09s;
+          animation-duration: 1.09s;
 }
 
 .ball-grid-beat > div:nth-child(8) {
-  -webkit-animation-delay: -0.04s;
-          animation-delay: -0.04s;
-  -webkit-animation-duration: 0.67s;
-          animation-duration: 0.67s;
+  -webkit-animation-delay: 0.08s;
+          animation-delay: 0.08s;
+  -webkit-animation-duration: 1.06s;
+          animation-duration: 1.06s;
 }
 
 .ball-grid-beat > div:nth-child(9) {
-  -webkit-animation-delay: 0.1s;
-          animation-delay: 0.1s;
-  -webkit-animation-duration: 0.68s;
-          animation-duration: 0.68s;
+  -webkit-animation-delay: 0.07s;
+          animation-delay: 0.07s;
+  -webkit-animation-duration: 1.41s;
+          animation-duration: 1.41s;
 }
 
 .ball-grid-beat > div {

+ 34 - 34
resources/dist/css/plugins/loaders/animations/ball-grid-pulse.css

@@ -39,66 +39,66 @@
 }
 
 .ball-grid-pulse > div:nth-child(1) {
-  -webkit-animation-delay: 0.66s;
-          animation-delay: 0.66s;
-  -webkit-animation-duration: 1.42s;
-          animation-duration: 1.42s;
+  -webkit-animation-delay: 0.8s;
+          animation-delay: 0.8s;
+  -webkit-animation-duration: 1.32s;
+          animation-duration: 1.32s;
 }
 
 .ball-grid-pulse > div:nth-child(2) {
   -webkit-animation-delay: 0.77s;
           animation-delay: 0.77s;
-  -webkit-animation-duration: 0.89s;
-          animation-duration: 0.89s;
+  -webkit-animation-duration: 1.49s;
+          animation-duration: 1.49s;
 }
 
 .ball-grid-pulse > div:nth-child(3) {
-  -webkit-animation-delay: 0.64s;
-          animation-delay: 0.64s;
-  -webkit-animation-duration: 0.91s;
-          animation-duration: 0.91s;
+  -webkit-animation-delay: 0.4s;
+          animation-delay: 0.4s;
+  -webkit-animation-duration: 0.82s;
+          animation-duration: 0.82s;
 }
 
 .ball-grid-pulse > div:nth-child(4) {
-  -webkit-animation-delay: 0.53s;
-          animation-delay: 0.53s;
-  -webkit-animation-duration: 1.5s;
-          animation-duration: 1.5s;
+  -webkit-animation-delay: 0.75s;
+          animation-delay: 0.75s;
+  -webkit-animation-duration: 1.58s;
+          animation-duration: 1.58s;
 }
 
 .ball-grid-pulse > div:nth-child(5) {
-  -webkit-animation-delay: 0.8s;
-          animation-delay: 0.8s;
-  -webkit-animation-duration: 1.35s;
-          animation-duration: 1.35s;
+  -webkit-animation-delay: 0.19s;
+          animation-delay: 0.19s;
+  -webkit-animation-duration: 0.93s;
+          animation-duration: 0.93s;
 }
 
 .ball-grid-pulse > div:nth-child(6) {
-  -webkit-animation-delay: 0.13s;
-          animation-delay: 0.13s;
-  -webkit-animation-duration: 1.11s;
-          animation-duration: 1.11s;
+  -webkit-animation-delay: 0.52s;
+          animation-delay: 0.52s;
+  -webkit-animation-duration: 1.56s;
+          animation-duration: 1.56s;
 }
 
 .ball-grid-pulse > div:nth-child(7) {
-  -webkit-animation-delay: 0.33s;
-          animation-delay: 0.33s;
-  -webkit-animation-duration: 1.58s;
-          animation-duration: 1.58s;
+  -webkit-animation-delay: 0.09s;
+          animation-delay: 0.09s;
+  -webkit-animation-duration: 1.34s;
+          animation-duration: 1.34s;
 }
 
 .ball-grid-pulse > div:nth-child(8) {
-  -webkit-animation-delay: 0.69s;
-          animation-delay: 0.69s;
-  -webkit-animation-duration: 0.66s;
-          animation-duration: 0.66s;
+  -webkit-animation-delay: -0.17s;
+          animation-delay: -0.17s;
+  -webkit-animation-duration: 0.96s;
+          animation-duration: 0.96s;
 }
 
 .ball-grid-pulse > div:nth-child(9) {
-  -webkit-animation-delay: 0.23s;
-          animation-delay: 0.23s;
-  -webkit-animation-duration: 1.28s;
-          animation-duration: 1.28s;
+  -webkit-animation-delay: -0.02s;
+          animation-delay: -0.02s;
+  -webkit-animation-duration: 1.04s;
+          animation-duration: 1.04s;
 }
 
 .ball-grid-pulse > div {

+ 16 - 16
resources/dist/css/plugins/loaders/animations/line-scale-random.css

@@ -31,31 +31,31 @@
 }
 
 .line-scale-party > div:nth-child(1) {
-  -webkit-animation-delay: -0.02s;
-          animation-delay: -0.02s;
-  -webkit-animation-duration: 0.57s;
-          animation-duration: 0.57s;
+  -webkit-animation-delay: 0.14s;
+          animation-delay: 0.14s;
+  -webkit-animation-duration: 0.47s;
+          animation-duration: 0.47s;
 }
 
 .line-scale-party > div:nth-child(2) {
-  -webkit-animation-delay: 0.29s;
-          animation-delay: 0.29s;
-  -webkit-animation-duration: 1.25s;
-          animation-duration: 1.25s;
+  -webkit-animation-delay: -0.07s;
+          animation-delay: -0.07s;
+  -webkit-animation-duration: 0.97s;
+          animation-duration: 0.97s;
 }
 
 .line-scale-party > div:nth-child(3) {
-  -webkit-animation-delay: -0.19s;
-          animation-delay: -0.19s;
-  -webkit-animation-duration: 0.95s;
-          animation-duration: 0.95s;
+  -webkit-animation-delay: 0.52s;
+          animation-delay: 0.52s;
+  -webkit-animation-duration: 1.26s;
+          animation-duration: 1.26s;
 }
 
 .line-scale-party > div:nth-child(4) {
-  -webkit-animation-delay: 0.72s;
-          animation-delay: 0.72s;
-  -webkit-animation-duration: 1.02s;
-          animation-duration: 1.02s;
+  -webkit-animation-delay: 0.1s;
+          animation-delay: 0.1s;
+  -webkit-animation-duration: 0.9s;
+          animation-duration: 0.9s;
 }
 
 .line-scale-party > div {

+ 88 - 88
resources/dist/css/plugins/loaders/loaders.css

@@ -1454,66 +1454,66 @@
 }
 
 .ball-grid-beat > div:nth-child(1) {
-  -webkit-animation-delay: 0.53s;
-          animation-delay: 0.53s;
-  -webkit-animation-duration: 0.81s;
-          animation-duration: 0.81s;
+  -webkit-animation-delay: 0.26s;
+          animation-delay: 0.26s;
+  -webkit-animation-duration: 1.52s;
+          animation-duration: 1.52s;
 }
 
 .ball-grid-beat > div:nth-child(2) {
-  -webkit-animation-delay: 0.4s;
-          animation-delay: 0.4s;
-  -webkit-animation-duration: 1.07s;
-          animation-duration: 1.07s;
+  -webkit-animation-delay: 0.3s;
+          animation-delay: 0.3s;
+  -webkit-animation-duration: 1.2s;
+          animation-duration: 1.2s;
 }
 
 .ball-grid-beat > div:nth-child(3) {
-  -webkit-animation-delay: 0.09s;
-          animation-delay: 0.09s;
-  -webkit-animation-duration: 0.82s;
-          animation-duration: 0.82s;
+  -webkit-animation-delay: 0.7s;
+          animation-delay: 0.7s;
+  -webkit-animation-duration: 1.07s;
+          animation-duration: 1.07s;
 }
 
 .ball-grid-beat > div:nth-child(4) {
-  -webkit-animation-delay: -0.13s;
-          animation-delay: -0.13s;
-  -webkit-animation-duration: 1.23s;
-          animation-duration: 1.23s;
+  -webkit-animation-delay: 0.03s;
+          animation-delay: 0.03s;
+  -webkit-animation-duration: 1.14s;
+          animation-duration: 1.14s;
 }
 
 .ball-grid-beat > div:nth-child(5) {
-  -webkit-animation-delay: 0.26s;
-          animation-delay: 0.26s;
-  -webkit-animation-duration: 0.82s;
-          animation-duration: 0.82s;
+  -webkit-animation-delay: 0.58s;
+          animation-delay: 0.58s;
+  -webkit-animation-duration: 1.59s;
+          animation-duration: 1.59s;
 }
 
 .ball-grid-beat > div:nth-child(6) {
-  -webkit-animation-delay: 0.77s;
-          animation-delay: 0.77s;
-  -webkit-animation-duration: 1.23s;
-          animation-duration: 1.23s;
+  -webkit-animation-delay: -0.15s;
+          animation-delay: -0.15s;
+  -webkit-animation-duration: 0.72s;
+          animation-duration: 0.72s;
 }
 
 .ball-grid-beat > div:nth-child(7) {
-  -webkit-animation-delay: 0.4s;
-          animation-delay: 0.4s;
-  -webkit-animation-duration: 1.13s;
-          animation-duration: 1.13s;
+  -webkit-animation-delay: -0.01s;
+          animation-delay: -0.01s;
+  -webkit-animation-duration: 1.52s;
+          animation-duration: 1.52s;
 }
 
 .ball-grid-beat > div:nth-child(8) {
-  -webkit-animation-delay: 0.31s;
-          animation-delay: 0.31s;
-  -webkit-animation-duration: 0.79s;
-          animation-duration: 0.79s;
+  -webkit-animation-delay: -0.17s;
+          animation-delay: -0.17s;
+  -webkit-animation-duration: 1.47s;
+          animation-duration: 1.47s;
 }
 
 .ball-grid-beat > div:nth-child(9) {
-  -webkit-animation-delay: 0.65s;
-          animation-delay: 0.65s;
-  -webkit-animation-duration: 1.15s;
-          animation-duration: 1.15s;
+  -webkit-animation-delay: 0.47s;
+          animation-delay: 0.47s;
+  -webkit-animation-duration: 0.86s;
+          animation-duration: 0.86s;
 }
 
 .ball-grid-beat > div {
@@ -1575,66 +1575,66 @@
 }
 
 .ball-grid-pulse > div:nth-child(1) {
-  -webkit-animation-delay: 0.75s;
-          animation-delay: 0.75s;
-  -webkit-animation-duration: 1.03s;
-          animation-duration: 1.03s;
+  -webkit-animation-delay: 0.38s;
+          animation-delay: 0.38s;
+  -webkit-animation-duration: 0.76s;
+          animation-duration: 0.76s;
 }
 
 .ball-grid-pulse > div:nth-child(2) {
-  -webkit-animation-delay: 0.49s;
-          animation-delay: 0.49s;
-  -webkit-animation-duration: 0.93s;
-          animation-duration: 0.93s;
+  -webkit-animation-delay: 0.17s;
+          animation-delay: 0.17s;
+  -webkit-animation-duration: 1.26s;
+          animation-duration: 1.26s;
 }
 
 .ball-grid-pulse > div:nth-child(3) {
-  -webkit-animation-delay: 0.44s;
-          animation-delay: 0.44s;
-  -webkit-animation-duration: 0.65s;
-          animation-duration: 0.65s;
+  -webkit-animation-delay: -0.06s;
+          animation-delay: -0.06s;
+  -webkit-animation-duration: 0.7s;
+          animation-duration: 0.7s;
 }
 
 .ball-grid-pulse > div:nth-child(4) {
-  -webkit-animation-delay: 0.34s;
-          animation-delay: 0.34s;
-  -webkit-animation-duration: 0.74s;
-          animation-duration: 0.74s;
+  -webkit-animation-delay: -0.12s;
+          animation-delay: -0.12s;
+  -webkit-animation-duration: 0.84s;
+          animation-duration: 0.84s;
 }
 
 .ball-grid-pulse > div:nth-child(5) {
-  -webkit-animation-delay: -0.16s;
-          animation-delay: -0.16s;
-  -webkit-animation-duration: 1.09s;
-          animation-duration: 1.09s;
+  -webkit-animation-delay: 0.44s;
+          animation-delay: 0.44s;
+  -webkit-animation-duration: 0.74s;
+          animation-duration: 0.74s;
 }
 
 .ball-grid-pulse > div:nth-child(6) {
-  -webkit-animation-delay: 0.51s;
-          animation-delay: 0.51s;
-  -webkit-animation-duration: 0.71s;
-          animation-duration: 0.71s;
+  -webkit-animation-delay: 0.57s;
+          animation-delay: 0.57s;
+  -webkit-animation-duration: 1.04s;
+          animation-duration: 1.04s;
 }
 
 .ball-grid-pulse > div:nth-child(7) {
-  -webkit-animation-delay: 0.37s;
-          animation-delay: 0.37s;
-  -webkit-animation-duration: 1.35s;
-          animation-duration: 1.35s;
+  -webkit-animation-delay: 0.28s;
+          animation-delay: 0.28s;
+  -webkit-animation-duration: 0.66s;
+          animation-duration: 0.66s;
 }
 
 .ball-grid-pulse > div:nth-child(8) {
-  -webkit-animation-delay: -0.01s;
-          animation-delay: -0.01s;
-  -webkit-animation-duration: 1.52s;
-          animation-duration: 1.52s;
+  -webkit-animation-delay: 0.5s;
+          animation-delay: 0.5s;
+  -webkit-animation-duration: 0.66s;
+          animation-duration: 0.66s;
 }
 
 .ball-grid-pulse > div:nth-child(9) {
-  -webkit-animation-delay: 0.68s;
-          animation-delay: 0.68s;
-  -webkit-animation-duration: 1.6s;
-          animation-duration: 1.6s;
+  -webkit-animation-delay: 0.7s;
+          animation-delay: 0.7s;
+  -webkit-animation-duration: 1.12s;
+          animation-duration: 1.12s;
 }
 
 .ball-grid-pulse > div {
@@ -2181,31 +2181,31 @@
 }
 
 .line-scale-party > div:nth-child(1) {
-  -webkit-animation-delay: 0.68s;
-          animation-delay: 0.68s;
-  -webkit-animation-duration: 0.6s;
-          animation-duration: 0.6s;
+  -webkit-animation-delay: -0.01s;
+          animation-delay: -0.01s;
+  -webkit-animation-duration: 0.66s;
+          animation-duration: 0.66s;
 }
 
 .line-scale-party > div:nth-child(2) {
-  -webkit-animation-delay: 0.78s;
-          animation-delay: 0.78s;
-  -webkit-animation-duration: 0.39s;
-          animation-duration: 0.39s;
+  -webkit-animation-delay: -0.09s;
+          animation-delay: -0.09s;
+  -webkit-animation-duration: 0.67s;
+          animation-duration: 0.67s;
 }
 
 .line-scale-party > div:nth-child(3) {
-  -webkit-animation-delay: 0.11s;
-          animation-delay: 0.11s;
-  -webkit-animation-duration: 0.84s;
-          animation-duration: 0.84s;
+  -webkit-animation-delay: -0.15s;
+          animation-delay: -0.15s;
+  -webkit-animation-duration: 0.67s;
+          animation-duration: 0.67s;
 }
 
 .line-scale-party > div:nth-child(4) {
-  -webkit-animation-delay: -0.09s;
-          animation-delay: -0.09s;
-  -webkit-animation-duration: 0.56s;
-          animation-duration: 0.56s;
+  -webkit-animation-delay: 0.71s;
+          animation-delay: 0.71s;
+  -webkit-animation-duration: 0.52s;
+          animation-duration: 0.52s;
 }
 
 .line-scale-party > div {

+ 2 - 2
resources/dist/dcat/css/dcat-app.css

@@ -1924,9 +1924,9 @@ select.form-control:not([multiple=multiple]) {
 .has-error .radio,
 .has-error .radio-inline,
 .has-error.checkbox label,
-.has-error.checkbox-inline label,
 .has-error.radio label,
-.has-error.radio-inline label {
+.has-error .form-control-position i,
+.has-error .form-control:focus ~ .form-control-position i {
   color: #bd4147;
 }
 

+ 1 - 1
resources/dist/dcat/extra/grid-extend.js

@@ -419,7 +419,7 @@
 /*! no static exports found */
 /***/ (function(module, exports, __webpack_require__) {
 
-module.exports = __webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\dcat\extra\grid-extend.js */"./resources/assets/dcat/extra/grid-extend.js");
+module.exports = __webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\dcat\extra\grid-extend.js */"./resources/assets/dcat/extra/grid-extend.js");
 
 
 /***/ })

+ 1 - 1
resources/dist/dcat/extra/resource-selector.js

@@ -472,7 +472,7 @@ function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "functi
 /*! no static exports found */
 /***/ (function(module, exports, __webpack_require__) {
 
-module.exports = __webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\dcat\extra\resource-selector.js */"./resources/assets/dcat/extra/resource-selector.js");
+module.exports = __webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\dcat\extra\resource-selector.js */"./resources/assets/dcat/extra/resource-selector.js");
 
 
 /***/ })

+ 1 - 1
resources/dist/dcat/extra/upload.js

@@ -1090,7 +1090,7 @@
 /*! no static exports found */
 /***/ (function(module, exports, __webpack_require__) {
 
-module.exports = __webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\dcat\extra\upload.js */"./resources/assets/dcat/extra/upload.js");
+module.exports = __webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\dcat\extra\upload.js */"./resources/assets/dcat/extra/upload.js");
 
 
 /***/ })

+ 310 - 237
resources/dist/dcat/js/dcat-app.js

@@ -148,12 +148,12 @@ var Dcat = /*#__PURE__*/function () {
     new _extensions_Helpers__WEBPACK_IMPORTED_MODULE_0__["default"](this);
     this.withConfig(config);
   }
-  /**
-   * 初始化事件监听方法
-   *
-   * @param callback
-   * @param once
-   * @returns {Dcat}
+  /**
+   * 初始化事件监听方法
+   *
+   * @param callback
+   * @param once
+   * @returns {Dcat}
    */
 
 
@@ -164,11 +164,11 @@ var Dcat = /*#__PURE__*/function () {
       bootingCallbacks.push([callback, once]);
       return this;
     }
-    /**
-     * 初始化事件监听方法,每个请求都会触发
-     *
-     * @param callback
-     * @returns {Dcat}
+    /**
+     * 初始化事件监听方法,每个请求都会触发
+     *
+     * @param callback
+     * @returns {Dcat}
      */
 
   }, {
@@ -176,8 +176,8 @@ var Dcat = /*#__PURE__*/function () {
     value: function bootingEveryRequest(callback) {
       return this.booting(callback, false);
     }
-    /**
-     * 初始化
+    /**
+     * 初始化
      */
 
   }, {
@@ -199,13 +199,13 @@ var Dcat = /*#__PURE__*/function () {
 
       _this.onPjaxLoaded(_this.boot.bind(this));
     }
-    /**
-     * 监听所有js脚本加载完毕事件,需要用此方法代替 $.ready 方法
-     * 此方法允许在iframe中监听父窗口的事件
-     *
-     * @param callback
-     * @param _window
-     * @returns {*|jQuery|*|jQuery.fn.init|jQuery|HTMLElement}
+    /**
+     * 监听所有js脚本加载完毕事件,需要用此方法代替 $.ready 方法
+     * 此方法允许在iframe中监听父窗口的事件
+     *
+     * @param callback
+     * @param _window
+     * @returns {*|jQuery|*|jQuery.fn.init|jQuery|HTMLElement}
      */
 
   }, {
@@ -229,8 +229,8 @@ var Dcat = /*#__PURE__*/function () {
 
       _window.Dcat.ready(proxy);
     }
-    /**
-     * 主动触发 ready 事件
+    /**
+     * 主动触发 ready 事件
      */
 
   }, {
@@ -244,10 +244,10 @@ var Dcat = /*#__PURE__*/function () {
         $(document).trigger('pjax:loaded');
       });
     }
-    /**
-     * 如果是 pjax 响应的页面,需要调用此方法
-     *
-     * @returns {Dcat}
+    /**
+     * 如果是 pjax 响应的页面,需要调用此方法
+     *
+     * @returns {Dcat}
      */
 
   }, {
@@ -256,29 +256,39 @@ var Dcat = /*#__PURE__*/function () {
       _pjaxResponded = true;
       return this;
     }
-    /**
-     * 使用pjax重载页面
-     *
-     * @param url
+    /**
+     * 使用pjax重载页面
+     *
+     * @param url
      */
 
   }, {
     key: "reload",
     value: function reload(url) {
-      var container = this.config.pjax_container_selector;
-      var opt = {
+      var container = this.config.pjax_container_selector,
+          opt = {
         container: container
       };
-      url && (opt.url = url);
-      $.pjax.reload(opt);
+
+      if ($(container).length) {
+        url && (opt.url = url);
+        $.pjax.reload(opt);
+        return;
+      }
+
+      if (url) {
+        location.href = url;
+      } else {
+        location.reload();
+      }
     }
-    /**
-     * 监听pjax加载js脚本完毕事件方法,此事件在 pjax:complete 事件之后触发
-     *
-     * @param callback
-     * @param once 默认true
-     *
-     * @returns {*|jQuery}
+    /**
+     * 监听pjax加载js脚本完毕事件方法,此事件在 pjax:complete 事件之后触发
+     *
+     * @param callback
+     * @param once 默认true
+     *
+     * @returns {*|jQuery}
      */
 
   }, {
@@ -292,12 +302,12 @@ var Dcat = /*#__PURE__*/function () {
 
       return $(document).on('pjax:loaded', callback);
     }
-    /**
-     * 监听pjax加载完毕完毕事件方法
-     *
-     * @param callback
-     * @param once 默认true
-     * @returns {*|jQuery}
+    /**
+     * 监听pjax加载完毕完毕事件方法
+     *
+     * @param callback
+     * @param once 默认true
+     * @returns {*|jQuery}
      */
 
   }, {
@@ -700,13 +710,13 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var _bootstrappers_Footer__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./bootstrappers/Footer */ "./resources/assets/dcat/js/bootstrappers/Footer.js");
 /* harmony import */ var _bootstrappers_Pjax__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./bootstrappers/Pjax */ "./resources/assets/dcat/js/bootstrappers/Pjax.js");
 /* harmony import */ var _bootstrappers_DataActions__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./bootstrappers/DataActions */ "./resources/assets/dcat/js/bootstrappers/DataActions.js");
-/*=========================================================================================
-  File Name: app.js
-  Description: Dcat Admin JS脚本.
-  ----------------------------------------------------------------------------------------
-  Item Name: Dcat Admin
-  Author: Jqh
-  Author URL: https://github.com/jqhph
+/*=========================================================================================
+  File Name: app.js
+  Description: Dcat Admin JS脚本.
+  ----------------------------------------------------------------------------------------
+  Item Name: Dcat Admin
+  Author: Jqh
+  Author URL: https://github.com/jqhph
 ==========================================================================================*/
 
 
@@ -811,8 +821,8 @@ function boot(Dcat) {
   $(Dcat.boot.bind(Dcat));
   return Dcat;
 }
-/**
- * @returns {Dcat}
+/**
+ * @returns {Dcat}
  */
 
 
@@ -1561,8 +1571,7 @@ function _defineProperties(target, props) { for (var i = 0; i < props.length; i+
 function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
 
 
-var $eColumns = {},
-    formCallbacks = {
+var formCallbacks = {
   before: [],
   success: [],
   error: []
@@ -1577,10 +1586,14 @@ var Form = /*#__PURE__*/function () {
     _this.options = $.extend({
       // 表单的 jquery 对象或者css选择器
       form: null,
+      // 开启表单验证
+      validate: false,
       // 表单错误信息class
       errorClass: 'has-error',
+      // 表单错误信息容器选择器
+      errorContainerSelector: '.with-errors',
       // 表单组css选择器
-      groupSelector: '.form-group',
+      groupSelector: '.form-group,.form-label-group',
       // tab表单css选择器
       tabSelector: '.tab-pane',
       // 错误信息模板
@@ -1592,10 +1605,15 @@ var Form = /*#__PURE__*/function () {
       // 表单提交之前事件监听,返回false可以中止表单继续提交
       before: function before() {},
       // 表单提交之后事件监听,返回false可以中止后续逻辑
-      after: function after() {}
+      after: function after() {},
+      // 成功事件,返回false可以中止后续逻辑
+      success: function success() {},
+      // 失败事件,返回false可以中止后续逻辑
+      error: function error() {}
     }, options);
     _this.originalValues = {};
     _this.$form = $(_this.options.form).first();
+    _this._errColumns = {};
 
     _this.submit();
   }
@@ -1606,25 +1624,45 @@ var Form = /*#__PURE__*/function () {
       var Dcat = window.Dcat,
           _this = this,
           $form = _this.$form,
-          options = _this.options; // 移除错误信息
+          options = _this.options,
+          $submitButton = $form.find(':submit'); // 移除所有错误信息
+
 
+      _this.removeErrors();
 
-      removeFieldError(_this);
       $form.ajaxSubmit({
-        beforeSubmit: function beforeSubmit(fields, $form, _opt) {
-          if (options.before(fields, $form, _opt, _this) === false) {
+        beforeSubmit: function beforeSubmit(fields, form, _opt) {
+          if (options.before(fields, form, _opt, _this) === false) {
             return false;
-          }
+          } // 触发全局事件
+
 
-          if (fire(formCallbacks.before, fields, $form, _opt, _this) === false) {
+          if (fire(formCallbacks.before, fields, form, _opt, _this) === false) {
             return false;
+          } // 开启表单验证
+
+
+          if (options.validate) {
+            $form.validator('validate');
+
+            if ($form.find('.' + options.errorClass).length > 0) {
+              return false;
+            }
           }
+
+          $submitButton.buttonLoading();
         },
         success: function success(response) {
+          $submitButton.buttonLoading(false);
+
           if (options.after(true, response, _this) === false) {
             return;
           }
 
+          if (options.success(response, _this) === false) {
+            return;
+          }
+
           if (fire(formCallbacks.success, response, _this) === false) {
             return;
           }
@@ -1649,17 +1687,23 @@ var Form = /*#__PURE__*/function () {
           }
         },
         error: function error(response) {
+          $submitButton.buttonLoading(false);
+
           if (options.after(false, response, _this) === false) {
             return;
           }
 
+          if (options.error(response, _this) === false) {
+            return;
+          }
+
           if (fire(formCallbacks.error, response, _this) === false) {
             return;
           }
 
           try {
             var error = JSON.parse(response.responseText),
-                i;
+                key;
 
             if (response.status != 422 || !error || !Dcat.helpers.isset(error, 'errors')) {
               return Dcat.error(response.status + ' ' + response.statusText);
@@ -1667,9 +1711,9 @@ var Form = /*#__PURE__*/function () {
 
             error = error.errors;
 
-            for (i in error) {
+            for (key in error) {
               // 显示错误信息
-              $eColumns[i] = _this.showFieldError($form, i, error[i]);
+              _this._errColumns[key] = _this.showError($form, key, error[key]);
             }
           } catch (e) {
             return Dcat.error(response.status + ' ' + response.statusText);
@@ -1679,12 +1723,15 @@ var Form = /*#__PURE__*/function () {
     } // 显示错误信息
 
   }, {
-    key: "showFieldError",
-    value: function showFieldError($form, column, errors) {
+    key: "showError",
+    value: function showError($form, column, errors) {
       var _this = this,
-          $field = _this.queryFieldByName($form, column);
+          $field = _this.queryFieldByName($form, column),
+          render = function render(msg) {
+        $group.find(_this.options.errorContainerSelector).first().append(_this.options.errorTemplate.replace('{message}', msg));
+      };
 
-      queryTabTitleError(_this, $field).removeClass('hide'); // 保存字段原始数据
+      queryTabTitleError(_this, $field).removeClass('d-none'); // 保存字段原始数据
 
       _this.originalValues[column] = _this.getFieldValue($field);
 
@@ -1700,8 +1747,12 @@ var Form = /*#__PURE__*/function () {
           j;
       $group.addClass(_this.options.errorClass);
 
-      for (j in errors) {
-        $group.find('error').eq(0).append(_this.options.errorTemplate.replace('{message}', errors[j]));
+      if (typeof errors === 'string') {
+        render(errors);
+      } else {
+        for (j in errors) {
+          render(errors[j]);
+        }
       }
 
       if (!_this.options.disableAutoRemoveError) {
@@ -1773,10 +1824,11 @@ var Form = /*#__PURE__*/function () {
       }
 
       return $c;
-    }
+    } // 移除给定字段的错误信息
+
   }, {
     key: "removeError",
-    value: function removeError($field) {
+    value: function removeError($field, column) {
       var parent = $field.parents(this.options.groupSelector),
           errorClass = this.options.errorClass;
       parent.removeClass(errorClass);
@@ -1787,12 +1839,38 @@ var Form = /*#__PURE__*/function () {
       if (!queryTabByField(this, $field).find('.' + errorClass).length) {
         tab = queryTabTitleError(this, $field);
 
-        if (!tab.hasClass('hide')) {
-          tab.addClass('hide');
+        if (!tab.hasClass('d-none')) {
+          tab.addClass('d-none');
         }
       }
 
-      delete $eColumns[column];
+      delete this._errColumns[column];
+    } // 删除所有错误信息
+
+  }, {
+    key: "removeErrors",
+    value: function removeErrors() {
+      var _this = this,
+          column,
+          tab; // 移除所有字段的错误信息
+
+
+      _this.$form.find(_this.options.errorContainerSelector).each(function (_, $err) {
+        $($err).parents(_this.options.groupSelector).removeClass(_this.options.errorClass);
+        $($err).html('');
+      }); // 移除tab表单tab标题错误信息
+
+
+      for (column in _this._errColumns) {
+        tab = queryTabTitleError(_this._errColumns[column]);
+
+        if (!tab.hasClass('d-none')) {
+          tab.addClass('d-none');
+        }
+      } // 重置
+
+
+      _this._errColumns = {};
     }
   }]);
 
@@ -1816,7 +1894,7 @@ Form.submitted = function (success, error) {
 function removeErrorWhenValChanged(form, $field, column) {
   var _this = form,
       removeError = function removeError() {
-    _this.removeError($field);
+    _this.removeError($field, column);
   };
 
   $field.one('change', removeError);
@@ -1841,25 +1919,6 @@ function removeErrorWhenValChanged(form, $field, column) {
   }
 
   handle();
-} // 删除错误有字段的错误信息
-
-
-function removeFieldError(form) {
-  var i, parent, tab;
-
-  for (i in $eColumns) {
-    parent = $eColumns[i].parents(form.options.groupSelector);
-    parent.removeClass(form.options.errorClass);
-    parent.find('error').html('');
-    tab = queryTabTitleError($eColumns[i]);
-
-    if (!tab.hasClass('hide')) {
-      tab.addClass('hide');
-    }
-  } // 重置
-
-
-  $eColumns = {};
 }
 
 function getTabId(form, $field) {
@@ -1877,7 +1936,7 @@ function queryTabByField(form, $field) {
 }
 
 function queryTabTitleError(form, $field) {
-  return queryTabByField(form, $field).find('.text-red');
+  return queryTabByField(form, $field).find('.text-danger');
 } // 触发钩子事件
 
 
@@ -1901,7 +1960,19 @@ function fire(callbacks) {
       return result; // 返回 false 会代码阻止继续执行
     }
   }
-}
+} // 开启form表单模式
+
+
+$.fn.form = function (options) {
+  var $this = $(this);
+  options = $.extend(options, {
+    form: $this
+  });
+  $this.find(':submit').click(function (event) {
+    Dcat.Form(options);
+    return false;
+  });
+};
 
 /* harmony default export */ __webpack_exports__["default"] = (Form);
 
@@ -1990,11 +2061,11 @@ var Helpers = /*#__PURE__*/function () {
 
     this.debounce = _Debounce__WEBPACK_IMPORTED_MODULE_0__["default"];
   }
-  /**
-   * 获取json对象或数组的长度
-   *
-   * @param obj
-   * @returns {number}
+  /**
+   * 获取json对象或数组的长度
+   *
+   * @param obj
+   * @returns {number}
    */
 
 
@@ -2014,12 +2085,12 @@ var Helpers = /*#__PURE__*/function () {
 
       return len;
     }
-    /**
-     * 判断变量或key是否存在
-     *
-     * @param _var
-     * @param key
-     * @returns {boolean}
+    /**
+     * 判断变量或key是否存在
+     *
+     * @param _var
+     * @param key
+     * @returns {boolean}
      */
 
   }, {
@@ -2041,13 +2112,13 @@ var Helpers = /*#__PURE__*/function () {
   }, {
     key: "get",
 
-    /**
-     * 根据key获取对象的值,支持获取多维数据
-     *
-     * @param arr
-     * @param key
-     * @param def
-     * @returns {null|*}
+    /**
+     * 根据key获取对象的值,支持获取多维数据
+     *
+     * @param arr
+     * @param key
+     * @param def
+     * @returns {null|*}
      */
     value: function get(arr, key, def) {
       def = null;
@@ -2068,12 +2139,12 @@ var Helpers = /*#__PURE__*/function () {
 
       return arr;
     }
-    /**
-     * 判断key是否存在
-     *
-     * @param arr
-     * @param key
-     * @returns {def|boolean}
+    /**
+     * 判断key是否存在
+     *
+     * @param arr
+     * @param key
+     * @returns {def|boolean}
      */
 
   }, {
@@ -2092,13 +2163,13 @@ var Helpers = /*#__PURE__*/function () {
 
       return true;
     }
-    /**
-     * 判断元素是否在对象中存在
-     *
-     * @param arr
-     * @param val
-     * @param strict
-     * @returns {boolean}
+    /**
+     * 判断元素是否在对象中存在
+     *
+     * @param arr
+     * @param val
+     * @param strict
+     * @returns {boolean}
      */
 
   }, {
@@ -2180,10 +2251,10 @@ var Helpers = /*#__PURE__*/function () {
 
       return str.replace(new RegExp(_replace, "g"), subject);
     }
-    /**
-     * 生成随机字符串
-     *
-     * @returns {string}
+    /**
+     * 生成随机字符串
+     *
+     * @returns {string}
      */
 
   }, {
@@ -2346,7 +2417,7 @@ function extend(Dcat) {
     win.on('resize', resize);
     resize();
     $container.loading(options);
-  }; //
+  }; // 给元素附加加载状态
 
 
   $.fn.loading = function (opt) {
@@ -2357,11 +2428,12 @@ function extend(Dcat) {
     opt = opt || {};
     opt.container = $(this);
     return new Loading(Dcat, opt);
-  };
+  }; // 按钮加载状态
+
 
   $.fn.buttonLoading = function (start) {
     var $this = $(this),
-        loadingId = $this.data('loading'),
+        loadingId = $this.attr('data-loading'),
         content;
 
     if (start === false) {
@@ -2369,7 +2441,8 @@ function extend(Dcat) {
         return $this;
       }
 
-      return $this.removeClass('disabled btn-loading').removeAttr('disabled').removeAttr('data-loading').html($this.find('.' + loadingId).html());
+      $this.find('.waves-ripple').remove();
+      return $this.removeClass('disabled btn-loading waves-effect').removeAttr('disabled').removeAttr('data-loading').html($this.find('.' + loadingId).html());
     }
 
     if (loadingId) {
@@ -2883,10 +2956,10 @@ var Validator = /*#__PURE__*/function () {
 /*! no static exports found */
 /***/ (function(module, exports) {
 
-/*!
- * jQuery Form Plugin
- * version: 4.2.2
- * Project repository: https://github.com/jquery-form/form
+/*!
+ * jQuery Form Plugin
+ * version: 4.2.2
+ * Project repository: https://github.com/jquery-form/form
  */
 var module = {};
 eval(function (p, a, c, k, _e, r) {
@@ -3986,98 +4059,98 @@ eval(function (p, a, c, k, _e, r) {
 /*! no static exports found */
 /***/ (function(module, exports, __webpack_require__) {
 
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\dcat\js\dcat-app.js */"./resources/assets/dcat/js/dcat-app.js");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\animate\animate.scss */"./resources/assets/sass/plugins/animate/animate.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\calendars\fullcalendar.scss */"./resources/assets/sass/plugins/calendars/fullcalendar.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\extensions\context-menu.scss */"./resources/assets/sass/plugins/extensions/context-menu.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\extensions\drag-and-drop.scss */"./resources/assets/sass/plugins/extensions/drag-and-drop.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\extensions\media-plyr.scss */"./resources/assets/sass/plugins/extensions/media-plyr.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\extensions\noui-slider.scss */"./resources/assets/sass/plugins/extensions/noui-slider.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\extensions\swiper.scss */"./resources/assets/sass/plugins/extensions/swiper.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\extensions\toastr.scss */"./resources/assets/sass/plugins/extensions/toastr.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\file-uploaders\dropzone.scss */"./resources/assets/sass/plugins/file-uploaders/dropzone.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\forms\extended\typeahed.scss */"./resources/assets/sass/plugins/forms/extended/typeahed.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\forms\form-inputs-groups.scss */"./resources/assets/sass/plugins/forms/form-inputs-groups.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\forms\validation\form-validation.scss */"./resources/assets/sass/plugins/forms/validation/form-validation.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\forms\wizard.scss */"./resources/assets/sass/plugins/forms/wizard.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-beat.scss */"./resources/assets/sass/plugins/loaders/animations/ball-beat.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-clip-rotate-multiple.scss */"./resources/assets/sass/plugins/loaders/animations/ball-clip-rotate-multiple.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-clip-rotate-pulse.scss */"./resources/assets/sass/plugins/loaders/animations/ball-clip-rotate-pulse.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-clip-rotate.scss */"./resources/assets/sass/plugins/loaders/animations/ball-clip-rotate.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-grid-beat.scss */"./resources/assets/sass/plugins/loaders/animations/ball-grid-beat.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-grid-pulse.scss */"./resources/assets/sass/plugins/loaders/animations/ball-grid-pulse.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-pulse-rise.scss */"./resources/assets/sass/plugins/loaders/animations/ball-pulse-rise.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-pulse-round.scss */"./resources/assets/sass/plugins/loaders/animations/ball-pulse-round.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-pulse-sync.scss */"./resources/assets/sass/plugins/loaders/animations/ball-pulse-sync.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-pulse.scss */"./resources/assets/sass/plugins/loaders/animations/ball-pulse.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-rotate.scss */"./resources/assets/sass/plugins/loaders/animations/ball-rotate.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-scale-multiple.scss */"./resources/assets/sass/plugins/loaders/animations/ball-scale-multiple.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-scale-random.scss */"./resources/assets/sass/plugins/loaders/animations/ball-scale-random.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-scale-ripple-multiple.scss */"./resources/assets/sass/plugins/loaders/animations/ball-scale-ripple-multiple.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-scale-ripple.scss */"./resources/assets/sass/plugins/loaders/animations/ball-scale-ripple.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-scale.scss */"./resources/assets/sass/plugins/loaders/animations/ball-scale.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-spin-fade-loader.scss */"./resources/assets/sass/plugins/loaders/animations/ball-spin-fade-loader.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-spin-loader.scss */"./resources/assets/sass/plugins/loaders/animations/ball-spin-loader.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-triangle-trace.scss */"./resources/assets/sass/plugins/loaders/animations/ball-triangle-trace.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-zig-zag-deflect.scss */"./resources/assets/sass/plugins/loaders/animations/ball-zig-zag-deflect.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-zig-zag.scss */"./resources/assets/sass/plugins/loaders/animations/ball-zig-zag.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\cube-transition.scss */"./resources/assets/sass/plugins/loaders/animations/cube-transition.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\line-scale-pulse-out-rapid.scss */"./resources/assets/sass/plugins/loaders/animations/line-scale-pulse-out-rapid.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\line-scale-pulse-out.scss */"./resources/assets/sass/plugins/loaders/animations/line-scale-pulse-out.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\line-scale-random.scss */"./resources/assets/sass/plugins/loaders/animations/line-scale-random.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\line-scale.scss */"./resources/assets/sass/plugins/loaders/animations/line-scale.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\line-spin-fade-loader.scss */"./resources/assets/sass/plugins/loaders/animations/line-spin-fade-loader.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\pacman.scss */"./resources/assets/sass/plugins/loaders/animations/pacman.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\semi-circle-spin.scss */"./resources/assets/sass/plugins/loaders/animations/semi-circle-spin.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\square-spin.scss */"./resources/assets/sass/plugins/loaders/animations/square-spin.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\animations\triangle-skew-spin.scss */"./resources/assets/sass/plugins/loaders/animations/triangle-skew-spin.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\loaders\loaders.scss */"./resources/assets/sass/plugins/loaders/loaders.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\pickers\bootstrap-datetimepicker-build.scss */"./resources/assets/sass/plugins/pickers/bootstrap-datetimepicker-build.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\tour\tour.scss */"./resources/assets/sass/plugins/tour/tour.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\plugins\ui\coming-soon.scss */"./resources/assets/sass/plugins/ui/coming-soon.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\themes\dark-layout.scss */"./resources/assets/sass/themes/dark-layout.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\themes\semi-dark-layout.scss */"./resources/assets/sass/themes/semi-dark-layout.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\aggrid.scss */"./resources/assets/sass/pages/aggrid.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\app-chat.scss */"./resources/assets/sass/pages/app-chat.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\app-ecommerce-details.scss */"./resources/assets/sass/pages/app-ecommerce-details.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\app-ecommerce-shop.scss */"./resources/assets/sass/pages/app-ecommerce-shop.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\app-email.scss */"./resources/assets/sass/pages/app-email.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\app-todo.scss */"./resources/assets/sass/pages/app-todo.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\app-user.scss */"./resources/assets/sass/pages/app-user.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\authentication.scss */"./resources/assets/sass/pages/authentication.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\card-analytics.scss */"./resources/assets/sass/pages/card-analytics.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\colors.scss */"./resources/assets/sass/pages/colors.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\coming-soon.scss */"./resources/assets/sass/pages/coming-soon.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\dashboard-analytics.scss */"./resources/assets/sass/pages/dashboard-analytics.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\dashboard-ecommerce.scss */"./resources/assets/sass/pages/dashboard-ecommerce.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\data-list-view.scss */"./resources/assets/sass/pages/data-list-view.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\error.scss */"./resources/assets/sass/pages/error.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\faq.scss */"./resources/assets/sass/pages/faq.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\invoice.scss */"./resources/assets/sass/pages/invoice.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\knowledge-base.scss */"./resources/assets/sass/pages/knowledge-base.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\register.scss */"./resources/assets/sass/pages/register.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\search.scss */"./resources/assets/sass/pages/search.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\timeline.scss */"./resources/assets/sass/pages/timeline.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\pages\users.scss */"./resources/assets/sass/pages/users.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\core\colors\palette-gradient.scss */"./resources/assets/sass/core/colors/palette-gradient.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\core\colors\palette-noui.scss */"./resources/assets/sass/core/colors/palette-noui.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\core\colors\palette-variables.scss */"./resources/assets/sass/core/colors/palette-variables.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\core\menu\menu-types\horizontal-menu.scss */"./resources/assets/sass/core/menu/menu-types/horizontal-menu.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\core\menu\menu-types\vertical-menu.scss */"./resources/assets/sass/core/menu/menu-types/vertical-menu.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\core\menu\menu-types\vertical-overlay-menu.scss */"./resources/assets/sass/core/menu/menu-types/vertical-overlay-menu.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\core\mixins\alert.scss */"./resources/assets/sass/core/mixins/alert.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\core\mixins\hex2rgb.scss */"./resources/assets/sass/core/mixins/hex2rgb.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\core\mixins\main-menu-mixin.scss */"./resources/assets/sass/core/mixins/main-menu-mixin.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\core\mixins\transitions.scss */"./resources/assets/sass/core/mixins/transitions.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\dcat\sass\dcat-app.scss */"./resources/assets/dcat/sass/dcat-app.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\dcat\extra\markdown.scss */"./resources/assets/dcat/extra/markdown.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\dcat\extra\upload.scss */"./resources/assets/dcat/extra/upload.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\bootstrap.scss */"./resources/assets/sass/bootstrap.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\bootstrap-extended.scss */"./resources/assets/sass/bootstrap-extended.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\colors.scss */"./resources/assets/sass/colors.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\components.scss */"./resources/assets/sass/components.scss");
-__webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\custom-rtl.scss */"./resources/assets/sass/custom-rtl.scss");
-module.exports = __webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\sass\custom-laravel.scss */"./resources/assets/sass/custom-laravel.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\dcat\js\dcat-app.js */"./resources/assets/dcat/js/dcat-app.js");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\animate\animate.scss */"./resources/assets/sass/plugins/animate/animate.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\calendars\fullcalendar.scss */"./resources/assets/sass/plugins/calendars/fullcalendar.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\extensions\context-menu.scss */"./resources/assets/sass/plugins/extensions/context-menu.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\extensions\drag-and-drop.scss */"./resources/assets/sass/plugins/extensions/drag-and-drop.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\extensions\media-plyr.scss */"./resources/assets/sass/plugins/extensions/media-plyr.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\extensions\noui-slider.scss */"./resources/assets/sass/plugins/extensions/noui-slider.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\extensions\swiper.scss */"./resources/assets/sass/plugins/extensions/swiper.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\extensions\toastr.scss */"./resources/assets/sass/plugins/extensions/toastr.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\file-uploaders\dropzone.scss */"./resources/assets/sass/plugins/file-uploaders/dropzone.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\forms\extended\typeahed.scss */"./resources/assets/sass/plugins/forms/extended/typeahed.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\forms\form-inputs-groups.scss */"./resources/assets/sass/plugins/forms/form-inputs-groups.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\forms\validation\form-validation.scss */"./resources/assets/sass/plugins/forms/validation/form-validation.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\forms\wizard.scss */"./resources/assets/sass/plugins/forms/wizard.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-beat.scss */"./resources/assets/sass/plugins/loaders/animations/ball-beat.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-clip-rotate-multiple.scss */"./resources/assets/sass/plugins/loaders/animations/ball-clip-rotate-multiple.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-clip-rotate-pulse.scss */"./resources/assets/sass/plugins/loaders/animations/ball-clip-rotate-pulse.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-clip-rotate.scss */"./resources/assets/sass/plugins/loaders/animations/ball-clip-rotate.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-grid-beat.scss */"./resources/assets/sass/plugins/loaders/animations/ball-grid-beat.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-grid-pulse.scss */"./resources/assets/sass/plugins/loaders/animations/ball-grid-pulse.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-pulse-rise.scss */"./resources/assets/sass/plugins/loaders/animations/ball-pulse-rise.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-pulse-round.scss */"./resources/assets/sass/plugins/loaders/animations/ball-pulse-round.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-pulse-sync.scss */"./resources/assets/sass/plugins/loaders/animations/ball-pulse-sync.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-pulse.scss */"./resources/assets/sass/plugins/loaders/animations/ball-pulse.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-rotate.scss */"./resources/assets/sass/plugins/loaders/animations/ball-rotate.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-scale-multiple.scss */"./resources/assets/sass/plugins/loaders/animations/ball-scale-multiple.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-scale-random.scss */"./resources/assets/sass/plugins/loaders/animations/ball-scale-random.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-scale-ripple-multiple.scss */"./resources/assets/sass/plugins/loaders/animations/ball-scale-ripple-multiple.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-scale-ripple.scss */"./resources/assets/sass/plugins/loaders/animations/ball-scale-ripple.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-scale.scss */"./resources/assets/sass/plugins/loaders/animations/ball-scale.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-spin-fade-loader.scss */"./resources/assets/sass/plugins/loaders/animations/ball-spin-fade-loader.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-spin-loader.scss */"./resources/assets/sass/plugins/loaders/animations/ball-spin-loader.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-triangle-trace.scss */"./resources/assets/sass/plugins/loaders/animations/ball-triangle-trace.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-zig-zag-deflect.scss */"./resources/assets/sass/plugins/loaders/animations/ball-zig-zag-deflect.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\ball-zig-zag.scss */"./resources/assets/sass/plugins/loaders/animations/ball-zig-zag.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\cube-transition.scss */"./resources/assets/sass/plugins/loaders/animations/cube-transition.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\line-scale-pulse-out-rapid.scss */"./resources/assets/sass/plugins/loaders/animations/line-scale-pulse-out-rapid.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\line-scale-pulse-out.scss */"./resources/assets/sass/plugins/loaders/animations/line-scale-pulse-out.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\line-scale-random.scss */"./resources/assets/sass/plugins/loaders/animations/line-scale-random.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\line-scale.scss */"./resources/assets/sass/plugins/loaders/animations/line-scale.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\line-spin-fade-loader.scss */"./resources/assets/sass/plugins/loaders/animations/line-spin-fade-loader.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\pacman.scss */"./resources/assets/sass/plugins/loaders/animations/pacman.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\semi-circle-spin.scss */"./resources/assets/sass/plugins/loaders/animations/semi-circle-spin.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\square-spin.scss */"./resources/assets/sass/plugins/loaders/animations/square-spin.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\animations\triangle-skew-spin.scss */"./resources/assets/sass/plugins/loaders/animations/triangle-skew-spin.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\loaders\loaders.scss */"./resources/assets/sass/plugins/loaders/loaders.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\pickers\bootstrap-datetimepicker-build.scss */"./resources/assets/sass/plugins/pickers/bootstrap-datetimepicker-build.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\tour\tour.scss */"./resources/assets/sass/plugins/tour/tour.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\plugins\ui\coming-soon.scss */"./resources/assets/sass/plugins/ui/coming-soon.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\themes\dark-layout.scss */"./resources/assets/sass/themes/dark-layout.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\themes\semi-dark-layout.scss */"./resources/assets/sass/themes/semi-dark-layout.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\aggrid.scss */"./resources/assets/sass/pages/aggrid.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\app-chat.scss */"./resources/assets/sass/pages/app-chat.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\app-ecommerce-details.scss */"./resources/assets/sass/pages/app-ecommerce-details.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\app-ecommerce-shop.scss */"./resources/assets/sass/pages/app-ecommerce-shop.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\app-email.scss */"./resources/assets/sass/pages/app-email.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\app-todo.scss */"./resources/assets/sass/pages/app-todo.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\app-user.scss */"./resources/assets/sass/pages/app-user.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\authentication.scss */"./resources/assets/sass/pages/authentication.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\card-analytics.scss */"./resources/assets/sass/pages/card-analytics.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\colors.scss */"./resources/assets/sass/pages/colors.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\coming-soon.scss */"./resources/assets/sass/pages/coming-soon.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\dashboard-analytics.scss */"./resources/assets/sass/pages/dashboard-analytics.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\dashboard-ecommerce.scss */"./resources/assets/sass/pages/dashboard-ecommerce.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\data-list-view.scss */"./resources/assets/sass/pages/data-list-view.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\error.scss */"./resources/assets/sass/pages/error.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\faq.scss */"./resources/assets/sass/pages/faq.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\invoice.scss */"./resources/assets/sass/pages/invoice.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\knowledge-base.scss */"./resources/assets/sass/pages/knowledge-base.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\register.scss */"./resources/assets/sass/pages/register.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\search.scss */"./resources/assets/sass/pages/search.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\timeline.scss */"./resources/assets/sass/pages/timeline.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\pages\users.scss */"./resources/assets/sass/pages/users.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\core\colors\palette-gradient.scss */"./resources/assets/sass/core/colors/palette-gradient.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\core\colors\palette-noui.scss */"./resources/assets/sass/core/colors/palette-noui.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\core\colors\palette-variables.scss */"./resources/assets/sass/core/colors/palette-variables.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\core\menu\menu-types\horizontal-menu.scss */"./resources/assets/sass/core/menu/menu-types/horizontal-menu.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\core\menu\menu-types\vertical-menu.scss */"./resources/assets/sass/core/menu/menu-types/vertical-menu.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\core\menu\menu-types\vertical-overlay-menu.scss */"./resources/assets/sass/core/menu/menu-types/vertical-overlay-menu.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\core\mixins\alert.scss */"./resources/assets/sass/core/mixins/alert.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\core\mixins\hex2rgb.scss */"./resources/assets/sass/core/mixins/hex2rgb.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\core\mixins\main-menu-mixin.scss */"./resources/assets/sass/core/mixins/main-menu-mixin.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\core\mixins\transitions.scss */"./resources/assets/sass/core/mixins/transitions.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\dcat\sass\dcat-app.scss */"./resources/assets/dcat/sass/dcat-app.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\dcat\extra\markdown.scss */"./resources/assets/dcat/extra/markdown.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\dcat\extra\upload.scss */"./resources/assets/dcat/extra/upload.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\bootstrap.scss */"./resources/assets/sass/bootstrap.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\bootstrap-extended.scss */"./resources/assets/sass/bootstrap-extended.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\colors.scss */"./resources/assets/sass/colors.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\components.scss */"./resources/assets/sass/components.scss");
+__webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\custom-rtl.scss */"./resources/assets/sass/custom-rtl.scss");
+module.exports = __webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\sass\custom-laravel.scss */"./resources/assets/sass/custom-laravel.scss");
 
 
 /***/ })

+ 1 - 1
resources/dist/js/core/app-menu.js

@@ -1020,7 +1020,7 @@ window.addEventListener('resize', function () {
 /*! no static exports found */
 /***/ (function(module, exports, __webpack_require__) {
 
-module.exports = __webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\js\core\app-menu.js */"./resources/assets/js/core/app-menu.js");
+module.exports = __webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\js\core\app-menu.js */"./resources/assets/js/core/app-menu.js");
 
 
 /***/ })

+ 1 - 1
resources/dist/js/core/app.js

@@ -857,7 +857,7 @@
 /*! no static exports found */
 /***/ (function(module, exports, __webpack_require__) {
 
-module.exports = __webpack_require__(/*! D:\php-project\laravel\laraveladmin\github-test\pck-dcat-admin\dcat-admin\resources\assets\js\core\app.js */"./resources/assets/js/core/app.js");
+module.exports = __webpack_require__(/*! F:\p\dcat-admin-github\dcat-admin\resources\assets\js\core\app.js */"./resources/assets/js/core/app.js");
 
 
 /***/ })

+ 0 - 1
resources/views/form/error.blade.php

@@ -1,4 +1,3 @@
-<error></error>
 <div class="help-block  with-errors"></div>
 @if(is_array($errorKey))
     @foreach($errorKey as $key => $col)

+ 29 - 5
resources/views/pages/login.blade.php

@@ -1,24 +1,24 @@
 
-<link rel="stylesheet" href="{{ admin_asset('dcat-admin/css/pages/authentication.css') }}">
+<link rel="stylesheet" href="{{ admin_asset('@admin/css/pages/authentication.css') }}">
 
 <section class="row flexbox-container">
     <div class="col-xl-8 col-11 d-flex justify-content-center">
         <div class="card bg-authentication rounded-0 mb-0">
             <div class="row m-0">
                 <div class="col-lg-6 d-lg-block d-none text-center align-self-center px-1 py-0">
-                    <img src="{{ admin_asset('dcat-admin/images/pages/login.png') }}" alt="branding logo">
+                    <img src="{{ admin_asset('@admin/images/pages/login.png') }}" alt="branding logo">
                 </div>
                 <div class="col-lg-6 col-12 p-0">
                     <div class="card rounded-0 mb-0 px-2">
                         <div class="card-header pb-1">
                             <div class="card-title">
-                                <h4 class="mb-0">Login</h4>
+                                <h4 class="mb-0">{{ __('admin.login') }}</h4>
                             </div>
                         </div>
                         <p class="px-2">Welcome back, please login to your account.</p>
                         <div class="card-content">
                             <div class="card-body pt-1">
-                                <form method="POST" action="{{ admin_url('auth/login') }}">
+                                <form id="login-form" method="POST" action="{{ admin_url('auth/login') }}">
                                     @csrf
                                     <fieldset class="form-label-group form-group position-relative has-icon-left">
                                         <input
@@ -36,6 +36,8 @@
                                         </div>
 
                                         <label for="email">{{ trans('admin.username') }}</label>
+
+                                        <div class="help-block with-errors"></div>
                                         @if($errors->has('username'))
                                         <span class="invalid-feedback text-danger" role="alert">
                                             @foreach($errors->get('username') as $message)
@@ -45,7 +47,7 @@
                                         @endif
                                     </fieldset>
 
-                                    <fieldset class="form-label-group position-relative has-icon-left">
+                                    <fieldset class="form-label-group form-group position-relative has-icon-left">
                                         <input
                                                 id="password"
                                                 type="password"
@@ -61,6 +63,7 @@
                                         </div>
                                         <label for="password">{{ trans('admin.password') }}</label>
 
+                                        <div class="help-block with-errors"></div>
                                         @if($errors->has('password'))
                                             <span class="invalid-feedback text-danger" role="alert">
                                             @foreach($errors->get('password') as $message)
@@ -68,6 +71,7 @@
                                             @endforeach
                                             </span>
                                         @endif
+
                                     </fieldset>
                                     <div class="form-group d-flex justify-content-between align-items-center">
                                         <div class="text-left">
@@ -100,3 +104,23 @@
         </div>
     </div>
 </section>
+
+<script>
+Dcat.ready(function () {
+    // ajax表单提交
+    $('#login-form').form({
+        validate: true,
+        success: function (response) {
+            if (! response.status) {
+                Dcat.error(response.message);
+
+                return false;
+            }
+
+            location.href = response.redirect;
+
+            return false;
+        }
+    });
+});
+</script>

+ 15 - 5
src/Controllers/AuthController.php

@@ -6,6 +6,7 @@ use Dcat\Admin\Admin;
 use Dcat\Admin\Form;
 use Dcat\Admin\Layout\Content;
 use Dcat\Admin\Models\Repositories\Administrator;
+use Dcat\Admin\Traits\HasFormResponse;
 use Illuminate\Auth\GuardHelpers;
 use Illuminate\Http\Request;
 use Illuminate\Routing\Controller;
@@ -15,6 +16,8 @@ use Illuminate\Support\Facades\Validator;
 
 class AuthController extends Controller
 {
+    use HasFormResponse;
+
     /**
      * @var string
      */
@@ -36,9 +39,14 @@ class AuthController extends Controller
             return redirect($this->redirectPath());
         }
 
+        Admin::style(
+            <<<'CSS'
+html body {background: #fff;}
+CSS
+        );
+
         return $content
             ->full()
-            ->withConfig('body_class', 'bg-full-screen-image')
             ->body(
                 view(config('admin.auth.login_view') ?: $this->view)
             );
@@ -63,14 +71,14 @@ class AuthController extends Controller
         ]);
 
         if ($validator->fails()) {
-            return back()->withInput()->withErrors($validator);
+            return $this->validationErrorsResponse($validator);
         }
 
         if ($this->guard()->attempt($credentials, $remember)) {
             return $this->sendLoginResponse($request);
         }
 
-        return back()->withInput()->withErrors([
+        return $this->validationErrorsResponse([
             $this->username() => $this->getFailedLoginMessage(),
         ]);
     }
@@ -239,7 +247,7 @@ class AuthController extends Controller
      *
      * @param \Illuminate\Http\Request $request
      *
-     * @return \Illuminate\Http\Response
+     * @return \Symfony\Component\HttpFoundation\Response
      */
     protected function sendLoginResponse(Request $request)
     {
@@ -247,7 +255,9 @@ class AuthController extends Controller
 
         $request->session()->regenerate();
 
-        return redirect()->intended($this->redirectPath());
+        $path = $request->session()->get('url.intended');
+
+        return $this->redirect($path ?: $this->redirectPath());
     }
 
     /**

+ 2 - 2
src/Controllers/UserController.php

@@ -35,7 +35,7 @@ class UserController extends AdminController
             $grid->id('ID')->sortable();
             $grid->username;
             $grid->name;
-            $grid->roles->pluck('name')->chip('primary', 3);
+            $grid->roles->pluck('name')->label('primary', 3);
 
             $permissionModel = config('admin.database.permissions_model');
             $roleModel = config('admin.database.roles_model');
@@ -112,7 +112,7 @@ class UserController extends AdminController
                 }
 
                 return collect($roles)->pluck('name');
-            })->chip();
+            })->label();
 
             $show->permissions->unescape()->as(function () {
                 $roles = (array) $this->roles;

+ 3 - 24
src/Form/Builder.php

@@ -842,30 +842,9 @@ EOF;
     {
         Admin::script(
             <<<JS
-(function () {
-    var f = $('#{$this->getElementId()}');
-
-    f.find('button.submit').click(function () {
-        var t = $(this);
-
-        Dcat.Form({
-            form: f,
-            before: function () {
-                f.validator('validate');
-
-                if (f.find('.has-error').length > 0) {
-                    return false;
-                }
-                t.buttonLoading().removeClass('waves-effect');
-            },
-            after: function () {
-                t.buttonLoading(false);
-            }
-        });
-    
-        return false;
-    });
-})()
+$('#{$this->getElementId()}').form({
+    validate: true,
+});
 JS
         );
     }

+ 30 - 10
src/Layout/Asset.php

@@ -2,7 +2,7 @@
 
 namespace Dcat\Admin\Layout;
 
-class Assets
+class Asset
 {
     /**
      * 路径别名
@@ -395,19 +395,17 @@ class Assets
     }
 
     /**
-     * 获取脚本的真实路径
+     * 根据别名获取资源路径.
      *
      * @param string $path
      * @param string $type
      *
      * @return string|array|null
      */
-    public function url($path, string $type = 'js')
+    public function get($path, string $type = 'js')
     {
         if (empty($this->alias[$path])) {
-            return admin_asset(
-                $this->getRealPath($path)
-            );
+            return $this->url($path);
         }
 
         $paths = isset($this->alias[$path][$type]) ? (array) $this->alias[$path][$type] : null;
@@ -417,12 +415,34 @@ class Assets
         }
 
         foreach ($paths as &$value) {
-            $value = admin_asset($this->getRealPath($value));
+            $value = $this->url($value);
         }
 
         return $paths;
     }
 
+    /**
+     * 获取静态资源完整URL.
+     *
+     * @param string $path
+     *
+     * @return string
+     */
+    public function url($path)
+    {
+        if (! $path) {
+            return $path;
+        }
+
+        $path = $this->getRealPath($path);
+
+        if (strpos($path, '//') === false) {
+            $path = config('admin.assets_server').'/'.trim($path, '/');
+        }
+
+        return (config('admin.https') || config('admin.secure')) ? secure_asset($path) : asset($path);
+    }
+
     /**
      * 获取真实路径.
      *
@@ -587,7 +607,7 @@ class Assets
         $html = '';
 
         foreach (array_unique($this->css) as &$v) {
-            if (! $paths = $this->url($v, 'css')) {
+            if (! $paths = $this->get($v, 'css')) {
                 continue;
             }
 
@@ -625,7 +645,7 @@ class Assets
         $html = '';
 
         foreach (array_unique($this->js) as &$v) {
-            if (! $paths = $this->url($v, 'js')) {
+            if (! $paths = $this->get($v, 'js')) {
                 continue;
             }
 
@@ -645,7 +665,7 @@ class Assets
         $html = '';
 
         foreach (array_unique($this->headerJs) as &$v) {
-            if (! $paths = $this->url($v, 'js')) {
+            if (! $paths = $this->get($v, 'js')) {
                 continue;
             }
 

+ 1 - 1
src/Layout/Content.php

@@ -125,7 +125,7 @@ class Content implements Renderable
     {
         $this->view = 'admin::layouts.full-content';
 
-        Admin::assets()->full();
+        Admin::asset()->full();
 
         return $this->withConfig('blank_page', true);
     }

+ 1 - 1
src/Show/Field.php

@@ -319,7 +319,7 @@ HTML;
      *
      * @return Field
      */
-    public function label($style = 'success')
+    public function label($style = 'primary')
     {
         return $this->unescape()->as(function ($value) use ($style) {
             $class = $style;

+ 47 - 13
src/Support/Helper.php

@@ -7,10 +7,13 @@ use Illuminate\Contracts\Support\Arrayable;
 use Illuminate\Contracts\Support\Htmlable;
 use Illuminate\Contracts\Support\Jsonable;
 use Illuminate\Contracts\Support\Renderable;
+use Illuminate\Http\Request;
 use Illuminate\Support\Arr;
 use Illuminate\Support\Facades\Artisan;
 use Illuminate\Support\Facades\File;
+use Illuminate\Support\MessageBag;
 use Illuminate\Support\Str;
+use Illuminate\Validation\Validator;
 
 class Helper
 {
@@ -31,7 +34,7 @@ class Helper
     ];
 
     /**
-     * Update extension config.
+     * 更新扩展配置.
      *
      * @param array $config
      *
@@ -52,7 +55,7 @@ class Helper
     }
 
     /**
-     * Converts the given value to an array.
+     * 把给定的值转化为数组.
      *
      * @param $value
      * @param bool $filter
@@ -93,7 +96,7 @@ class Helper
     }
 
     /**
-     * Converts the given value to string.
+     * 把给定的值转化为字符串.
      *
      * @param mixed  $value
      * @param array  $params
@@ -129,8 +132,6 @@ class Helper
     }
 
     /**
-     * Build an HTML attribute string from an array.
-     *
      * @param array $attributes
      *
      * @return string
@@ -157,8 +158,6 @@ class Helper
     }
 
     /**
-     * Get url with the added query string parameters.
-     *
      * @param string $url
      * @param array  $query
      *
@@ -225,7 +224,7 @@ class Helper
     }
 
     /**
-     * If a request match the specific path.
+     * 匹配请求路径.
      *
      * @example
      *      Helper::matchRequestPath('auth/user')
@@ -263,7 +262,7 @@ class Helper
     }
 
     /**
-     * Build nested array.
+     * 生成层级数据.
      *
      * @param array       $nodes
      * @param int         $parentId
@@ -311,8 +310,6 @@ class Helper
     }
 
     /**
-     * Generate a URL friendly "slug" from a given string.
-     *
      * @param string $name
      * @param string $symbol
      *
@@ -380,7 +377,7 @@ class Helper
     }
 
     /**
-     * Delete from array by value.
+     * 删除数组中的元素.
      *
      * @param array $array
      * @param mixed $value
@@ -488,7 +485,7 @@ class Helper
     }
 
     /**
-     * Validate extension name.
+     * 验证扩展包名称.
      *
      * @param string $name
      *
@@ -518,4 +515,41 @@ class Helper
 
         return 'fa fa-file-o';
     }
+
+    /**
+     * 判断是否是ajax请求.
+     *
+     * @param Request $request
+     *
+     * @return bool
+     */
+    public static function isAjaxRequest(?Request $request = null)
+    {
+        /* @var Request $request */
+        $request = $request ?: request();
+
+        return $request->ajax() && ! $request->pjax();
+    }
+
+    /**
+     * 响应请求验证错误.
+     *
+     * @param array|MessageBag|Validator $validationMessages
+     *
+     * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
+     */
+    public static function makeValidationErrorsResponse($validationMessages)
+    {
+        if ($validationMessages instanceof Validator) {
+            $validationMessages = $validationMessages->getMessageBag();
+        }
+
+        if (! static::isAjaxRequest()) {
+            return back()->withInput()->withErrors($validationMessages);
+        }
+
+        return response()->json([
+            'errors' => is_array($validationMessages) ? $validationMessages : $validationMessages->getMessages(),
+        ], 422);
+    }
 }

+ 1 - 5
src/Support/helpers.php

@@ -378,10 +378,6 @@ if (! function_exists('admin_asset')) {
      */
     function admin_asset($path)
     {
-        if (strpos($path, '//') === false) {
-            $path = config('admin.assets_server').'/'.trim($path, '/');
-        }
-
-        return (config('admin.https') || config('admin.secure')) ? secure_asset($path) : asset($path);
+        return Dcat\Admin\Admin::asset()->url($path);
     }
 }

+ 4 - 14
src/Traits/HasFormResponse.php

@@ -2,6 +2,7 @@
 
 namespace Dcat\Admin\Traits;
 
+use Dcat\Admin\Support\Helper;
 use Illuminate\Http\Request;
 use Illuminate\Support\MessageBag;
 
@@ -30,18 +31,13 @@ trait HasFormResponse
     }
 
     /**
-     * Ajax but not pjax.
-     *
      * @param Request $request
      *
      * @return bool
      */
     public function isAjaxRequest(Request $request = null)
     {
-        /* @var Request $request */
-        $request = $request ?: (empty($this->request) ? request() : $this->request);
-
-        return $request->ajax() && ! $request->pjax();
+        return Helper::isAjaxRequest($request);
     }
 
     /**
@@ -137,18 +133,12 @@ trait HasFormResponse
     }
 
     /**
-     * @param array|MessageBag $validationMessages
+     * @param array|MessageBag|\Illuminate\Validation\Validator $validationMessages
      *
      * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
      */
     public function validationErrorsResponse($validationMessages)
     {
-        if (! $this->isAjaxRequest()) {
-            return back()->withInput()->withErrors($validationMessages);
-        }
-
-        return response()->json([
-            'errors' => is_array($validationMessages) ? $validationMessages : $validationMessages->getMessages(),
-        ], 422);
+        return Helper::makeValidationErrorsResponse($validationMessages);
     }
 }

+ 3 - 25
src/Widgets/Form.php

@@ -590,31 +590,9 @@ HTML;
     {
         Admin::script(
             <<<JS
-(function () {
-    var f = $('#{$this->getElementId()}');
-
-    f.find('[type="submit"]').click(function () {
-        var t = $(this);
-        
-        Dcat.Form({
-            form: f,
-            before: function () {
-                f.validator('validate');
-        
-                if (f.find('.has-error').length > 0) {
-                    return false;
-                }
-                
-                t.buttonLoading();
-            },
-            after: function () {
-                t.buttonLoading(false);
-            }
-        });
-    
-        return false;
-    });
-})()
+$('#{$this->getElementId()}').form({
+    validate: true,
+});
 JS
         );
     }