jqh 5 years ago
parent
commit
0e046cb625

+ 9 - 0
.env

@@ -0,0 +1,9 @@
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_APP_CLUSTER=mt1
+
+MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+
+MIX_CONTENT_DIRECTION="ltr"

+ 3 - 1
.gitignore

@@ -1,4 +1,6 @@
 vendor/
 composer.lock
 .idea
-.php_cs.cache
+.php_cs.cache
+/node_modules
+package-lock.json

+ 78 - 0
resources/assets/vendors/dcat-admin/assets-loader.js

@@ -0,0 +1,78 @@
+(function (win) {
+    function AssetsLoader () {
+    }
+
+    AssetsLoader.prototype = {
+        // 按顺序加载静态资源
+        // 并在所有静态资源加载完毕后执行回调函数
+        load: function (urls, callback, args) {
+            var self = this;
+            if (urls.length < 1) {
+                (!callback) || callback(args);
+                return;
+            }
+            seajs.use([urls.pop()], function () {
+                self.load(urls, callback, args);
+            });
+        },
+        // 过滤 <script src> 标签
+        filterScripts: function (content) {
+            var obj = {};
+
+            if (typeof content == 'string') content = $(content);
+
+            obj.scripts = findAll(content, 'script[src]').remove();
+            obj.contents = content.not(obj.scripts);
+
+            obj.contents.render = toString;
+            obj.js = (function () {
+                var urls = [];
+                obj.scripts.each(function (k, v) {
+                    if (v.src) {
+                        urls.push(v.src);
+                    }
+                });
+
+                return urls;
+            })();
+
+            return obj;
+        },
+
+        // 返回过滤 <script src> 标签后的内容,并在加载完 script 脚本后触发 "pjax:script" 事件
+        filterScriptAndAutoLoad: function (content, callback) {
+            var obj = this.filterScripts(content);
+
+            this.load(obj.js, function () {
+                (!callback) || callback(obj.contents);
+                fire();
+            });
+
+            return obj.contents;
+        },
+    };
+
+    function findAll(elems, selector) {
+        if (typeof elems == 'string') elems = $(elems);
+        return elems.filter(selector).add(elems.find(selector));
+    }
+
+    function fire () {
+        LA.pjaxresponse = 1;
+        // js加载完毕 触发 ready 事件
+        // setTimeout用于保证在所有js代码最后执行
+        setTimeout(LA.triggerReady, 1);
+    }
+
+    function toString (th) {
+        var html = '', out;
+        this.each(function (k, v) {
+            if ((out = v.outerHTML)) {
+                html += out;
+            }
+        });
+        return html;
+    };
+
+    LA.AssetsLoader = new AssetsLoader;
+})(window);

+ 263 - 0
resources/assets/vendors/dcat-admin/fonts.css

@@ -0,0 +1,263 @@
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 200;
+    src: local('Nunito ExtraLight Italic'), local('Nunito-ExtraLightItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN5MZ9vFUT8_DQ.woff2) format('woff2');
+    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 200;
+    src: local('Nunito ExtraLight Italic'), local('Nunito-ExtraLightItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN5MZ9vEUT8_DQ.woff2) format('woff2');
+    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 200;
+    src: local('Nunito ExtraLight Italic'), local('Nunito-ExtraLightItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN5MZ9vKUT8.woff2) format('woff2');
+    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 300;
+    src: local('Nunito Light Italic'), local('Nunito-LightItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN4oZNvFUT8_DQ.woff2) format('woff2');
+    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 300;
+    src: local('Nunito Light Italic'), local('Nunito-LightItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN4oZNvEUT8_DQ.woff2) format('woff2');
+    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 300;
+    src: local('Nunito Light Italic'), local('Nunito-LightItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN4oZNvKUT8.woff2) format('woff2');
+    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 400;
+    src: local('Nunito Italic'), local('Nunito-Italic'), url(../vendor/fonts/nunito-v10/XRXX3I6Li01BKofIMNaMRs71cA.woff2) format('woff2');
+    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 400;
+    src: local('Nunito Italic'), local('Nunito-Italic'), url(../vendor/fonts/nunito-v10/XRXX3I6Li01BKofIMNaNRs71cA.woff2) format('woff2');
+    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 400;
+    src: local('Nunito Italic'), local('Nunito-Italic'), url(../vendor/fonts/nunito-v10/XRXX3I6Li01BKofIMNaDRs4.woff2) format('woff2');
+    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 600;
+    src: local('Nunito SemiBold Italic'), local('Nunito-SemiBoldItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN5cYtvFUT8_DQ.woff2) format('woff2');
+    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 600;
+    src: local('Nunito SemiBold Italic'), local('Nunito-SemiBoldItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN5cYtvEUT8_DQ.woff2) format('woff2');
+    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 600;
+    src: local('Nunito SemiBold Italic'), local('Nunito-SemiBoldItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN5cYtvKUT8.woff2) format('woff2');
+    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 800;
+    src: local('Nunito ExtraBold Italic'), local('Nunito-ExtraBoldItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN4kYNvFUT8_DQ.woff2) format('woff2');
+    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 800;
+    src: local('Nunito ExtraBold Italic'), local('Nunito-ExtraBoldItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN4kYNvEUT8_DQ.woff2) format('woff2');
+    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: italic;
+    font-weight: 800;
+    src: local('Nunito ExtraBold Italic'), local('Nunito-ExtraBoldItalic'), url(../vendor/fonts/nunito-v10/XRXQ3I6Li01BKofIMN4kYNvKUT8.woff2) format('woff2');
+    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 200;
+    src: local('Nunito ExtraLight'), local('Nunito-ExtraLight'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofA-seUbuvISTs.woff2) format('woff2');
+    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 200;
+    src: local('Nunito ExtraLight'), local('Nunito-ExtraLight'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofA-seUb-vISTs.woff2) format('woff2');
+    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 200;
+    src: local('Nunito ExtraLight'), local('Nunito-ExtraLight'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofA-seUYevI.woff2) format('woff2');
+    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 300;
+    src: local('Nunito Light'), local('Nunito-Light'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofAnsSUbuvISTs.woff2) format('woff2');
+    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 300;
+    src: local('Nunito Light'), local('Nunito-Light'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofAnsSUb-vISTs.woff2) format('woff2');
+    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 300;
+    src: local('Nunito Light'), local('Nunito-Light'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofAnsSUYevI.woff2) format('woff2');
+    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 400;
+    src: local('Nunito Regular'), local('Nunito-Regular'), url(../vendor/fonts/nunito-v10/XRXV3I6Li01BKofIOuaBXso.woff2) format('woff2');
+    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 400;
+    src: local('Nunito Regular'), local('Nunito-Regular'), url(../vendor/fonts/nunito-v10/XRXV3I6Li01BKofIO-aBXso.woff2) format('woff2');
+    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 400;
+    src: local('Nunito Regular'), local('Nunito-Regular'), url(../vendor/fonts/nunito-v10/XRXV3I6Li01BKofINeaB.woff2) format('woff2');
+    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 600;
+    src: local('Nunito SemiBold'), local('Nunito-SemiBold'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofA6sKUbuvISTs.woff2) format('woff2');
+    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 600;
+    src: local('Nunito SemiBold'), local('Nunito-SemiBold'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofA6sKUb-vISTs.woff2) format('woff2');
+    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 600;
+    src: local('Nunito SemiBold'), local('Nunito-SemiBold'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofA6sKUYevI.woff2) format('woff2');
+    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 800;
+    src: local('Nunito ExtraBold'), local('Nunito-ExtraBold'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofAksCUbuvISTs.woff2) format('woff2');
+    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 800;
+    src: local('Nunito ExtraBold'), local('Nunito-ExtraBold'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofAksCUb-vISTs.woff2) format('woff2');
+    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 800;
+    src: local('Nunito ExtraBold'), local('Nunito-ExtraBold'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofAksCUYevI.woff2) format('woff2');
+    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 900;
+    src: local('Nunito Black'), local('Nunito-Black'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofAtsGUbuvISTs.woff2) format('woff2');
+    unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 900;
+    src: local('Nunito Black'), local('Nunito-Black'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofAtsGUb-vISTs.woff2) format('woff2');
+    unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF
+}
+
+@font-face {
+    font-family: Nunito;
+    font-style: normal;
+    font-weight: 900;
+    src: local('Nunito Black'), local('Nunito-Black'), url(../vendor/fonts/nunito-v10/XRXW3I6Li01BKofAtsGUYevI.woff2) format('woff2');
+    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD
+}

+ 271 - 0
resources/assets/vendors/dcat-admin/form.js

@@ -0,0 +1,271 @@
+(function () {
+    /**
+     * 表单提交
+     *
+     * @param opts
+     * @constructor
+     */
+    var $eColumns = {};
+    LA.Form = function (opts) {
+        opts = $.extend({
+            $form: null,
+            errorClass: 'has-error',
+            groupSelector: '.form-group',
+            template: '<label class="control-label" for="inputError"><i class="fa fa-times-circle-o"></i> _message_</label><br/>',
+            disableRedirect: false, //
+            columnSelectors: {}, //
+            disableRemoveError: false,
+            before: function () {},
+            after: function () {},
+        }, opts);
+
+        var originalVals = {},
+            cls = opts.errorClass,
+            groupSlt = opts.groupSelector,
+            tpl = opts.template,
+            $form = opts.$form,
+            tabSelector = '.tab-pane',
+            get_tab_id = function ($c) {
+                return $c.parents(tabSelector).attr('id');
+            },
+            get_tab_title_error = function ($c) {
+                var id = get_tab_id($c);
+                if (!id) return $('<none></none>');
+                return $("[href='#" + id + "'] .text-red");
+            };
+
+        var self = this;
+
+        // 移除错误信息
+        remove_field_error();
+
+        $form.ajaxSubmit({
+            beforeSubmit: function (d, f, o) {
+                if (opts.before(d, f, o, self) === false) {
+                    return false;
+                }
+
+                if (fire(LA._form_.before, d, f, o, self) === false) {
+                    return false;
+                }
+
+                LA.NP.start();
+            },
+            success: function (d) {
+                LA.NP.done();
+
+                if (opts.after(true, d, self) === false) {
+                    return;
+                }
+
+                if (fire(LA._form_.success, d, self) === false) {
+                    return;
+                }
+
+                if (!d.status) {
+                    LA.error(d.message || 'Save failed!');
+                    return;
+                }
+
+                LA.success(d.message || 'Save succeeded!');
+
+                if (opts.disableRedirect || d.redirect === false) return;
+
+                if (d.redirect) {
+                    return LA.reload(d.redirect);
+                }
+
+                history.back(-1);
+            },
+            error: function (v) {
+                LA.NP.done();
+
+                if (opts.after(false, v, self) === false) {
+                    return;
+                }
+
+                if (fire(LA._form_.error, v, self) === false) {
+                    return;
+                }
+
+                try {
+                    var error = JSON.parse(v.responseText), i;
+
+                    if (v.status != 422 || !error || !LA.isset(error, 'errors')) {
+                        return LA.error(v.status + ' ' + v.statusText);
+                    }
+                    error = error.errors;
+
+                    for (i in error) {
+                        // 显示错误信息
+                        $eColumns[i] = show_field_error($form, i, error[i]);
+                    }
+
+                } catch (e) {
+                    return LA.error(v.status + ' ' + v.statusText);
+                }
+            }
+        });
+
+        // 触发钩子事件
+        function fire(evs) {
+            var i, j, r, args = arguments, p = [];
+            delete args[0];
+            args = args || [];
+
+            for (j in args) {
+                p.push(args[j]);
+            }
+
+            for (i in evs) {
+                r = evs[i].apply(evs[i], p);
+
+                if (r === false) return r; // 返回 false 会代码阻止继续执行
+            }
+        }
+
+        // 删除错误有字段的错误信息
+        function remove_field_error() {
+            var i, p, t;
+            for (i in $eColumns) {
+                p = $eColumns[i].parents(groupSlt);
+                p.removeClass(cls);
+                p.find('error').html('');
+
+                t = get_tab_title_error($eColumns[i]);
+                if (!t.hasClass('hide')) {
+                    t.addClass('hide');
+                }
+
+            }
+            // 重置
+            $eColumns = {};
+        }
+
+        // 显示错误信息
+        function show_field_error($form, column, errors) {
+            var $c = get_field_obj($form, column);
+
+            get_tab_title_error($c).removeClass('hide');
+
+            // 保存字段原始数据
+            originalVals[column] = get_val($c);
+
+            if (!$c) {
+                if (LA.len(errors) && errors.length) {
+                    LA.error(errors.join("  \n  "));
+                }
+                return;
+            }
+
+            var p = $c.closest(groupSlt), j;
+
+            p.addClass(cls);
+
+            for (j in errors) {
+                p.find('error').eq(0).append(tpl.replace('_message_', errors[j]));
+            }
+
+            if (!opts.disableRemoveError) {
+                remove_error_when_val_changed($c, column);
+            }
+
+            return $c;
+        }
+
+        // 获取字段对象
+        function get_field_obj($form, column) {
+            if (column.indexOf('.') != -1) {
+                column = column.split('.');
+                var first = column.shift(), i, sub = '';
+                for (i in column) {
+                    sub += '[' + column[i] + ']';
+                }
+                column = first + sub;
+            }
+
+            var $c = $form.find('[name="' + column + '"]');
+
+            if (!$c.length) $c = $form.find('[name="' + column + '[]"]');
+
+            if (!$c.length) {
+                $c = $form.find('[name="' + column.replace(/start$/, '') + '"]');
+            }
+            if (!$c.length) {
+                $c = $form.find('[name="' + column.replace(/end$/, '') + '"]');
+            }
+
+            if (!$c.length) {
+                $c = $form.find('[name="' + column.replace(/start\]$/, ']') + '"]');
+            }
+            if (!$c.length) {
+                $c = $form.find('[name="' + column.replace(/end\]$/, ']') + '"]');
+            }
+
+            return $c;
+        }
+
+        // 获取字段值
+        function get_val($c) {
+            var vals = [],
+                t = $c.attr('type'),
+                cked = t === 'checkbox' || t === 'radio',
+                i;
+
+            for (i = 0; i < $c.length; i++) {
+                if (cked) {
+                    vals.push($($c[i]).prop('checked'));
+                    continue;
+                }
+                vals.push($($c[i]).val());
+            }
+
+            return vals;
+        }
+
+        // 当字段值变化时移除错误信息
+        function remove_error_when_val_changed($c, column) {
+            var p = $c.parents(groupSlt);
+
+            $c.one('change', rm);
+            $c.off('blur', rm).on('blur', function () {
+                if (val_changed()) rm();
+            });
+
+            // 表单值发生变化就移除错误信息
+            function autorm() {
+                setTimeout(function () {
+                    if (!$c.length) return;
+                    if (val_changed()) return rm();
+
+                    autorm();
+                }, 500);
+            }
+
+            autorm();
+
+            // 判断值是否改变
+            function val_changed() {
+                return !LA.arr.equal(originalVals[column], get_val($c));
+            }
+
+            function rm() {
+                p.removeClass(cls);
+                p.find('error').html('');
+
+                // tab页下没有错误信息了,隐藏title的错误图标
+                var id = get_tab_id($c), t;
+                if (id && !$('#'+id).find('.'+cls).length) {
+                    t = get_tab_title_error($c);
+                    if (!t.hasClass('hide')) {
+                        t.addClass('hide');
+                    }
+
+                }
+                delete $eColumns[column];
+            }
+
+        }
+
+    };
+})();

+ 333 - 0
resources/assets/vendors/dcat-admin/grid-extend.js

@@ -0,0 +1,333 @@
+(function (w, $) {
+    function Tree(opts) {
+        this.options = $.extend({
+            button: null,
+            table: null,
+            url: '',
+            perPage: '',
+            showNextPage: '',
+            pageQueryName: '',
+            parentIdQueryName: '',
+            tierQueryName: '',
+            showIcon: 'fa-angle-right',
+            hideIcon: 'fa-angle-down',
+            loadMoreText: '<svg style="fill:currentColor" t="1582877365167" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="32874" width="24" height="24"><path d="M162.8 515m-98.3 0a98.3 98.3 0 1 0 196.6 0 98.3 98.3 0 1 0-196.6 0Z" p-id="32875"></path><path d="M511.9 515m-98.3 0a98.3 98.3 0 1 0 196.6 0 98.3 98.3 0 1 0-196.6 0Z" p-id="32876"></path><path d="M762.8 515a98.3 98.3 0 1 0 196.6 0 98.3 98.3 0 1 0-196.6 0Z" p-id="32877"></path></svg>',
+        }, opts);
+
+        this.key = this.tier = this.row = this.data = this._req = null;
+
+        this._init();
+    }
+
+    Tree.prototype = {
+        _init: function () {
+            this._bindClick();
+        },
+
+        _bindClick: function () {
+            var _this = this,
+                opts = _this.options;
+
+            $(opts.button).off('click').click(function () {
+                if (_this._req) {
+                    return;
+                }
+
+                var $this = $(this),
+                    _i = $("i", this),
+                    shown = _i.hasClass(opts.showIcon);
+
+                _this.key = $this.data('key');
+                _this.tier = $this.data('tier');
+                _this.row = $this.closest('tr');
+
+                if ($this.data('inserted') == '0') {
+                    _this._request(1);
+                    $this.data('inserted', 1);
+                }
+
+                _i.toggleClass(opts.showIcon + ' ' + opts.hideIcon);
+
+                var children = [];
+
+                getChildren(_this.row.nextAll(), _this.row).forEach(function (v) {
+                    if (getTier(v) !== (_this.tier + 1)) {
+                        return;
+                    }
+
+                    children.push(v);
+
+                    shown ? $(v).show() : $(v).hide();
+                });
+
+                children.forEach(function (v) {
+                    if (shown) {
+                        return
+                    }
+
+                    var icon = $(v).find('a[data-tier=' + getTier(v) + '] i');
+
+                    if (icon.hasClass(opts.hideIcon)) {
+                        icon.parent().click();
+                    }
+                })
+            })
+        },
+
+        _request: function (page, after) {
+            var _this = this,
+                row = _this.row,
+                key = _this.key,
+                tier = _this.tier,
+                tableSelector = _this.options.table;
+
+            if (_this._req) {
+                return;
+            }
+            _this._req = 1;
+            LA.loading();
+
+            var data = {
+                _token: LA.token,
+            };
+
+            data[_this.options.parentIdQueryName] = key;
+            data[_this.options.tierQueryName] = tier + 1;
+            data[_this.options.pageQueryName.replace(':key', key)] = page;
+
+            $.ajax({
+                url: _this.options.url,
+                type: 'GET',
+                data: data,
+                headers: {'X-PJAX': true},
+                success: function (resp) {
+                    after && after();
+                    LA.loading(false);
+                    _this._req = 0;
+
+                    // 获取最后一行
+                    var children = getChildren(row.nextAll(), row);
+                    row = children.length ? $(children.pop()) : row;
+
+                    var _body = $('<div>'+resp+'</div>'),
+                        _tbody = _body.find(tableSelector + ' tbody'),
+                        lastPage = _body.find('last-page').text(),
+                        nextPage = _body.find('next-page').text();
+
+                    // 标记子节点行
+                    _tbody.find('tr').each(function (_, v) {
+                        $(v).attr('data-tier', tier + 1)
+                    });
+
+                    if (
+                        _this.options.showNextPage
+                        && _tbody.find('tr').length == _this.options.perPage
+                        && lastPage >= page
+                    ) {
+                        // 加载更多
+                        var loadMore = $("<tr data-tier='" + (tier + 1) + "' data-page='" + nextPage
+                            + "'><td colspan='"+(row.find('td').length)
+                            + "' align='center' style='cursor: pointer'> <a>" + _this.options.loadMoreText + "</a> </td></tr>");
+
+                        row.after(loadMore);
+
+                        // 加载更多
+                        loadMore.click(function () {
+                            var _t = $(this);
+                            _this._request(_t.data('page'), function () {
+                                _t.remove();
+                            });
+                        });
+                    }
+
+                    // 附加子节点
+                    row.after(_tbody.html());
+
+                    // 附加子节点js脚本以及触发子节点js脚本执行
+                    _body.find('script').each(function (_, v) {
+                        row.after(v);
+                    });
+                    $(document).trigger('pjax:script')
+                },
+                error:function(a, b, c){
+                    after && after();
+                    LA.loading(false);
+                    _this._req = 0;
+                    if (a.status != 404) {
+                        LA.ajaxError(a, b, c);
+                    }
+                }
+            });
+        }
+    };
+
+    function Orderable(opts) {
+        this.options = $.extend({
+            button: null,
+            url: '',
+        }, opts);
+
+        this.direction = this.key = this.tier = this.row = this._req = null;
+
+        this._init();
+    }
+
+    Orderable.prototype = {
+        _init: function () {
+            this._bindClick()
+        },
+
+        _bindClick: function () {
+            var _this = this;
+
+            $(_this.options.button).off('click').click(function () {
+                if (_this._req) {
+                    return;
+                }
+
+                _this._req = 1;
+                LA.loading();
+
+                var $this = $(this);
+
+                _this.key = $this.data('id');
+                _this.direction = $this.data('direction');
+                _this.row = $this.closest('tr');
+                _this.tier = getTier(_this.row);
+
+                _this._request();
+            })
+        },
+
+        _request: function () {
+            var _this = this,
+                key = _this.key,
+                row = _this.row,
+                tier = _this.tier,
+                direction = _this.direction,
+                prevAll = row.prevAll(),
+                nextAll = row.nextAll(),
+                prev = row.prevAll('tr').first(),
+                next = row.nextAll('tr').first();
+
+            $.ajax({
+                type: 'POST',
+                url: _this.options.url.replace(':key', key),
+                data: {_method:'PUT', _token:LA.token, _orderable:direction},
+                success: function(data){
+                    LA.loading(false);
+                    _this._req = 0;
+                    if (! data.status) {
+                        return data.message && LA.warning(data.message, 'rt');
+                    }
+
+                    LA.success(data.message);
+
+                    if (direction) {
+                        var prevRow = sibling(prevAll, tier);
+                        if (swapable(prevRow, tier) && prev.length && getTier(prev) >= tier) {
+                            prevRow.before(row);
+
+                            // 把所有子节点上移
+                            getChildren(nextAll, row).forEach(function (v) {
+                                prevRow.before(v)
+                            });
+                        }
+                    } else {
+                        var nextRow = sibling(nextAll, tier),
+                            nextRowChildren = nextRow ? getChildren(nextRow.nextAll(), nextRow) : [];
+
+                        if (swapable(nextRow, tier) && next.length && getTier(next) >= tier) {
+                            nextAll = row.nextAll();
+
+                            if (nextRowChildren.length) {
+                                nextRow = $(nextRowChildren.pop())
+                            }
+
+                            // 把所有子节点下移
+                            var all = [];
+                            getChildren(nextAll, row).forEach(function (v) {
+                                all.unshift(v)
+                            });
+
+                            all.forEach(function(v) {
+                                nextRow.after(v)
+                            });
+
+                            nextRow.after(row);
+                        }
+                    }
+                },
+                error: function (a, b, c) {
+                    _this._req = 0;
+                    LA.loading(false);
+                    LA.ajaxError(a, b, c)
+                }
+            });
+        },
+    };
+
+    function isTr(v) {
+        return $(v).prop('tagName').toLocaleLowerCase() === 'tr'
+    }
+
+    function getTier(v) {
+        return parseInt($(v).data('tier') || 0);
+    }
+
+    function isChildren(parent, child) {
+        return getTier(child) > getTier(parent);
+    }
+
+    function getChildren(all, parent) {
+        var arr = [], isBreak = false, firstTr;
+        all.each(function (_, v) {
+            // 过滤非tr标签
+            if (! isTr(v) || isBreak) return;
+
+            firstTr || (firstTr = $(v));
+
+            // 非连续的子节点
+            if (firstTr && ! isChildren(parent, firstTr)) {
+                return;
+            }
+
+            if (isChildren(parent, v)) {
+                arr.push(v)
+            } else {
+                isBreak = true;
+            }
+        });
+
+        return arr;
+    }
+
+    function swapable(_o, tier) {
+        if (
+            _o
+            && _o.length
+            && tier === getTier(_o)
+        ) {
+            return true
+        }
+    }
+
+    function sibling(all, tier) {
+        var next;
+
+        all.each(function (_, v) {
+            if (getTier(v) === tier && ! next && isTr(v)) {
+                next = $(v);
+            }
+        });
+
+        return next;
+    }
+
+    w.LA.grid.tree = function (opts) {
+        return new Tree(opts);
+    };
+    w.LA.grid.orderable = function (opts) {
+        return new Orderable(opts);
+    };
+})(window, $);

File diff suppressed because it is too large
+ 0 - 0
resources/assets/vendors/dcat-admin/grid-extend.min.js


File diff suppressed because it is too large
+ 1 - 0
resources/assets/vendors/dcat-admin/icons.css


+ 101 - 0
resources/assets/vendors/dcat-admin/loader.js

@@ -0,0 +1,101 @@
+(function () {
+    var tpl = '<div class="_loading_ flex items-center justify-center pin" style="{style}">{svg}</div>',
+        loading = '._loading_',
+        LOADING_SVG = [
+            '<svg width="{width}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" class="lds-disk" style="background: none;"><g transform="translate(50,50)"><g ng-attr-transform="scale({{config.scale}})" transform="scale(0.5)"><circle cx="0" cy="0" r="50" ng-attr-fill="{{config.c1}}" fill="{color}"></circle><circle cx="0" ng-attr-cy="{{config.cy}}" ng-attr-r="{{config.r}}" ng-attr-fill="{{config.c2}}" cy="-35" r="15" fill="#ffffff" transform="rotate(101.708)"><animateTransform attributeName="transform" type="rotate" calcMode="linear" values="0 0 0;360 0 0" keyTimes="0;1" dur="1s" begin="0s" repeatCount="indefinite"></animateTransform></circle></g></g></svg>',
+            '<svg xmlns="http://www.w3.org/2000/svg" class="mx-auto block" style="width:{width};{svg_style}" viewBox="0 0 120 30" fill="{color}"><circle cx="15" cy="15" r="15"><animate attributeName="r" from="15" to="15" begin="0s" dur="0.8s" values="15;9;15" calcMode="linear" repeatCount="indefinite"/><animate attributeName="fill-opacity" from="1" to="1" begin="0s" dur="0.8s" values="1;.5;1" calcMode="linear" repeatCount="indefinite" /></circle><circle cx="60" cy="15" r="9" fill-opacity="0.3"><animate attributeName="r" from="9" to="9" begin="0s" dur="0.8s" values="9;15;9" calcMode="linear" repeatCount="indefinite" /><animate attributeName="fill-opacity" from="0.5" to="0.5" begin="0s" dur="0.8s" values=".5;1;.5" calcMode="linear" repeatCount="indefinite" /></circle><circle cx="105" cy="15" r="15"><animate attributeName="r" from="15" to="15" begin="0s" dur="0.8s" values="15;9;15" calcMode="linear" repeatCount="indefinite" /><animate attributeName="fill-opacity" from="1" to="1" begin="0s" dur="0.8s" values="1;.5;1" calcMode="linear" repeatCount="indefinite" /></circle></svg>',
+        ];
+
+    /**
+     * Loading
+     *
+     * @param opts
+     * @constructor
+     */
+    function Loader(opts) {
+        var defStyle = 'position:absolute;left:10px;right:10px;', content, $container;
+
+        opts = $.extend({
+            container: '#pjax-container',
+            z_index: 100,
+            width: '50px',
+            color: '#84bdea',
+            bg: '#fff',
+            style: '',
+            svg: LOADING_SVG[0]
+        }, opts);
+
+        $container = opts.container;
+        $container = $container == 'object' ? $container : $($container);
+
+        content = $(
+            tpl
+                .replace('{svg}', opts.svg)
+                .replace('{color}', opts.color)
+                .replace('{color}', opts.color)
+                .replace('{width}', opts.width)
+                .replace('{style}', defStyle + 'background:' + opts.bg + ';' + 'z-index:' + opts.z_index + ';' + opts.style)
+        );
+        content.appendTo($container);
+
+        this.remove = function () {
+            $container.find(loading).remove();
+        };
+    }
+
+    Loader.destroyAll = function () {
+        $(loading).remove();
+    };
+
+    LA.Loader = Loader;
+
+    // 全屏居中loading
+    LA.loading = function (opts) {
+        if (opts === false) {
+            // 关闭loading
+            return setTimeout(LA.Loader.destroyAll, 70);
+        }
+        // 配置参数
+        opts = $.extend({
+            color: '#62abe4',
+            z_index: 999991014,
+            width: '58px',
+            shade: 'rgba(255, 255, 255, 0.02)',
+            top: 200,
+            svg: LOADING_SVG[1],
+        }, opts);
+
+        var win = $(window),
+            // 容器
+            $container = $('<div class="_loading_" type="loading" times="1" showtime="0" contype="string" style="z-index:'+opts.z_index+';width:300px;position:fixed"></div>'),
+            // 遮罩层直接沿用layer
+            shadow = $('<div class="layui-layer-shade _loading_" style="z-index:'+(opts.z_index-2)+'; background-color:'+opts.shade+'"></div>');
+        $container.appendTo('body');
+        if (opts.shade) {
+            shadow.appendTo('body');
+        }
+
+        function resize() {
+            $container.css({
+                left: (win.width() - 300)/2,
+                top: (win.height() - opts.top)/2
+            });
+        }
+        // 自适应窗口大小
+        win.on('resize', resize);
+        resize();
+
+        $container.loading(opts);
+    };
+
+    $.fn.loading = function (opt) {
+        if (opt === false) {
+            return $(this).find(loading).remove();
+        }
+
+        opt = opt || {};
+        opt.container = $(this);
+
+        return new Loader(opt);
+    };
+})();

File diff suppressed because it is too large
+ 2368 - 0
resources/assets/vendors/dcat-admin/main.css


File diff suppressed because it is too large
+ 4 - 0
resources/assets/vendors/dcat-admin/main.js


File diff suppressed because it is too large
+ 0 - 0
resources/assets/vendors/dcat-admin/main.min.css


File diff suppressed because it is too large
+ 4 - 0
resources/assets/vendors/dcat-admin/main.min.js


+ 1 - 0
resources/assets/vendors/dcat-admin/markdown.css

@@ -0,0 +1 @@
+.editormd-html-preview code,.editormd-preview-container code{font-size:13px !important;font-family:"Inconsolata","Fira Mono",Consolas,"Liberation Mono",Menlo,Courier,monospace !important;word-wrap:break-word !important;}.markdown-body pre code{box-shadow:none;}.com{color:#93939e !important;}.tag,.typ{color:#DA564A !important;}.opn{color:#93A1A1 !important;}.clo{color:#93A1A1 !important;}.atn,.lit{color:#007ee5 !important;}.atv{color:#fc8bb3 !important;}.dec{color:teal !important;}.var{color:teal !important;}.fun{color:#DC322F !important;}pre.prettyprint{padding:10px;border:1px solid #E1E1E8 !important;tab-size:4 !important;}pre.prettyprint.linenums{box-shadow:40px 0 0 rgba(238,238,238,0.35) inset,41px 0 0 rgba(238,238,238,0.35) inset !important;}pre.prettyprint.linenums ol.linenums{color:#1E347B !important;padding-left:30px !important;margin-top:0 !important;margin-bottom:0}pre.prettyprint.linenums ol.linenums li{color:#BEBEC5 !important;line-height:18px !important;padding-left:12px !important;background:#F8F8F8;!important}pre.prettyprint.linenums ol.linenums li.L0,pre.prettyprint.linenums ol.linenums li.L1,pre.prettyprint.linenums ol.linenums li.L2,pre.prettyprint.linenums ol.linenums li.L3,pre.prettyprint.linenums ol.linenums li.L4,pre.prettyprint.linenums ol.linenums li.L5,pre.prettyprint.linenums ol.linenums li.L6,pre.prettyprint.linenums ol.linenums li.L7,pre.prettyprint.linenums ol.linenums li.L8,pre.prettyprint.linenums ol.linenums li.L9{list-style-type:decimal !important}pre.prettyprint{background:#F8F8F8 !important;width:100%;border:0!important;}.pln{color:#444 !important;}.kwd{color:#07a !important;font-weight:bold;}.pun{color:#999 !important;}.str{color:#2E7D32 !important;}pre.prettyprint{background-color:rgba(238,238,238,0.35);!important;border:0 solid #333}.editormd-html-preview,.editormd-preview-container{padding:0}

+ 173 - 0
resources/assets/vendors/dcat-admin/modal-form.js

@@ -0,0 +1,173 @@
+(function (w) {
+    /**
+     * 表单弹窗
+     * @param opt
+     * @constructor
+     */
+    LA.ModalForm = function (opt) {
+        var number = 1,
+            defUrl = opt.defaultUrl,
+            btn = opt.buttonSelector,
+            area = opt.area,
+            title = opt.title,
+            lang = {
+                submit: opt.lang.submit,
+                reset: opt.lang.reset,
+                save_failed: opt.lang.save_failed,
+            },
+            nullFun = function (a, b) {},
+            handlers = {
+                saved: opt.saved || nullFun,
+                success: opt.success || nullFun,
+                error: opt.error || nullFun
+            },
+            lay = w.layer,
+            forceRefresh = opt.forceRefresh,
+            disableReset = opt.disableReset,
+            idx = {},
+            $layWin = {},
+            queryString = opt.query,
+            building,
+            submitting,
+            $btn;
+
+        (!btn) || $(btn).off('click').click(function () {
+            var t = $(this), num = t.attr('number'), url;
+            $btn = t;
+            if (!num) {
+                num = number;
+                t.attr('number', number);
+                number++;
+            }
+
+            url = t.data('url') || defUrl;  // 给弹窗页面链接追加参数
+            if (url.indexOf('?') == -1) {
+                url += '?'+queryString+'=1'
+            } else if (url.indexOf(queryString) == -1) {
+                url += '&'+queryString+'=1'
+            }
+            build(url, num);
+        });
+        btn || setTimeout(function () {
+            build(defUrl, number)
+        }, 400);
+
+        // 开始构建弹窗
+        function build(url, num) {
+            if (!url || building) return;
+            if ($layWin[num]) { // 阻止同个类型的弹窗弹出多个
+                $layWin[num].show();
+                try { lay.restore(idx[num]); } catch (e) {}
+                return;
+            }
+            $(w.document).one('pjax:complete', function () { // 跳转新页面时移除弹窗
+                rm(num);
+            });
+
+            building = 1;
+            (!$btn) || $btn.button('loading');
+
+            $.get(url, function (tpl) {
+                building = 0;
+                if ($btn) {
+                    $btn.button('reset');
+                    setTimeout(function () {
+                        $btn.find('.waves-ripple').remove();
+                    }, 50);
+                }
+                popup(tpl, num);
+            });
+        }
+
+        // 弹出弹窗
+        function popup(tpl, num) {
+            tpl = LA.AssetsLoader.filterScriptAndAutoLoad(tpl).render();
+            var t = $(tpl), $form, btns = [lang.submit], opts = {
+                type: 1,
+                area: formatArea(area),
+                content: tpl,
+                title: title,
+                yes: submit,
+                cancel: function () {
+                    if (forceRefresh) { // 是否强制刷新
+                        $layWin[num] = idx[num] = null;
+                    } else {
+                        $layWin[num].hide();
+                        return false;
+                    }
+                }
+            };
+
+            if (!disableReset) {
+                btns.push(lang.reset);
+
+                opts.btn2 = function () { // 重置按钮
+                    $form = $form || $('#'+t.find('form').attr('id'));
+                    $form.trigger('reset');
+                    return false;
+                };
+            }
+
+            opts.btn = btns;
+
+            idx[num] = lay.open(opts);
+            $layWin[num] = w.$('#layui-layer' + idx[num]);
+
+            // 提交表单
+            function submit () {
+                if (submitting) return;
+                $form = $form || w.$('#'+t.find('form').attr('id'));  // 此处必须重新创建jq对象,否则无法操作页面元素
+
+                LA.Form({
+                    $form: $form,
+                    disableRedirect: true,
+                    before: function () {
+                        $form.validator('validate');
+
+                        if ($form.find('.has-error').length > 0) {
+                            return false;
+                        }
+
+                        submitting = 1;
+
+                        $layWin[num].find('.layui-layer-btn0').button('loading');
+                    },
+                    after: function (success, res) {
+                        $layWin[num].find('.layui-layer-btn0').button('reset');
+                        submitting = 0;
+
+                        handlers.saved(success, res);
+
+                        if (!success) {
+                            return handlers.error(success, res);
+                        }
+                        if (res.status) {
+                            handlers.success(success, res);
+                            rm(num);
+                            return;
+                        }
+
+                        handlers.error(success, res);
+                        LA.error(res.message || lang.save_failed);
+                    }
+                });
+
+            }
+        }
+
+        function formatArea(area) {
+            if (w.screen.width <= 800) {
+                return ['100%', '100%'];
+            }
+
+            return area;
+        }
+
+        // 移除弹窗
+        function rm(num) {
+            lay.close(idx[num]);
+            $layWin[num] && $layWin[num].remove();
+            $layWin[num] = null;
+        }
+    };
+})(top || window);

+ 80 - 0
resources/assets/vendors/dcat-admin/row-selector.js

@@ -0,0 +1,80 @@
+/**
+ * 行选择器
+ *
+ * @constructor
+ */
+LA.RowSelector = function RowSelector(opts) {
+    opts = $.extend({
+        checkbox: '', // checkbox css选择器
+        selectAll: '', // 全选checkbox css选择器
+        bg: 'rgba(255, 255,213,0.4)', // 选中效果颜色
+        clickTr: false, // 点击行事件
+    }, opts);
+
+    var checkboxSelector = opts.checkbox,
+        selectAllSelector = opts.selectAll,
+        $ckb = $(checkboxSelector);
+
+    $(selectAllSelector).on('change', function() {
+        var cbx = $(checkboxSelector);
+
+        for (var i = 0; i < cbx.length; i++) {
+            if (this.checked && !cbx[i].checked) {
+                cbx[i].click();
+            } else if (!this.checked && cbx[i].checked) {
+                cbx[i].click();
+            }
+        }
+    });
+    if (opts.clickTr) {
+        $ckb.click(function (e) {
+            if (typeof e.cancelBubble != "undefined") {
+                e.cancelBubble = true;
+            }
+            if (typeof e.stopPropagation != "undefined") {
+                e.stopPropagation();
+            }
+        }).parents('tr').click(function (e) {
+            $(this).find(checkboxSelector).click();
+        });
+    }
+
+    $ckb.on('change', function () {
+        var tr = $(this).closest('tr');
+        if (this.checked) {
+            tr.css('background-color', opts.bg);
+        } else {
+            tr.css('background-color', '');
+        }
+    });
+
+    this.getIds = function () {
+        var selected = [];
+        $(checkboxSelector+':checked').each(function() {
+            var id = $(this).data('id');
+            if (selected.indexOf(id) === -1) {
+                selected.push(id);
+            }
+        });
+
+        return selected;
+    };
+    this.getRows = function () {
+        var selected = [];
+        $(checkboxSelector+':checked').each(function() {
+            var id = $(this).data('id'), i, exist;
+
+            for (i in selected) {
+                if (selected[i].id === id) {
+                    exist = true
+                }
+            }
+
+            exist || selected.push({'id': id, 'label': $(this).data('label')})
+        });
+
+        return selected;
+    };
+
+    return this;
+};

+ 360 - 0
resources/assets/vendors/dcat-admin/select-resource.js

@@ -0,0 +1,360 @@
+(function (w) {
+    var NONE = '';
+
+    function ResourceSelector(options) {
+        options = $.extend({
+            title: '选择', // 弹窗标题
+            selector: '', // 选择按钮选择器
+            column: '', // 字段名称
+            source: '', // 资源地址
+            maxItem: 1, // 最大选项数量,0为不限制
+            area: ['80%', '90%'],
+            items: {}, // 默认选中项,key => value 键值对
+            placeholder: '', // input placeholder
+            showCloseButton: false,
+            closeButtonText: '关闭',
+            exceedMaxItemTip: '您已超出最大可选择的数量',
+            selectedOptionsTip: '已选中:num个选项',
+            $displayerContainer: null, // 选项展示容器dom对象
+            $hiddenInput: null, // 隐藏表单dom对象
+            displayer: null, // 自定义选中项渲染方法
+            disabled: false,
+            clearAllClass: '',
+            clearOneClass: '',
+            window: null,
+        }, options);
+
+        options.window = options.window || (top || w);
+
+        var self = ResourceSelector,
+            column = options.column,
+            cls = column.replace(/[\[\]]*/g, '') + (Math.random().toString(36).substr(2)),
+            layer = options.window.layer,
+            $input = options.$displayerContainer || $(options.selector).parents('.select-resource').find('div[name="' + column + '"]'),
+            $hidden = options.$hiddenInput || $('input[name="' + column + '"]'),
+            tagClearClass = options.clearOneClass || (cls + '-tag-clear-button'),
+            clearClass = options.clearAllClass || (cls + '-clear-button'),
+            maxItem = options.maxItem,
+            originalItems = options.items,
+            iframeWin,
+            layerIdx,
+            $layerWin;
+
+        options.clearOneClass = tagClearClass;
+        options.clearAllClass = clearClass;
+
+        $(options.selector).click(function () {
+            if (options.disabled) return;
+            if (layerIdx) {
+                $layerWin.show();
+                click_checked_items();
+                return;
+            }
+            $(document).one('pjax:complete', function () {// 跳转新页面时移除弹窗
+                layer.close(layerIdx);
+                $layerWin.remove();
+                layerIdx = $layerWin = null;
+            });
+
+            layerIdx = layer.open({
+                type: 2,
+                title: options.title,
+                shadeClose: true,
+                maxmin: false,
+                shade: false,
+                skin: 'select-resource',
+                area: format_area(options.area),
+                content: options.source + '?_mini=1',
+                btn: options.showCloseButton ? [options.closeButtonText] : null,
+                success: function (layero) {
+                    iframeWin = options.window[layero.find('iframe')[0]['name']];
+
+                    // 绑定勾选默认选项事件
+                    bind_checked_default_event(iframeWin);
+                },
+                yes: function () {
+                    $layerWin.hide();
+                    return false;
+                },
+                cancel: function () {
+                    $layerWin.hide();
+                    return false;
+                }
+            });
+
+            $layerWin = options.window.$('#layui-layer' + layerIdx);
+
+        });
+
+        /**
+         * 多选
+         */
+        function multiple_select($this) {
+            var id =  $this.data('id'),
+                label = $this.data('label') || id,
+                exist = LA.isset(originalItems, id);
+
+            if ($this.prop('checked')) {
+                if (!exist) {
+                    originalItems[id] = label;
+                }
+            } else if (exist) {
+                delete originalItems[id];
+            }
+
+            if (maxItem > 0 && LA.len(originalItems) > maxItem) {
+                unchecked($this);
+                delete originalItems[id];
+                // 多选项判断最大长度
+                return LA.warning(options.exceedMaxItemTip);
+            }
+
+            render_tags(originalItems);
+        }
+
+        // 单选
+        function select($this) {
+            var id =  $this.data('id'),
+                label = $this.data('label') || id;
+
+            get_all_ckb().each(function () {
+                if ($(this).data('id') != id) {
+                    unchecked($(this));
+                }
+            });
+
+            originalItems = {};
+
+            if ($this.prop('checked')) {
+                originalItems[id] = label;
+            }
+
+            render_tags(originalItems);
+        }
+
+        /**
+         * 显示选项内容
+         *
+         * @param items
+         */
+        function render_tags(items) {
+            var ids = [];
+            for (var id in items) {
+                ids.push(id);
+            }
+
+            // 显示勾选的选项内容
+            display_input_div(items);
+            set_selected_id(ids);
+
+            // 绑定清除事件
+            $('.' + clearClass).click(clear_all_tags);
+            $('.' + tagClearClass).click(clear_tag);
+        }
+
+        function set_selected_id(ids) {
+            $hidden.val(ids.length ? ids.join(',') : NONE);
+        }
+
+        /**
+         * 显示勾选的选项内容
+         */
+        function display_input_div(tag) {
+            if (options.displayer) {
+                if (typeof options.displayer == 'string' && LA.isset(self.displayers, options.displayer)) {
+                    return self.displayers[options.displayer](tag, $input, options);
+                }
+
+                // 自定义选中内容渲染
+                return options.displayer(tag, $input, options);
+            }
+
+            return self.displayers.default(tag, $input, options);
+        }
+
+        function bind_checked_default_event(iframeWin) {
+            LA.ready(function () {
+                click_checked_items();
+                get_all_ckb().change(function () {
+                    if (maxItem == 1) {
+                        select($(this));
+                    } else {
+                        multiple_select($(this));
+                    }
+                });
+                if (maxItem == 1) {
+                    // 单选模式禁用全选按钮
+                    $(layer.getChildFrame('.checkbox-grid .select-all', layerIdx)).click(function () {
+                        return false;
+                    });
+                }
+            }, iframeWin);
+        }
+
+        function unchecked($ckb) {
+            $ckb.parents('tr').css('background-color', 'transparent');
+            $ckb.prop('checked', false);
+        }
+
+        // 勾选默认选项
+        function click_checked_items() {
+            setTimeout(function () {
+                var ckb = layer.getChildFrame('tbody .checkbox-grid input[type="checkbox"]:checked', layerIdx);
+                unchecked(ckb);
+
+                for (var id in originalItems) {
+                    layer.getChildFrame('.checkbox-grid input[data-id="'+id+'"]', layerIdx).click();
+                }
+            }, 10);
+        }
+
+        function get_all_ckb() {
+            return $(layer.getChildFrame('.checkbox-grid input[type="checkbox"]:not(.select-all)', layerIdx));
+        }
+
+        /**
+         * 清除所有选项
+         */
+        function clear_tag() {
+            delete originalItems[$(this).data('id')];
+
+            render_tags(originalItems);
+        }
+
+        /**
+         * 清除所有选项
+         */
+        function clear_all_tags() {
+            originalItems = {};
+
+            render_tags(originalItems);
+        }
+
+        function format_area(area) {
+            if (w.screen.width <= 750) {
+                return ['100%', '100%'];
+            }
+
+            return area;
+        }
+
+        render_tags(originalItems);
+    }
+
+    ResourceSelector.displayers = {
+        default: function (tag, $input, opts) {
+            var place = '<span class="default-text" style="opacity:0.75">' + (opts.placeholder || $input.attr('placeholder')) + '</span>',
+                maxItem = opts.maxItem;
+            function _init() {
+                if (!LA.len(tag)) {
+                    return $input.html(place);
+                }
+                if (maxItem == 1) {
+                    return $input.html(build_one(tag[Object.keys(tag)[0]]));
+                }
+
+                $input.html(build_many(tag));
+            }
+
+
+            function build_many(tag) {
+                var html = [];
+
+                for (var i in tag) {
+                    if (maxItem > 2 || !maxItem) {
+                        var strVar = "";
+                        strVar += "<li class=\"select2-selection__choice\" >";
+                        strVar += tag[i] + " <span data-id=\"" + i + "\" class=\"select2-selection__choice__remove ";
+                        strVar += opts.clearOneClass +"\" role=\"presentation\"> ×</span>";
+                        strVar += "</li>";
+
+                        html.push(strVar);
+
+                    } else {
+                        html.push(
+                            "<a class='label label-primary'>" + tag[i] + " " +
+                            "<span data-id=" + i + " class='" + opts.clearOneClass +
+                            "' style='font-weight:bold;cursor:pointer;font-size:14px'>×</span></a>"
+                        )
+                    }
+                }
+                if (!(maxItem > 2 || !maxItem)) {
+                    return build_one(html.join('&nbsp;'));
+                }
+
+                html.unshift('<span class="select2-selection__clear '+opts.clearAllClass+'">×</span>');
+
+                html = '<ul class="select2-selection__rendered">' + html.join('') + '</ul>';
+
+                return html;
+
+            }
+
+            /**
+             * 单个选项样式
+             *
+             * @param tag
+             * @returns {string}
+             */
+            function build_one(tag) {
+                var clearButton = "<div class='pull-right "+opts.clearAllClass+"' style='font-weight:bold;cursor:pointer'>×</div>";
+
+                return ""+tag+""+clearButton;
+            }
+
+            _init();
+        },
+
+        // list模式
+        navList: function (tag, $input, opts) {
+            var place = '<span style="opacity:0.75">' + (opts.placeholder || $input.attr('placeholder')) + '</span>',
+                maxItem = opts.maxItem;
+
+            function _init() {
+                var $app = $(opts.selector).parents('.select-resource').find('app');
+                $app.html('');
+
+                if (!LA.len(tag)) {
+                    return $input.html(place);
+                }
+                if (maxItem == 1) {
+                    return $input.html(build_one(tag[Object.keys(tag)[0]]));
+                }
+
+                $input.html(build_one(opts.selectedOptionsTip.replace(':num', LA.len(tag))));
+
+                $app.html(build_many(tag));
+            }
+
+            function build_many(tag) {
+                var html = [];
+
+                for (var i in tag) {
+                    var strVar = "";
+                    strVar += "<li>";
+                    strVar += "<a class='pull-left'>" + tag[i] + "</a><a data-id='" + i + "' class='pull-right red ";
+                    strVar += opts.clearOneClass +"' ><i class='fa fa-close'></i></a>";
+                    strVar += "<span class='clearfix'></span></li>";
+
+                    html.push(strVar);
+                }
+
+                html = '<ul class="nav nav-pills nav-stacked" >' + html.join('') + '</ul>';
+
+                return html;
+
+            }
+
+            function build_one(tag) {
+                var clearButton = "<div class='pull-right "+opts.clearAllClass+"' style='font-weight:bold;cursor:pointer'>×</div>";
+
+                return ""+tag+""+clearButton;
+            }
+
+            _init();
+        }
+    };
+
+    LA.ResourceSelector = ResourceSelector;
+
+})(window);

File diff suppressed because it is too large
+ 0 - 0
resources/assets/vendors/dcat-admin/select-resource.min.js


+ 242 - 0
resources/assets/vendors/dcat-admin/slider.js

@@ -0,0 +1,242 @@
+
+(function ($) {
+    function Slider(cnf) {
+        this.opts = {
+            direction: cnf.direction || "left",
+            width: cnf.width || null,
+            height: cnf.height || null,
+            dom: $(cnf.dom),
+            time: cnf.time || null,
+            shade: cnf.shade,
+            closeShade: (typeof cnf.closeShade == 'undefined') ? true : cnf.closeShade,
+            callback: cnf.callback || null,
+            background: cnf.background || null,
+            top: cnf.top || null,
+            right: cnf.right || null,
+            bottom: cnf.bottom || null,
+            left: cnf.left || null,
+            zIndex: cnf.zIndex || 97,
+            hasTopNavbar: (typeof cnf.hasTopNavbar == 'undefined') ? true : cnf.hasTopNavbar,
+        };
+        this.id = this.randomString();
+        this.dom = this.opts.dom[0];
+        this.container = null;
+        this.inner = null;
+        this.shade = null;
+        this.opened = false;
+        this.init()
+    }
+
+    Slider.prototype = {
+        isMobile: function () {
+            return navigator.userAgent.match(/(iPhone|iPod|Android|ios)/i) ? true : false
+        },
+
+        isSmallScreen: function () {
+            return screen.width <= 767
+        },
+
+        addEvent: function (f, e, d) {
+            if (f.attachEvent) {
+                f.attachEvent("on" + e, d)
+            } else {
+                f.addEventListener(e, d, false)
+            }
+        },
+
+        randomString: function () {
+            return Math.random().toString(36).substr(2, 6)
+        },
+
+        init: function () {
+            var self = this;
+            if (! self.dom) {
+                throw new Error('Invalid dom');
+            }
+            var mainDiv = document.createElement("div");
+            var innderDiv = document.createElement("div");
+            var shadeDiv = document.createElement("div");
+
+            mainDiv.setAttribute("class", "da-slider-main da-slider-" + self.id);
+            innderDiv.setAttribute("class", "da-slider-inner");
+            shadeDiv.setAttribute("class", "da-slider-shade");
+
+            innderDiv.appendChild(self.dom);
+            mainDiv.appendChild(innderDiv);
+            mainDiv.appendChild(shadeDiv);
+
+            $("body")[0].appendChild(mainDiv);
+
+            self.container = mainDiv;
+            self.inner = innderDiv;
+            self.shade = shadeDiv;
+
+            switch (self.opts.direction) {
+                case "t":
+                case "top":
+                    self.top = self.opts.top || 0;
+                    self.left = self.opts.left || 0;
+                    self.width = self.opts.width || "100%";
+                    self.height = self.opts.height || "30%";
+                    self.translate = "0,-100%,0";
+                    break;
+                case "b":
+                case "bottom":
+                    self.bottom = self.opts.bottom || 0;
+                    self.left = self.opts.left || 0;
+                    self.width = self.opts.width || "100%";
+                    self.height = self.opts.height || "30%";
+                    self.translate = "0,100%,0";
+                    break;
+                case "r":
+                case "right":
+                    self.bottom = self.opts.bottom || 0;
+                    self.right = self.opts.right || 0;
+                    self.width = self.opts.width || "30%";
+                    self.height = self.opts.height || self.autoHeight() + "px";
+                    self.translate = "100%,0,0";
+                    break;
+                default:
+                    self.bottom = self.opts.bottom || 0;
+                    self.left = self.opts.left || 0;
+                    self.width = self.opts.width || "30%";
+                    self.height = self.opts.height || self.autoHeight() + "px";
+                    self.translate = "-100%,0,0"
+            }
+
+            mainDiv.style.display = "none";
+            mainDiv.style.position = "fixed";
+            mainDiv.style.top = "0";
+            mainDiv.style.left = "0";
+            mainDiv.style.width = "100%";
+            mainDiv.style.height = "100%";
+            mainDiv.style.zIndex = self.opts.zIndex + 1;
+
+            innderDiv.style.position = "absolute";
+            innderDiv.style.top = self.top;
+            innderDiv.style.bottom = self.bottom;
+            innderDiv.style.left = self.left;
+            innderDiv.style.right = self.right;
+            innderDiv.style.backgroundColor = self.opts.background;
+            innderDiv.style.transform = "translate3d(" + self.translate + ")";
+            innderDiv.style.webkitTransition = "all .2s ease-out";
+            innderDiv.style.transition = "all .2s ease-out";
+            innderDiv.style.zIndex = self.opts.zIndex + 2;
+            innderDiv.style.boxShadow = '1px 1px 5px #ccc';
+            innderDiv.style.overflowY = 'auto';
+            innderDiv.style.padding = '10px';
+
+            shadeDiv.style.width = "100%";
+            shadeDiv.style.height = "100%";
+            shadeDiv.style.opacity = "0";
+            if (self.opts.shade !== false) {
+                shadeDiv.style.backgroundColor = self.opts.shade || "rgb(0, 0, 0, 0.3)";
+            }
+            shadeDiv.style.zIndex = self.opts.zIndex;
+            shadeDiv.style.webkitTransition = "all .2s ease-out";
+            shadeDiv.style.transition = "all .2s ease-out";
+            shadeDiv.style.webkitBackfaceVisibility = "hidden";
+
+            self.resize();
+            self.addListeners();
+        },
+
+        resize: function () {
+            var self = this,
+                d = this.opts.direction,
+                map = {'t': 1, 'top': 1, 'b': 1, 'bottom': 1},
+                dom = this.inner;
+
+            if (! this.opts.height && ! (d in map)) {
+                self.height = this.autoHeight() + "px";
+                dom.style.height = '100%'
+            }
+            if (this.isSmallScreen() && ! (d in map)) {
+                self.width = '100%';
+                dom.style.width = '100%'
+            }
+
+            $(dom).slimScroll({
+                width: '99.7%',
+                height: self.height,
+            });
+
+            $(this.container).find('.slimScrollDiv').css({
+                bottom: self.bottom,
+                top: self.top,
+                right: self.right,
+                left: self.left,
+                position: 'absolute',
+                width: self.width,
+                height: self.height,
+                // 'box-shadow': '1px 1px 5px #ccc',
+            });
+        },
+
+        autoHeight: function () {
+            return document.documentElement.clientHeight
+                - (this.opts.hasTopNavbar ? (this.isSmallScreen() ? 120 : 60) : 0)
+        },
+
+        toggle: function () {
+            this.opened ? this.close() : this.open();
+        },
+
+        open: function () {
+            var self = this;
+            self.container.style.display = "block";
+            self.opened = true;
+            setTimeout(function () {
+                self.inner.style.transform = "translate3d(0,0,0)";
+                self.inner.style.webkitTransform = "translate3d(0,0,0)";
+                self.shade.style.opacity = 0.5
+            }, 30);
+            if (self.opts.time) {
+                self.timer = setTimeout(function () {
+                    self.close()
+                }, self.opts.time)
+            }
+        },
+
+        close: function () {
+            var self = this;
+            self.timer && clearTimeout(self.timer);
+            self.inner.style.webkitTransform = "translate3d(" + self.translate + ")";
+            self.inner.style.transform = "translate3d(" + self.translate + ")";
+            self.shade.style.opacity = 0;
+            self.opened = false;
+
+            setTimeout(function () {
+                self.container.style.display = "none";
+                self.timer = null;
+                self.opts.callback && self.opts.callback()
+            }, 300)
+        },
+
+        destroy: function () {
+            this.container.remove();
+        },
+
+        onClick: function (dom, callback) {
+            this.addEvent(dom, (this.isMobile() ? "touchend" : "click"), callback)
+        },
+
+        addListeners: function () {
+            var self = this;
+            self.addEvent(self.shade, "touchmove", function (f) {
+                f.preventDefault()
+            });
+            self.onClick(self.shade, function (f) {
+                if (self.opts.closeShade) {
+                    self.close()
+                }
+            });
+
+            $(window).resize(function () {
+                self.resize()
+            })
+        }
+    };
+
+    LA.Slider = Slider
+})(jQuery);

File diff suppressed because it is too large
+ 0 - 0
resources/assets/vendors/dcat-admin/slider.min.js


+ 1023 - 0
resources/assets/vendors/dcat-admin/upload.js

@@ -0,0 +1,1023 @@
+(function ($) {
+    function Uploader(opts) {
+        opts = $.extend({
+            wrapper: '.web-uploader', // 图片显示容器选择器
+            addFileButton: '.add-file-button', // 继续添加按钮选择器
+            isImage: false,
+            preview: [], // 数据预览
+            deleteUrl: '',
+            deleteData: {},
+            thumbHeight: 160,
+            disabled: false, // 禁止任何上传编辑
+            autoUpdateColumn: false,
+            disableRemove: false, // 禁止删除图片,允许替换
+            dimensions: {
+                // width: 100, // 图片宽限制
+                // height: 100, // 图片高限制
+                // min_width: 100, //
+                // min_height: 100,
+                // max_width: 100,
+                // max_height: 100,
+                // ratio: 3/2, // 宽高比
+            },
+            lang: {
+                exceed_size: '文件大小超出',
+                interrupt: '上传暂停',
+                upload_failed: '上传失败,请重试',
+                selected_files: '选中:num个文件,共:size。',
+                selected_has_failed: '已成功上传:success个文件,:fail个文件上传失败,<a class="retry"  href="javascript:"";">重新上传</a>失败文件或<a class="ignore" href="javascript:"";">忽略</a>',
+                selected_success: '共:num个(:size),已上传:success个。',
+                dot: ',',
+                failed_num: '失败:fail个。',
+                pause_upload: '暂停上传',
+                go_on_upload: '继续上传',
+                start_upload: '开始上传',
+                upload_success_message: '已成功上传:success个文件',
+                go_on_add: '继续添加',
+                Q_TYPE_DENIED: '对不起,不允许上传此类型文件',
+                Q_EXCEED_NUM_LIMIT: '对不起,已超出文件上传数量限制,最多只能上传:num个文件',
+                F_EXCEED_SIZE: '对不起,当前选择的文件过大',
+                Q_EXCEED_SIZE_LIMIT: '对不起,已超出文件大小限制',
+                F_DUPLICATE: '文件重复',
+
+            },
+            upload: { // web-uploader配置
+                formData: {
+                    _id: null, // 唯一id
+                },
+                thumb: {
+                    width: 160,
+                    height: 160,
+                    quality: 70,
+                    allowMagnify: true,
+                    crop: true,
+                    preserveHeaders: false,
+                    // 为空的话则保留原有图片格式。
+                    // 否则强制转换成指定的类型。
+                    // IE 8下面 base64 大小不能超过 32K 否则预览失败,而非 jpeg 编码的图片很可
+                    // 能会超过 32k, 所以这里设置成预览的时候都是 image/jpeg
+                    type: 'image/jpeg'
+                },
+            }
+        }, opts);
+
+        var $selector = $(opts.selector),
+            updateColumn = opts.upload.formData.upload_column || ('webup' + Math.floor(Math.random()*10000)),
+            elementName = opts.elementName;
+
+        if (typeof opts.upload.formData._id == "undefined" || !opts.upload.formData._id) {
+            opts.upload.formData._id = updateColumn + Math.floor(Math.random()*10000);
+        }
+
+        var $wrap,
+
+            // 展示图片
+            showImg = opts.isImage,
+
+            // 图片容器
+            $queue,
+
+            // 状态栏,包括进度和控制按钮
+            $statusBar,
+
+            // 文件总体选择信息。
+            $info,
+
+            // 上传按钮
+            $upload,
+
+            // 没选择文件之前的内容。
+            $placeHolder,
+
+            $progress,
+
+            // 已上传文件数量
+            originalFilesNum = LA.len(opts.preview),
+
+            // 上传表单
+            $input = $selector.find('input[name="' + elementName + '"]'),
+
+            // 获取文件视图选择器
+            getFileViewSelector = function (fileId) {
+                return elementName.replace(/[\[\]]*/g, '_')+'-'+fileId;
+            },
+
+            getFileView = function (fileId) {
+                return $('#' + getFileViewSelector(fileId));
+            },
+
+            // 继续添加按钮选择器
+            addFileButtonSelector = opts.addFileButton,
+
+            // 临时存储上传失败的文件,key为file id
+            faildFiles = {},
+
+            // 临时存储添加到form表单的文件
+            formFiles = {},
+
+            // 添加的文件数量
+            fileCount = 0,
+
+            // 添加的文件总大小
+            fileSize = 0,
+
+            // 可能有pedding, ready, uploading, confirm, done.
+            state = 'pedding',
+
+            // 所有文件的进度信息,key为file id
+            percentages = {},
+            // 判断浏览器是否支持图片的base64
+            isSupportBase64 = (function () {
+                var data = new Image();
+                var support = true;
+                data.onload = data.onerror = function () {
+                    if (this.width != 1 || this.height != 1) {
+                        support = false;
+                    }
+                };
+                data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
+                return support;
+            })(),
+
+            // 检测是否已经安装flash,检测flash的版本
+            flashVersion = (function () {
+                var version;
+
+                try {
+                    version = navigator.plugins['Shockwave Flash'];
+                    version = version.description;
+                } catch (ex) {
+                    try {
+                        version = new ActiveXObject('ShockwaveFlash.ShockwaveFlash')
+                            .GetVariable('$version');
+                    } catch (ex2) {
+                        version = '0.0';
+                    }
+                }
+                version = version.match(/\d+/g);
+                return parseFloat(version[0] + '.' + version[1], 10);
+            })(),
+
+            // 判断是否是图片
+            isImage = function (file) {
+                return file.type.match(/^image/);
+            },
+
+            // 翻译
+            __ = LA.Translator(opts.lang),
+
+            // WebUploader实例
+            uploader;
+
+        // 当有文件添加进来时执行,负责view的创建
+        function addFile(file) {
+            var size = WebUploader.formatSize(file.size), $li, $btns;
+
+            if (showImg) {
+                $li = $('<li id="' + getFileViewSelector(file.id) + '" title="' + file.name + '" style="margin:7px">' +
+                    '<p class="file-type">' + (file.ext.toUpperCase() || 'FILE') + '</p>' +
+                    '<p class="imgWrap "></p>' +
+                    '<p class="title" style="">' + file.name + '</p>' +
+                    '<p class="title" style=\'margin-bottom:12px;\'>(<b>' + size + '</b>)</p>' +
+                    '</li>');
+
+                $btns = $('<div class="file-panel">' +
+                    '<a class=\'btn btn-xs btn-default\' data-file-act="cancel"><i class="fa fa-close red-dark" style=\'font-size:13px\'></i></a>' +
+                    '<a class=\'btn btn-xs btn-default\' data-file-act="delete" style="display: none"><i class="ti-trash red-dark" style=\'font-size:13px\'></i></a>' +
+                    '<a class=\'btn btn-xs btn-default\' data-file-act="preview" ><i class="glyphicon glyphicon-zoom-in"></i></a>' +
+                    '</div>').appendTo($li);
+            } else {
+                $li = $('<li id="' + getFileViewSelector(file.id) + '" title="' + file.name + '">' +
+                    '<p class="title" style="display:block"><i class=\'ti-check green _success\' style=\'font-weight:bold;font-size:17px;display:none\'></i>' +
+                    file.name + ' (' + size + ')</p>' +
+                    '</li>');
+
+                $btns = $('<span data-file-act="cancel" class="_act" style="font-size:13px"><i class=\'ti-close red-dark\'></i></span>' +
+                    '<span data-file-act="delete" class="_act" style="display:none"><i class=\'ti-trash red-dark\'></i></span>'
+                ).appendTo($li);
+            }
+
+            var $wrap = $li.find('p.imgWrap'),
+                $info = $('<p class="error"></p>'),
+
+                showError = function (code, file) {
+                    var text = '';
+                    switch (code) {
+                        case 'exceed_size':
+                            text = __('exceed_size');
+                            break;
+
+                        case 'interrupt':
+                            text = __('interrupt');
+                            break;
+
+                        default:
+                            text = __('upload_failed');
+                            break;
+                    }
+
+                    faildFiles[file.id] = file;
+
+                    $info.text(text).appendTo($li);
+                };
+
+            $li.appendTo($queue);
+
+            if (file.getStatus() === 'invalid') {
+                showError(file.statusText, file);
+            } else {
+                if (showImg) {
+                    var image = uploader.makeThumb(file, function (error, src) {
+                        var img;
+
+                        $wrap.empty();
+                        if (error) {
+                            $li.find('.title').show();
+                            $li.find('.file-type').show();
+                            return;
+                        }
+
+                        if (isSupportBase64) {
+                            img = $('<img src="' + src + '">');
+                            $wrap.append(img);
+                        } else {
+                            $li.find('.file-type').show();
+                        }
+                    });
+
+                    try {
+                        image.once('load', function () {
+                            file._info = file._info || image.info();
+                            file._meta = file._meta || image.meta();
+                            var width = file._info.width,
+                                height = file._info.height;
+
+                            if (!validateDimensions(file)) {
+                                LA.error('The image dimensions is invalid.');
+                                uploader.removeFile(file);
+                                return false;
+                            }
+
+                            image.resize(width, height);
+                        });
+                    } catch (e) {
+                        // 不是图片
+                        return setTimeout(function () {
+                            uploader.removeFile(file);
+                        }, 10);
+                    }
+                }
+
+                percentages[file.id] = [file.size, 0];
+                file.rotation = 0;
+            }
+
+            file.on('statuschange', function (cur, prev) {
+                if (prev === 'progress') {
+                    // $prgress.hide().width(0);
+                } else if (prev === 'queued') {
+                    $btns.find('[data-file-act="cancel"]').hide();
+                    $btns.find('[data-file-act="delete"]').show();
+                }
+
+                // 成功
+                if (cur === 'error' || cur === 'invalid') {
+                    showError(file.statusText, file);
+                    percentages[file.id][1] = 1;
+                } else if (cur === 'interrupt') {
+                    showError('interrupt', file);
+                } else if (cur === 'queued') {
+                    percentages[file.id][1] = 0;
+                } else if (cur === 'progress') {
+                    $info.remove();
+                    // $prgress.css('display', 'block');
+                } else if (cur === 'complete') {
+                    if (showImg) {
+                        $li.append('<span class="success"><em></em><i class="ti-check"></i></span>');
+                    } else {
+                        $li.find('._success').show();
+                    }
+                }
+
+                $li.removeClass('state-' + prev).addClass('state-' + cur);
+            });
+
+            var $act = showImg ? $btns.find('a') : $btns;
+
+            $act.on('click', function () {
+                var index = $(this).data('file-act');
+
+                switch (index) {
+                    case 'cancel':
+                        uploader.removeFile(file);
+                        return;
+                    case 'deleteurl':
+                    case 'delete':
+                        if (opts.disableRemove) {
+                            return uploader.removeFile(file);
+                        }
+
+                        var post = opts.deleteData;
+
+                        post.key = file.serverId;
+                        if (!post.key) {
+                            return uploader.removeFile(file);
+                        }
+                        post._column = updateColumn;
+
+                        LA.loading();
+                        $.post(opts.deleteUrl, post, function (result) {
+                            LA.loading(false);
+                            if (result.status) {
+                                deleteInput(file.serverId);
+                                uploader.removeFile(file);
+                                return;
+                            }
+
+                            LA.error(result.message || 'Remove file failed.');
+                        });
+
+                        break;
+                    case 'preview':
+                        LA.previewImage($wrap.find('img').attr('src'), null, file.name);
+                        break;
+                }
+
+            });
+        }
+
+        // 图片宽高验证
+        function validateDimensions(file) {
+            // The image dimensions is invalid.
+            if (!showImg || !isImage(file) || !LA.len(opts.dimensions)) return true;
+            var dimensions = opts.dimensions,
+                width = file._info.width,
+                height = file._info.height,
+                isset = LA.isset;
+            if (
+                (isset(dimensions, 'width') && dimensions['width'] != width) ||
+                (isset(dimensions, 'min_width') && dimensions['min_width'] > width)||
+                (isset(dimensions, 'max_width') && dimensions['max_width'] < width) ||
+                (isset(dimensions, 'height') && dimensions['height'] != height) ||
+                (isset(dimensions, 'min_height') && dimensions['min_height'] > height) ||
+                (isset(dimensions, 'max_height') && dimensions['max_height'] < height) ||
+                (isset(dimensions, 'ratio') && dimensions['ratio'] != (width / height))
+            ) {
+                return false;
+            }
+
+            return true;
+        }
+
+        // 负责view的销毁
+        function removeUploadFile(file) {
+            var $li = getFileView(file.id);
+
+            delete percentages[file.id];
+            updateTotalProgress();
+            $li.off().find('.file-panel').off().end().remove();
+        }
+
+        function updateTotalProgress() {
+            var loaded = 0,
+                total = 0,
+                $bar = $progress.find('.progress-bar'),
+                percent;
+
+            $.each(percentages, function (k, v) {
+                total += v[0];
+                loaded += v[0] * v[1];
+            });
+
+            percent = total ? loaded / total : 0;
+            percent = Math.round(percent * 100) + '%';
+
+            $bar.text(percent);
+            $bar.css('width', percent);
+            updateStatusText();
+        }
+
+        function updateStatusText() {
+            var text = '', stats;
+
+            if (!uploader) {
+                return;
+            }
+
+            if (state === 'ready') {
+                stats = uploader.getStats();
+                if (fileCount) {
+                    text = __('selected_files', {num: fileCount, size: WebUploader.formatSize(fileSize)});
+                } else {
+                    showSuccess();
+                }
+            } else if (state === 'confirm') {
+                stats = uploader.getStats();
+                if (stats.uploadFailNum) {
+                    text = __('selected_has_failed', {success: stats.successNum, fail: stats.uploadFailNum});
+                }
+            } else {
+                showSuccess();
+            }
+
+            function showSuccess() {
+                stats = uploader.getStats();
+                if (stats.successNum) {
+                    text = __('selected_success', {num: fileCount, size: WebUploader.formatSize(fileSize), success: stats.successNum});
+                }
+
+                if (stats.uploadFailNum) {
+                    text += (text ? __('dot') : '') + __('failed_num', {fail: stats.uploadFailNum});
+                }
+            }
+
+            $info.html(text);
+        }
+
+        // 上传文件后修改字段值
+        function updateFileColumn() {
+            var values = getInput(),
+                num = uploader.getStats().successNum,
+                form = $.extend({}, opts.formData);
+
+            if (!num || !values || !opts.autoUpdateColumn) {
+                return;
+            }
+
+            form[updateColumn] = values.join(',');
+            delete form['upload_column'];
+
+            $.post(opts.server, form);
+        }
+
+        function setState(val, args) {
+            var stats;
+            args = args || {};
+
+            if (val === state) {
+                return;
+            }
+
+            if ($upload) {
+                $upload.removeClass('state-' + state);
+                $upload.addClass('state-' + val);
+            }
+            state = val;
+
+            switch (state) {
+                case 'pedding':
+                    if (opts.disabled) return;
+                    $placeHolder.removeClass('element-invisible');
+                    $queue.hide();
+                    $statusBar.addClass('element-invisible');
+                    if (showImg) {
+                        $wrap.removeAttr('style');
+                        $wrap.find('.queueList').removeAttr('style');
+                    }
+
+                    refreshButton();
+                    break;
+
+                case 'ready':
+                    $placeHolder.addClass('element-invisible');
+                    $selector.find(addFileButtonSelector).removeClass('element-invisible');
+                    $queue.show();
+                    if (!opts.disabled) {
+                        $statusBar.removeClass('element-invisible');
+                    }
+                    refreshButton();
+                    if (showImg) {
+                        $wrap.find('.queueList').css({'border': '1px solid #d3dde5', 'padding':'5px'});
+                        // $wrap.find('.queueList').removeAttr('style');
+                    }
+                    break;
+
+                case 'uploading':
+                    $selector.find(addFileButtonSelector).addClass('element-invisible');
+                    $progress.show();
+                    $upload.text(__('pause_upload'));
+                    break;
+
+                case 'paused':
+                    $progress.show();
+                    $upload.text(__('go_on_upload'));
+                    break;
+
+                case 'confirm':
+                    if (uploader) {
+                        $progress.hide();
+                        $selector.find(addFileButtonSelector).removeClass('element-invisible');
+                        $upload.text(__('start_upload'));
+
+                        stats = uploader.getStats();
+                        if (stats.successNum && !stats.uploadFailNum) {
+                            setState('finish');
+                            return;
+                        }
+                    }
+                    break;
+                case 'finish':
+                    if (uploader) {
+                        stats = uploader.getStats();
+                        if (stats.successNum) {
+                            LA.success(__('upload_success_message', {success: stats.successNum}));
+                        } else {
+                            // 没有成功的图片,重设
+                            state = 'done';
+                            location.reload();
+                        }
+                    }
+                    break;
+                case 'decrOriginalFileNum':
+                    if (originalFilesNum > 0) originalFilesNum --;
+                    break;
+
+                case 'incrOriginalFileNum':
+                    originalFilesNum ++;
+                    break;
+
+                case 'decrFileNumLimit': // 减少上传文件数量限制
+                    if (!uploader) {
+                        return;
+                    }
+                    var ofl = uploader.option('fileNumLimit'),
+                        num = args.num || 1;
+
+                    if (ofl == '-1') ofl = 0;
+
+                    num = ofl >= num ? ofl - num : 0;
+
+                    if (num == 0) num = '-1';
+
+                    uploader.option('fileNumLimit', num);
+
+                    break;
+                case 'incrFileNumLimit': // 增加上传文件数量限制
+                    if (!uploader) {
+                        return;
+                    }
+                    var ofl = uploader.option('fileNumLimit'),
+                        num = args.num || 1;
+
+                    if (ofl == '-1') ofl = 0;
+
+                    num = ofl + num;
+
+                    uploader.option('fileNumLimit', num);
+                    break;
+                case 'init': // 初始化
+                    $upload.addClass('state-' + state);
+                    updateTotalProgress();
+
+                    if (originalFilesNum || opts.disabled) {
+                        $placeHolder.addClass('element-invisible');
+                        if (!opts.disabled) {
+                            $statusBar.show();
+                        } else {
+                            $wrap.addClass('disabled');
+                        }
+                        setState('ready');
+                    } else if (showImg) {
+                        $wrap.removeAttr('style');
+                        $wrap.find('.queueList').css('margin', '0');
+                    }
+                    refreshButton();
+                    break;
+
+            }
+
+            updateStatusText();
+        }
+
+        // 移除form表单的文件
+        function removeFormFile(fileId) {
+            if (!fileId) return;
+
+            var file = formFiles[fileId];
+
+            deleteInput(fileId);
+            delete formFiles[fileId];
+            if (uploader && !file.fake) {
+                uploader.removeFile(file);
+            }
+
+            setState('decrOriginalFileNum');
+            setState('incrFileNumLimit');
+
+            if (!LA.len(formFiles) && !LA.len(percentages)) {
+                setState('pedding');
+            }
+        }
+
+        // 获取表单值
+        function getInput() {
+            var val = $input.val();
+
+            return val ? val.split(',') : [];
+        }
+
+        // 新增表单值
+        function addInput(id) {
+            var val = getInput();
+            val.push(id);
+            setInput(val);
+        }
+
+        // 设置表单值
+        function setInput(arr) {
+            arr = arr.filter(function(v, k, self) {
+                return self.indexOf(v) === k;
+            }).filter(function (v) {
+                return v ? true : false;
+            });
+
+            $input.val(arr.join(','));
+        }
+
+        // 删除表单值
+        function deleteInput(id) {
+            if (!id) {
+                return $input.val('');
+            }
+            setInput(getInput().filter(function (v) {
+                return v != id;
+            }));
+        }
+
+        // 重新计算按钮定位
+        function refreshButton() {
+            uploader.refresh();
+        }
+
+        // 添加上传成功文件到表单区域
+        function appendUploadedFileForm(file) {
+            var html = "";
+            html += "<li title='" + file.serverPath + "'>";
+
+            if (showImg) {
+                html += "<p class='imgWrap'>";
+                html += "	<img src='" + file.serverUrl + "'>";
+                html += "</p>";
+            } else if (!opts.disabled) {
+                html += '<p class="_act" data-file-act=\'delete\' data-id="' + file.serverId + '"><i class=\'ti-trash red-dark\'></i></p>';
+            }
+
+            html += "<p class='title' style=''><i class='ti-check green _success' style='font-weight:bold;font-size:17px;display:none'></i>";
+            html += file.serverPath;
+            html += "</p>";
+
+            if (showImg) {
+                html += "<p class='title' style='margin-bottom:12px;'>&nbsp;</p>";
+                html += "<div class='file-panel' >";
+
+                if (!opts.disabled) {
+                    html += "<a class='btn btn-xs btn-default' data-file-act='deleteurl' data-id='" + file.serverId + "'><i class='ti-trash red-dark' style='font-size:13px'></i></a>";
+                }
+                html += "<a class='btn btn-xs btn-default' data-file-act='preview' data-url='" + file.serverUrl + "' ><i class='glyphicon glyphicon-zoom-in'></i></a>";
+
+                html += "</div>";
+            }
+
+            html += "</li>";
+            html = $(html);
+
+            if (!showImg) {
+                html.find('.file-type').show();
+                html.find('.title').show();
+                $wrap.css('background', 'transparent');
+            }
+
+            var deleteFile = function () {
+                var fileId = $(this).data('id'), post = opts.deleteData;
+
+                if (opts.disableRemove) {
+                    html.remove();
+
+                    return removeFormFile(fileId);
+                }
+
+                post.key = fileId;
+                post._column = updateColumn;
+
+                LA.loading();
+                $.post(opts.deleteUrl, post, function (result) {
+                    LA.loading(false);
+                    if (result.status) {
+                        // 移除
+                        html.remove();
+
+                        removeFormFile(fileId);
+                        return;
+                    }
+
+                    LA.error(result.message || 'Remove file failed.')
+                });
+            };
+
+            // 删除按钮点击事件
+            html.find('[data-file-act="deleteurl"]').click(deleteFile);
+            html.find('[data-file-act="delete"]').click(deleteFile);
+
+
+            // 放大图片
+            html.find('[data-file-act="preview"]').click(function () {
+                var url = $(this).data('url');
+
+                LA.previewImage(url);
+            });
+
+            setState('incrOriginalFileNum');
+            setState('decrFileNumLimit');
+            formFiles[file.serverId] = file;
+
+            addInput(file.serverId);
+
+            $queue.append(html);
+
+            if (showImg) {
+                setTimeout(function () { html.css('margin', '7px');}, 80);
+            }
+        }
+
+        // 初始化web-uploader
+        function build() {
+            $wrap = $selector.find(opts.wrapper);
+
+            // 图片容器
+            $queue = $('<ul class="filelist"></ul>').appendTo($wrap.find('.queueList'));
+
+            // 状态栏,包括进度和控制按钮
+            $statusBar = $wrap.find('.statusBar');
+
+            // 文件总体选择信息。
+            $info = $statusBar.find('.info');
+
+            // 上传按钮
+            $upload = $wrap.find('.uploadBtn');
+
+            // 没选择文件之前的内容。
+            $placeHolder = $wrap.find('.placeholder');
+
+            $progress = $statusBar.find('.upload-progress').hide();
+
+            // IE;
+            supportIe();
+
+            // 实例化
+            uploader = WebUploader.create(opts.upload);
+
+            // 拖拽时不接受 js, txt 文件。
+            uploader.on('dndAccept', function (items) {
+                var denied = false,
+                    len = items.length,
+                    i = 0,
+                    // 修改js类型
+                    unAllowed = 'text/plain;application/javascript ';
+
+                for (; i < len; i++) {
+                    // 如果在列表里面
+                    if (~unAllowed.indexOf(items[i].type)) {
+                        denied = true;
+                        break;
+                    }
+                }
+
+                return !denied;
+            });
+
+            if (opts.upload.fileNumLimit > 1 && !opts.disabled) {
+                // 添加“添加文件”的按钮,
+                uploader.addButton({
+                    id: addFileButtonSelector,
+                    label: '<i class="glyphicon glyphicon-folder-open"></i> &nbsp;' + __('go_on_add')
+                });
+            }
+
+            uploader.onUploadProgress = function (file, percentage) {
+                percentages[file.id][1] = percentage;
+                updateTotalProgress();
+            };
+
+            uploader.onBeforeFileQueued = function (file) {
+
+            };
+
+            uploader.onFileQueued = function (file) {
+                fileCount++;
+                fileSize += file.size;
+
+                if (fileCount === 1) {
+                    $placeHolder.addClass('element-invisible');
+                    $statusBar.show();
+                }
+
+                addFile(file);
+                setState('ready');
+                updateTotalProgress();
+            };
+
+            // 删除文件事件监听
+            uploader.onFileDequeued = function (file) {
+                fileCount--;
+                fileSize -= file.size;
+
+                if (!fileCount && !LA.len(formFiles)) {
+                    setState('pedding');
+                }
+
+                removeUploadFile(file);
+            };
+
+            uploader.on('all', function (type, obj, reason) {
+                switch (type) {
+                    case 'uploadFinished':
+                        setState('confirm');
+                        updateFileColumn();
+                        break;
+
+                    case 'startUpload':
+                        setState('uploading');
+                        break;
+
+                    case 'stopUpload':
+                        setState('paused');
+                        break;
+                    case  'uploadAccept':
+                        // 上传失败,返回false
+                        if (reason && reason.error) {
+                            LA.error(reason.error.message);
+
+                            faildFiles[obj.file.id] = obj.file;
+
+                            return false;
+                        }
+
+                        if (reason.merge) {
+                            // 分片上传
+                            return;
+                        }
+
+                        // 上传成功,保存新文件名和路径到file对象
+                        obj.file.serverId   = reason.id;
+                        obj.file.serverName = reason.name;
+                        obj.file.serverPath = reason.path;
+                        obj.file.serverUrl  = reason.url || null;
+
+                        addInput(reason.id);
+
+                        if (!showImg) {
+                            var $li = getFileView(obj.file.id);
+                            $li.find('._act').hide();
+                            $li.find('[data-file-act="delete"]').show();
+                        }
+
+                        break;
+                }
+
+            });
+
+            uploader.onError = function (code) {
+                switch (code) {
+                    case 'Q_TYPE_DENIED':
+                        LA.error(__('Q_TYPE_DENIED'));
+                        break;
+                    case 'Q_EXCEED_NUM_LIMIT':
+                        LA.error(__('Q_EXCEED_NUM_LIMIT', {num: opts.upload.fileNumLimit}));
+                        break;
+                    case 'F_EXCEED_SIZE':
+                        LA.error(__('F_EXCEED_SIZE'));
+                        break;
+                    case 'Q_EXCEED_SIZE_LIMIT':
+                        LA.error(__('Q_EXCEED_SIZE_LIMIT'));
+                        break;
+                    case 'F_DUPLICATE':
+                        LA.warning(__('F_DUPLICATE'));
+                        break;
+                    default:
+                        LA.error('Error: ' + code);
+                }
+
+            };
+
+            $upload.on('click', function () {
+                if ($(this).hasClass('disabled')) {
+                    return false;
+                }
+
+                if (state === 'ready') {
+                    uploader.upload();
+                } else if (state === 'paused') {
+                    uploader.upload();
+                } else if (state === 'uploading') {
+                    uploader.stop();
+                }
+            });
+
+            $info.on('click', '.retry', function () {
+                uploader.retry();
+            });
+
+            $info.on('click', '.ignore', function () {
+                for (var i in faildFiles) {
+                    uploader.removeFile(i, true);
+                    delete faildFiles[i];
+                }
+
+            });
+
+            setState('init');
+        }
+
+        // 预览
+        function preview() {
+            for (var i in opts.preview) {
+                var path = opts.preview[i].path, ext;
+
+                if (path.indexOf('.')) {
+                    ext = path.split('.').pop();
+                }
+
+                appendUploadedFileForm({
+                    serverId: opts.preview[i].id,
+                    serverUrl: opts.preview[i].url,
+                    serverPath: path,
+                    ext: ext,
+                    fake: 1,
+                })
+            }
+        }
+
+        this.uploader = uploader;
+        this.options = opts;
+        this.build = build;
+        this.preview = preview;
+        this.setState = setState;
+        this.refreshButton = refreshButton;
+        this.getFileView = getFileView;
+        this.getFileViewSelector = getFileViewSelector;
+        this.addFileView = addFile;
+        this.removeUploadFileView = removeUploadFile;
+        this.isImage = isImage;
+        this.getColumn = function () {
+            return updateColumn;
+        };
+
+        function supportIe() {
+            if (!WebUploader.Uploader.support('flash') && WebUploader.browser.ie) {
+
+                // flash 安装了但是版本过低。
+                if (flashVersion) {
+                    (function (container) {
+                        window['expressinstallcallback'] = function (state) {
+                            switch (state) {
+                                case 'Download.Cancelled':
+                                    break;
+
+                                case 'Download.Failed':
+                                    LA.error('Install failed!');
+                                    break;
+
+                                default:
+                                    LA.success('Install Success!');
+                                    break;
+                            }
+                            delete window['expressinstallcallback'];
+                        };
+
+                        var swf = './expressInstall.swf';
+                        // insert flash object
+                        var html = '<object type="application/' +
+                            'x-shockwave-flash" data="' + swf + '" ';
+
+                        if (WebUploader.browser.ie) {
+                            html += 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" ';
+                        }
+
+                        html += 'width="100%" height="100%" style="outline:0">' +
+                            '<param name="movie" value="' + swf + '" />' +
+                            '<param name="wmode" value="transparent" />' +
+                            '<param name="allowscriptaccess" value="always" />' +
+                            '</object>';
+
+                        container.html(html);
+
+                    })($wrap);
+
+                    // 压根就没有安转。
+                } else {
+                    $wrap.html('<a href="http://www.adobe.com/go/getflashplayer" target="_blank" border="0"><img alt="get flash player" src="http://www.adobe.com/macromedia/style_guide/images/160x41_Get_Flash_Player.jpg" /></a>');
+                }
+
+                return;
+            } else if (!WebUploader.Uploader.support()) {
+                LA.error('Web Uploader 不支持您的浏览器!');
+                return;
+            }
+        }
+
+        return this;
+    }
+
+    LA.Uploader = Uploader;
+
+})(jQuery);

File diff suppressed because it is too large
+ 0 - 0
resources/assets/vendors/dcat-admin/upload.min.js


+ 15 - 15
webpack.mix.js

@@ -23,9 +23,9 @@ const path = require('path')
  */
 
 function mixAssetsDir(query, cb) {
-  (glob.sync('resources/' + query) || []).forEach(f => {
+  (glob.sync('resources/assets/' + query) || []).forEach(f => {
     f = f.replace(/[\\\/]+/g, '/');
-    cb(f, f.replace('resources', 'public'));
+    cb(f, f.replace('resources/assets', 'resources/assets/public'));
   });
 }
 
@@ -57,28 +57,28 @@ mixAssetsDir('js/scripts/**/*.js', (src, dest) => mix.scripts(src, dest));
 mixAssetsDir('vendors/js/**/*.js', (src, dest) => mix.scripts(src, dest));
 mixAssetsDir('vendors/css/**/*.css', (src, dest) => mix.copy(src, dest));
 mixAssetsDir('vendors/css/editors/quill/fonts/', (src, dest) => mix.copy(src, dest));
-mix.copyDirectory('resources/images', 'public/images');
-mix.copyDirectory('resources/fonts', 'public/fonts');
+mix.copyDirectory('resources/assets/images', 'resources/assets/public/images');
+mix.copyDirectory('resources/assets/fonts', 'resources/assets/public/fonts');
 
 
-mix.js('resources/js/core/app-menu.js', 'public/js/core')
-  .js('resources/js/core/app.js', 'public/js/core')
-  .sass('resources/sass/bootstrap.scss', 'public/css')
-  .sass('resources/sass/bootstrap-extended.scss', 'public/css')
-  .sass('resources/sass/colors.scss', 'public/css')
-  .sass('resources/sass/components.scss', 'public/css')
-  .sass('resources/sass/custom-rtl.scss', 'public/css')
-  .sass('resources/sass/custom-laravel.scss', 'public/css');
+mix.js('resources/assets/js/core/app-menu.js', 'resources/assets/public/js/core')
+    .js('resources/assets/js/core/app.js', 'resources/assets/public/js/core')
+    .sass('resources/assets/sass/bootstrap.scss', 'resources/assets/public/css')
+    .sass('resources/assets/sass/bootstrap-extended.scss', 'resources/assets/public/css')
+    .sass('resources/assets/sass/colors.scss', 'resources/assets/public/css')
+    .sass('resources/assets/sass/components.scss', 'resources/assets/public/css')
+    .sass('resources/assets/sass/custom-rtl.scss', 'resources/assets/public/css')
+    .sass('resources/assets/sass/custom-laravel.scss', 'resources/assets/public/css');
 
 mix.then(() => {
   if (process.env.MIX_CONTENT_DIRECTION === "rtl") {
-    let command = `node ${path.resolve('node_modules/rtlcss/bin/rtlcss.js')} -d -e ".css" ./public/css/ ./public/css/`;
+    let command = `node ${path.resolve('node_modules/rtlcss/bin/rtlcss.js')} -d -e ".css" ./resources/assets/public/css/ ./resources/assets/public/css/`;
     exec(command, function (err, stdout, stderr) {
       if (err !== null) {
         console.log(err);
       }
     });
-    // exec('./node_modules/rtlcss/bin/rtlcss.js -d -e ".css" ./public/css/ ./public/css/');
+    // exec('./node_modules/rtlcss/bin/rtlcss.js -d -e ".css" ./resources/assets/public/css/ ./resources/assets/public/css/');
   }
 });
 
@@ -87,7 +87,7 @@ mix.then(() => {
 //   mix.version();
 //   mix.webpackConfig({
 //     output: {
-//       publicPath: '/demo/vuexy-bootstrap-laravel-admin-template/demo-1/'
+//       resources/assets/publicPath: '/demo/vuexy-bootstrap-laravel-admin-template/demo-1/'
 //     }
 //   });
 //   mix.setResourceRoot("/demo/vuexy-bootstrap-laravel-admin-template/demo-1/");

Some files were not shown because too many files changed in this diff