diff --git a/application/admin/command/Install.php b/application/admin/command/Install.php
index 85baa5e..391b686 100644
--- a/application/admin/command/Install.php
+++ b/application/admin/command/Install.php
@@ -2,6 +2,8 @@
 
 namespace app\admin\command;
 
+use PDO;
+use think\Config;
 use think\console\Command;
 use think\console\Input;
 use think\console\input\Option;
@@ -36,6 +38,12 @@ class Install extends Command
 
         $sql = file_get_contents(__DIR__ . '/Install/fastadmin.sql');
 
+        // 先尝试能否自动创建数据
+        $config = Config::get('database');
+        $pdo = new PDO("{$config['type']}:host={$config['hostname']}", $config['username'], $config['password']);
+        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+        $pdo->query("CREATE DATABASE IF NOT EXISTS `{$config['database']}` CHARACTER SET utf8 COLLATE utf8_general_ci;");
+
         // 查询一次SQL,判断连接是否正常
         Db::execute("SELECT 1");
 
diff --git a/application/admin/controller/Index.php b/application/admin/controller/Index.php
index 6f222d0..c009f88 100644
--- a/application/admin/controller/Index.php
+++ b/application/admin/controller/Index.php
@@ -101,7 +101,7 @@ class Index extends Backend
     public function logout()
     {
         $this->auth->logout();
-        $this->success(__('Logout success!'), 'index/login');
+        $this->success(__('Logout successful'), 'index/login');
         return;
     }
 
diff --git a/application/admin/lang/zh-cn.php b/application/admin/lang/zh-cn.php
index 61d6583..3bfe0da 100644
--- a/application/admin/lang/zh-cn.php
+++ b/application/admin/lang/zh-cn.php
@@ -102,13 +102,6 @@ return [
     'Please enter your username'                            => '请输入你的用户名',
     'Please enter your password'                            => '请输入你的密码',
     'Please login first'                                    => '请登录后操作',
-    'You\'ve logged in, do not login again'                 => '你已经登录,无需重复登录',
-    'Username or password can not be empty'                 => '用户名密码不能为空',
-    'Username or password is incorrect'                     => '用户名或密码不正确',
-    'Username is incorrect'                                 => '用户名不正确',
-    'Password is incorrect'                                 => '密码不正确',
-    'Login successful'                                      => '登录成功!',
-    'Verification code is incorrect'                        => '验证码不正确',
     'An unexpected error occurred'                          => '发生了一个意外错误,程序猿正在紧急处理中',
     'This page will be re-directed in %s seconds'           => '页面将在 %s 秒后自动跳转',
 ];
diff --git a/application/admin/lang/zh-cn/index.php b/application/admin/lang/zh-cn/index.php
index e66770d..527d413 100644
--- a/application/admin/lang/zh-cn/index.php
+++ b/application/admin/lang/zh-cn/index.php
@@ -20,4 +20,12 @@ return [
     'Disable top menu badge'                                     => '禁用顶部彩色小角标',
     'Disable top menu badge without left menu'                   => '左边菜单栏的彩色小角标不受影响',
     'Skins'                                                      => '皮肤',
+    'You\'ve logged in, do not login again'                      => '你已经登录,无需重复登录',
+    'Username or password can not be empty'                      => '用户名密码不能为空',
+    'Username or password is incorrect'                          => '用户名或密码不正确',
+    'Username is incorrect'                                      => '用户名不正确',
+    'Password is incorrect'                                      => '密码不正确',
+    'Login successful'                                           => '登录成功!',
+    'Logout successful'                                          => '退出成功!',
+    'Verification code is incorrect'                             => '验证码不正确',
 ];
diff --git a/application/admin/library/Auth.php b/application/admin/library/Auth.php
index 23f3940..841447c 100644
--- a/application/admin/library/Auth.php
+++ b/application/admin/library/Auth.php
@@ -248,7 +248,6 @@ class Auth extends \fast\Auth
 
         // 读取管理员当前拥有的权限节点
         $userRule = $this->getRuleList();
-
         $select_id = 0;
         $dashboard = '/' . $module . '/dashboard';
         // 必须将结果集转换为数组
@@ -256,7 +255,10 @@ class Auth extends \fast\Auth
         foreach ($ruleList as $k => &$v)
         {
             if (!in_array($v['name'], $userRule))
+            {
+                unset($ruleList[$k]);
                 continue;
+            }
             $select_id = $v['name'] == $dashboard ? $v['id'] : $select_id;
             $v['url'] = $v['name'];
             $v['badge'] = isset($badgeList[$v['name']]) ? $badgeList[$v['name']] : '';
diff --git a/application/extra/upload.php b/application/extra/upload.php
index bccd53d..421b3e3 100644
--- a/application/extra/upload.php
+++ b/application/extra/upload.php
@@ -39,6 +39,10 @@ return [
      */
     'mimetype'  => '*',
     /**
+     * 是否支持批量上传
+     */
+    'multiple'  => true,
+    /**
      * 又拍云操作员用户名
      */
     'username'  => '',
diff --git a/public/assets/js/backend.js b/public/assets/js/backend.js
index 50e33e4..9a3910c 100755
--- a/public/assets/js/backend.js
+++ b/public/assets/js/backend.js
@@ -26,20 +26,21 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'lang', 'config'], function ($
                 options = $.extend({
                     type: "POST",
                     dataType: 'json',
-                    success: function (data) {
+                    success: function (ret) {
                         Backend.api.layer.close(index);
-                        if (data.hasOwnProperty("code")) {
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code === 1) {
+                        if (ret.hasOwnProperty("code")) {
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
                                 if (typeof success == 'function') {
-                                    var onAfterResult = success.call(undefined, content);
+                                    var onAfterResult = success.call(undefined, data);
                                     if (!onAfterResult) {
                                         return false;
                                     }
                                 }
-                                Toastr.success(content ? content : __('Operation completed'));
+                                Toastr.success(msg ? msg : __('Operation completed'));
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));
@@ -87,14 +88,23 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'lang', 'config'], function ($
                     processData: false,
                     type: 'POST',
                     dataType: 'json',
-                    success: function (data) {
-                        if (data.hasOwnProperty("code")) {
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code === 1) {
-                                $('.summernote').summernote("insertImage", data.content, 'filename');
+                    success: function (ret) {
+                        if (ret.hasOwnProperty("code")) {
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
+                                if (typeof callback == 'function') {
+                                    var onAfterResult = success.call(undefined, data);
+                                    if (!onAfterResult) {
+                                        return false;
+                                    }
+                                }
+                                if ($('.summernote').size() > 0 && data && typeof data.url !== 'undefined') {
+                                    $('.summernote').summernote("insertImage", data.url, 'filename');
+                                }
                                 Toastr.success(__('Operation completed'));
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));
diff --git a/public/assets/js/backend/auth/rule.js b/public/assets/js/backend/auth/rule.js
index af5e6cf..2ae895c 100755
--- a/public/assets/js/backend/auth/rule.js
+++ b/public/assets/js/backend/auth/rule.js
@@ -95,10 +95,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
                                         var data = get_children($("#treeview").jstree('get_json'));
                                         Backend.api.ajax({url: "auth/rule/rebuild", data: {step: 2, data: data}}, function (content) {
                                             Backend.api.layer.close(index);
-                                            Backend.api.success(function () {
-                                                //刷新页面
-                                                top.location.reload();
-                                            });
+                                            top.location.reload();
                                         });
                                     }
                                 });
diff --git a/public/assets/js/backend/general/configvalue.js b/public/assets/js/backend/general/configvalue.js
index a1cbc80..abfdfe5 100755
--- a/public/assets/js/backend/general/configvalue.js
+++ b/public/assets/js/backend/general/configvalue.js
@@ -42,7 +42,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                         url: 'ajax/clearcache'
                     }, function (ret) {
                         Layer.closeAll();
-                        Backend.api.success();
+                        Toastr.success(__('Operation completed'));
                     });
                 });
             });
diff --git a/public/assets/js/backend/wechat/menu.js b/public/assets/js/backend/wechat/menu.js
index 3dd52da..567230b 100644
--- a/public/assets/js/backend/wechat/menu.js
+++ b/public/assets/js/backend/wechat/menu.js
@@ -133,7 +133,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'sortable'], function
                 $.post("wechat/menu/edit", {menu: JSON.stringify(getMenuList())}, function (data) {
                     if (data['code'] == 1) {
                     } else {
-                        Backend.api.error();
+                        Toastr.error(__('Operation failed'));
                     }
                 }, 'json');
             };
@@ -253,11 +253,13 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'sortable'], function
                 updateChangeMenu();
             });
             $(document).on('click', "#menuSyn", function () {
-                $.post("wechat/menu/sync", {}, function (data) {
-                    if (data['code'] == 1) {
+                $.post("wechat/menu/sync", {}, function (ret) {
+
+                    var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                    if (ret.code == 1) {
                         Backend.api.toastr.success('菜单同步更新成功,生效时间看微信官网说明,或者你重新关注微信号!');
                     } else {
-                        Backend.api.toastr.error(data['content']);
+                        Backend.api.toastr.error(msg ? msg : __('Operation failed'));
                     }
                 }, 'json');
             });
diff --git a/public/assets/js/frontend.js b/public/assets/js/frontend.js
index 1e953f4..8da1288 100644
--- a/public/assets/js/frontend.js
+++ b/public/assets/js/frontend.js
@@ -1,4 +1,4 @@
-define(['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function ($, undefined, Toastr, Layer, Config) {
+define(['jquery', 'bootstrap', 'toastr', 'layer', 'lang', 'config'], function ($, undefined, Toastr, Layer, Lang, Config) {
     var Frontend = {
         config: {
             //toastr默认配置
@@ -26,20 +26,21 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function ($, undefi
                 options = $.extend({
                     type: "POST",
                     dataType: 'json',
-                    success: function (data) {
+                    success: function (ret) {
                         Frontend.api.layer.close(index);
-                        if (data.hasOwnProperty("code")) {
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code == 0) {
+                        if (ret.hasOwnProperty("code")) {
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
                                 if (typeof success == 'function') {
-                                    var onAfterResult = success.call(undefined, content);
+                                    var onAfterResult = success.call(undefined, data);
                                     if (!onAfterResult) {
                                         return false;
                                     }
                                 }
-                                Toastr.success(content ? content : __('Operation completed'));
+                                Toastr.success(msg ? msg : __('Operation completed'));
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));
@@ -56,11 +57,25 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function ($, undefi
                 if (url.substr(0, 1) !== "/") {
                     var r = new RegExp('^(?:[a-z]+:)?//', 'i');
                     if (!r.test(url)) {
-                        url = (Config.moduleurl) + "/" + url;
+                        url = Config.moduleurl + "/" + url;
                     }
                 }
                 return url;
             },
+            //查询Url参数
+            query: function (name, url) {
+                if (!url) {
+                    url = window.location.href;
+                }
+                name = name.replace(/[\[\]]/g, "\\$&");
+                var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
+                        results = regex.exec(url);
+                if (!results)
+                    return null;
+                if (!results[2])
+                    return '';
+                return decodeURIComponent(results[2].replace(/\+/g, " "));
+            },
             //上传文件
             upload: function (file, callback) {
                 var data = new FormData();
@@ -73,14 +88,23 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function ($, undefi
                     processData: false,
                     type: 'POST',
                     dataType: 'json',
-                    success: function (data) {
-                        if (data.hasOwnProperty("code")) {
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code == 0) {
-                                $('.summernote').summernote("insertImage", data.content, 'filename');
+                    success: function (ret) {
+                        if (ret.hasOwnProperty("code")) {
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
+                                if (typeof callback == 'function') {
+                                    var onAfterResult = success.call(undefined, data);
+                                    if (!onAfterResult) {
+                                        return false;
+                                    }
+                                }
+                                if ($('.summernote').size() > 0 && data && typeof data.url !== 'undefined') {
+                                    $('.summernote').summernote("insertImage", data.url, 'filename');
+                                }
                                 Toastr.success(__('Operation completed'));
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));
@@ -152,7 +176,7 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function ($, undefi
                 }
                 return Frontend.api.layer.msg(__('Operation completed'), $.extend({
                     offset: 0, icon: 1
-                }, type ? {} : options));
+                }, type ? {} : options), callback);
             },
             error: function (options, callback) {
                 var type = typeof options === 'function';
@@ -161,7 +185,7 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function ($, undefi
                 }
                 return Frontend.api.layer.msg(__('Operation failed'), $.extend({
                     offset: 0, icon: 2
-                }, type ? {} : options));
+                }, type ? {} : options), callback);
             },
             toastr: Toastr,
             layer: Layer
@@ -170,7 +194,26 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function ($, undefi
             var args = arguments,
                     string = args[0],
                     i = 1;
-            string = Lang[string] != undefined ? Lang[string] : string;
+            string = string.toLowerCase();
+            //string = typeof Lang[string] != 'undefined' ? Lang[string] : string;
+            if (typeof Lang[string] != 'undefined') {
+                if (typeof Lang[string] == 'object')
+                    return Lang[string];
+                string = Lang[string];
+            } else if (string.indexOf('.') !== -1) {
+                var arr = string.split('.');
+                var current = Lang[arr[0]];
+                for (var i = 1; i < arr.length; i++) {
+                    current = typeof current[arr[i]] != 'undefined' ? current[arr[i]] : '';
+                    if (typeof current != 'object')
+                        break;
+                }
+                if (typeof current == 'object')
+                    return current;
+                string = current;
+            } else {
+                string = args[0];
+            }
             return string.replace(/%((%)|s|d)/g, function (m) {
                 // m is the matched format, e.g. %s, %d
                 var val = null;
@@ -199,7 +242,9 @@ define(['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function ($, undefi
     window.Toastr = Toastr;
     //将语言方法暴露到全局中去
     window.__ = Frontend.lang;
+    //将Frontend渲染至全局,以便于在子框架中调用
+    window.Frontend = Frontend;
     //Toastr定义
     Toastr.options = Frontend.config.toastr;
     return Frontend;
-});
\ No newline at end of file
+});
diff --git a/public/assets/js/require-backend.min.js b/public/assets/js/require-backend.min.js
index e2a3853..ad5a715 100644
--- a/public/assets/js/require-backend.min.js
+++ b/public/assets/js/require-backend.min.js
@@ -1939,20 +1939,21 @@ define('backend',['jquery', 'bootstrap', 'toastr', 'layer', 'lang', 'config'], f
                 options = $.extend({
                     type: "POST",
                     dataType: 'json',
-                    success: function (data) {
+                    success: function (ret) {
                         Backend.api.layer.close(index);
-                        if (data.hasOwnProperty("code")) {
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code === 1) {
+                        if (ret.hasOwnProperty("code")) {
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
                                 if (typeof success == 'function') {
-                                    var onAfterResult = success.call(undefined, content);
+                                    var onAfterResult = success.call(undefined, data);
                                     if (!onAfterResult) {
                                         return false;
                                     }
                                 }
-                                Toastr.success(content ? content : __('Operation completed'));
+                                Toastr.success(msg ? msg : __('Operation completed'));
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));
@@ -2000,14 +2001,23 @@ define('backend',['jquery', 'bootstrap', 'toastr', 'layer', 'lang', 'config'], f
                     processData: false,
                     type: 'POST',
                     dataType: 'json',
-                    success: function (data) {
-                        if (data.hasOwnProperty("code")) {
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code === 1) {
-                                $('.summernote').summernote("insertImage", data.content, 'filename');
+                    success: function (ret) {
+                        if (ret.hasOwnProperty("code")) {
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
+                                if (typeof callback == 'function') {
+                                    var onAfterResult = success.call(undefined, data);
+                                    if (!onAfterResult) {
+                                        return false;
+                                    }
+                                }
+                                if ($('.summernote').size() > 0 && data && typeof data.url !== 'undefined') {
+                                    $('.summernote').summernote("insertImage", data.url, 'filename');
+                                }
                                 Toastr.success(__('Operation completed'));
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));
@@ -7381,7 +7391,7 @@ define('table',['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'moment', 
                                     table: table.bootstrapTable('getOptions').extend.table
                                 }
                             };
-                            Backend.api.ajax(options, function (content) {
+                            Backend.api.ajax(options, function (data) {
                                 Toastr.success(__('Operation completed'));
                                 table.bootstrapTable('refresh');
                             });
@@ -7400,7 +7410,7 @@ define('table',['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'moment', 
                 var url = action == "del" ? options.extend.del_url : options.extend.multi_url;
                 url = url + "/ids/" + ($.isArray(ids) ? ids.join(",") : ids);
                 var options = {url: url, data: {action: action, ids: ids, params: element ? $(element).data("params") : ''}};
-                Backend.api.ajax(options, function (content) {
+                Backend.api.ajax(options, function (data) {
                     Toastr.success(__('Operation completed'));
                     table.bootstrapTable('refresh');
                 });
@@ -7438,6 +7448,8 @@ define('table',['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'moment', 
             // 单元格数据格式化
             formatter: {
                 icon: function (value, row, index) {
+                    if (!value)
+                        return '';
                     value = value.indexOf(" ") > -1 ? value : "fa fa-" + value;
                     //渲染fontawesome图标
                     return '<i class="' + value + '"></i> ' + value;
@@ -7564,6 +7576,7 @@ define('upload',['jquery', 'bootstrap', 'backend', 'config', 'plupload'], functi
                     var maxsize = $(this).data("maxsize");
                     var mimetype = $(this).data("mimetype");
                     var multipart = $(this).data("multipart");
+                    var multiple = $(this).data("multiple");
                     //上传URL
                     url = url ? url : Config.upload.uploadurl;
                     //最大可上传
@@ -7572,10 +7585,13 @@ define('upload',['jquery', 'bootstrap', 'backend', 'config', 'plupload'], functi
                     mimetype = mimetype ? mimetype : Config.upload.mimetype;
                     //请求的表单参数
                     multipart = multipart ? multipart : Config.upload.multipart;
+                    //是否支持批量上传
+                    multiple = multiple ? multiple : Config.upload.multiple;
+                    //生成Plupload实例
                     Upload.list[id] = new Plupload.Uploader({
                         runtimes: 'html5,flash,silverlight,html4',
-                        multi_selection: false, //是否允许多选批量上传
-                        browse_button: id, // you can pass an id...
+                        multi_selection: multiple, //是否允许多选批量上传
+                        browse_button: id, // 浏览按钮的ID
                         container: $(this).parent().get(0), //取按钮的上级元素
                         flash_swf_url: '/assets/libs/plupload/js/Moxie.swf',
                         silverlight_xap_url: '/assets/libs/plupload/js/Moxie.xap',
@@ -7612,13 +7628,13 @@ define('upload',['jquery', 'bootstrap', 'backend', 'config', 'plupload'], functi
                                 //document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML += (' [Url]: ' + '<a href="' + url + '" target="_blank">' + url + '</a>');
                                 //这里建议不修改
                                 try {
-                                    var data = JSON.parse(info.response);
-                                    if (data.hasOwnProperty('code')) {
-                                        data.code = data.code == 200 ? 0 : data.code;
-                                        if (data.hasOwnProperty("url")) {
-                                            data.content = data.url;
-                                        }
-                                        $("input[data-plupload-id='" + id + "-text']").val(data.content);
+                                    var ret = JSON.parse(info.response);
+                                    if (ret.hasOwnProperty('code')) {
+                                        ret.data = ret.code == 200 ? ret : ret.data;
+                                        ret.code = ret.code == 200 ? 1 : ret.code;
+                                        var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                                        var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                                        $("input[data-plupload-id='" + id + "-text']").val(data.url);
                                         var afterUpload = $("#" + id).data("after-upload");
                                         if (afterUpload && typeof Upload.api.custom[afterUpload] == 'function') {
                                             Upload.api.custom[afterUpload].call(info, id, data);
@@ -7656,22 +7672,21 @@ define('upload',['jquery', 'bootstrap', 'backend', 'config', 'plupload'], functi
                     processData: false,
                     type: 'POST',
                     dataType: 'json',
-                    success: function (data) {
-                        if (data.hasOwnProperty("code")) {
-                            data.code = data.code == 200 ? 1 : data.code;
-                            if (data.hasOwnProperty("url")) {
-                                data.content = data.url;
-                            }
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code === 1) {
+                    success: function (ret) {
+                        if (ret.hasOwnProperty("code")) {
+                            ret.data = ret.code == 200 ? ret : ret.data;
+                            ret.code = ret.code == 200 ? 1 : ret.code;
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
                                 // 如果回调存在,则直接调用回调
                                 if (typeof callback == 'function') {
                                     callback.call(this, data);
                                 } else {
-                                    Toastr.success(content ? content : __('Operation completed'));
+                                    Toastr.success(msg ? msg : __('Operation completed'));
                                 }
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));
@@ -8251,28 +8266,29 @@ define('form',['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'upload', '
                     url: url,
                     data: form.serialize(),
                     dataType: 'json',
-                    success: function (data) {
-                        if (data.hasOwnProperty("code")) {
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code === 1) {
+                    success: function (ret) {
+                        if (ret.hasOwnProperty("code")) {
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
                                 $('.form-group', form).removeClass('has-feedback has-success has-error');
                                 //成功提交后事件
                                 var afterSubmit = form.data("after-submit");
                                 //元素绑定函数
                                 if (afterSubmit && typeof Form.api.custom[afterSubmit] == 'function') {
-                                    if (!Form.api.custom[afterSubmit].call(form, content)) {
+                                    if (!Form.api.custom[afterSubmit].call(form, data)) {
                                         return false;
                                     }
                                 }
                                 //自定义函数
                                 if (typeof onAfterSubmit == 'function') {
-                                    if (!onAfterSubmit.call(form, content)) {
+                                    if (!onAfterSubmit.call(form, data)) {
                                         return false;
                                     }
                                 }
-                                Toastr.success(content ? content : __('Operation completed'));
+                                Toastr.success(msg ? msg : __('Operation completed'));
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));
@@ -8289,19 +8305,16 @@ define('form',['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'upload', '
                     if (e.isDefaultPrevented()) {
                         //验证不通过
                         Toastr.error("验证失败,请检查表单输入是否正确");
-                        //Backend.api.error();
                     } else {
                         //验证通过提交表单
-                        Form.api.submit(form, onBeforeSubmit, function (content) {
+                        Form.api.submit(form, onBeforeSubmit, function (data) {
                             if (typeof onAfterSubmit == 'function') {
-                                if (!onAfterSubmit.call(form, content)) {
+                                if (!onAfterSubmit.call(form, data)) {
                                     return false;
                                 }
                             }
                             //提示及关闭当前窗口
-                            parent.Layer.msg(__('Operation completed'), {
-                                offset: 0, icon: 1
-                            });
+                            parent.Toastr.success(__('Operation completed'));
                             parent.$(".btn-refresh").trigger("click");
                             var index = parent.Layer.getFrameIndex(window.name);
                             parent.Layer.close(index);
@@ -8336,8 +8349,8 @@ define('form',['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'upload', '
                                 remote: {
                                     url: '/ajax/typeahead?search=%QUERY&field=' + $(input).attr("name"),
                                     wildcard: '%QUERY',
-                                    transform: function (data) {
-                                        return data.content.searchlist;
+                                    transform: function (ret) {
+                                        return ret.data.searchlist;
                                     }
                                 }
                             });
@@ -8437,7 +8450,7 @@ define('form',['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'upload', '
                                     //依次上传图片
                                     for (var i = 0; i < files.length; i++) {
                                         Upload.api.send(files[i], function (data) {
-                                            var url = Config.upload.cdnurl + data.content;
+                                            var url = Config.upload.cdnurl + data.url;
                                             $(that).summernote("insertImage", url, 'filename');
                                         });
                                     }
diff --git a/public/assets/js/require-form.js b/public/assets/js/require-form.js
index f673e3c..618d137 100755
--- a/public/assets/js/require-form.js
+++ b/public/assets/js/require-form.js
@@ -29,28 +29,29 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'upload', 'bootstr
                     url: url,
                     data: form.serialize(),
                     dataType: 'json',
-                    success: function (data) {
-                        if (data.hasOwnProperty("code")) {
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code === 1) {
+                    success: function (ret) {
+                        if (ret.hasOwnProperty("code")) {
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
                                 $('.form-group', form).removeClass('has-feedback has-success has-error');
                                 //成功提交后事件
                                 var afterSubmit = form.data("after-submit");
                                 //元素绑定函数
                                 if (afterSubmit && typeof Form.api.custom[afterSubmit] == 'function') {
-                                    if (!Form.api.custom[afterSubmit].call(form, content)) {
+                                    if (!Form.api.custom[afterSubmit].call(form, data)) {
                                         return false;
                                     }
                                 }
                                 //自定义函数
                                 if (typeof onAfterSubmit == 'function') {
-                                    if (!onAfterSubmit.call(form, content)) {
+                                    if (!onAfterSubmit.call(form, data)) {
                                         return false;
                                     }
                                 }
-                                Toastr.success(content ? content : __('Operation completed'));
+                                Toastr.success(msg ? msg : __('Operation completed'));
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));
@@ -67,19 +68,16 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'upload', 'bootstr
                     if (e.isDefaultPrevented()) {
                         //验证不通过
                         Toastr.error("验证失败,请检查表单输入是否正确");
-                        //Backend.api.error();
                     } else {
                         //验证通过提交表单
-                        Form.api.submit(form, onBeforeSubmit, function (content) {
+                        Form.api.submit(form, onBeforeSubmit, function (data) {
                             if (typeof onAfterSubmit == 'function') {
-                                if (!onAfterSubmit.call(form, content)) {
+                                if (!onAfterSubmit.call(form, data)) {
                                     return false;
                                 }
                             }
                             //提示及关闭当前窗口
-                            parent.Layer.msg(__('Operation completed'), {
-                                offset: 0, icon: 1
-                            });
+                            parent.Toastr.success(__('Operation completed'));
                             parent.$(".btn-refresh").trigger("click");
                             var index = parent.Layer.getFrameIndex(window.name);
                             parent.Layer.close(index);
@@ -114,8 +112,8 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'upload', 'bootstr
                                 remote: {
                                     url: '/ajax/typeahead?search=%QUERY&field=' + $(input).attr("name"),
                                     wildcard: '%QUERY',
-                                    transform: function (data) {
-                                        return data.content.searchlist;
+                                    transform: function (ret) {
+                                        return ret.data.searchlist;
                                     }
                                 }
                             });
@@ -215,7 +213,7 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'upload', 'bootstr
                                     //依次上传图片
                                     for (var i = 0; i < files.length; i++) {
                                         Upload.api.send(files[i], function (data) {
-                                            var url = Config.upload.cdnurl + data.content;
+                                            var url = Config.upload.cdnurl + data.url;
                                             $(that).summernote("insertImage", url, 'filename');
                                         });
                                     }
diff --git a/public/assets/js/require-frontend.min.js b/public/assets/js/require-frontend.min.js
index a8b521c..87f947a 100644
--- a/public/assets/js/require-frontend.min.js
+++ b/public/assets/js/require-frontend.min.js
@@ -1912,7 +1912,7 @@ window.layui && layui.define ? (
     }
 }));
 
-define('frontend',['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function ($, undefined, Toastr, Layer, Config) {
+define('frontend',['jquery', 'bootstrap', 'toastr', 'layer', 'lang', 'config'], function ($, undefined, Toastr, Layer, Lang, Config) {
     var Frontend = {
         config: {
             //toastr默认配置
@@ -1940,20 +1940,21 @@ define('frontend',['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function
                 options = $.extend({
                     type: "POST",
                     dataType: 'json',
-                    success: function (data) {
+                    success: function (ret) {
                         Frontend.api.layer.close(index);
-                        if (data.hasOwnProperty("code")) {
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code == 0) {
+                        if (ret.hasOwnProperty("code")) {
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
                                 if (typeof success == 'function') {
-                                    var onAfterResult = success.call(undefined, content);
+                                    var onAfterResult = success.call(undefined, data);
                                     if (!onAfterResult) {
                                         return false;
                                     }
                                 }
-                                Toastr.success(content ? content : __('Operation completed'));
+                                Toastr.success(msg ? msg : __('Operation completed'));
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));
@@ -1970,11 +1971,25 @@ define('frontend',['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function
                 if (url.substr(0, 1) !== "/") {
                     var r = new RegExp('^(?:[a-z]+:)?//', 'i');
                     if (!r.test(url)) {
-                        url = (Config.moduleurl) + "/" + url;
+                        url = Config.moduleurl + "/" + url;
                     }
                 }
                 return url;
             },
+            //查询Url参数
+            query: function (name, url) {
+                if (!url) {
+                    url = window.location.href;
+                }
+                name = name.replace(/[\[\]]/g, "\\$&");
+                var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
+                        results = regex.exec(url);
+                if (!results)
+                    return null;
+                if (!results[2])
+                    return '';
+                return decodeURIComponent(results[2].replace(/\+/g, " "));
+            },
             //上传文件
             upload: function (file, callback) {
                 var data = new FormData();
@@ -1987,14 +2002,23 @@ define('frontend',['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function
                     processData: false,
                     type: 'POST',
                     dataType: 'json',
-                    success: function (data) {
-                        if (data.hasOwnProperty("code")) {
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code == 0) {
-                                $('.summernote').summernote("insertImage", data.content, 'filename');
+                    success: function (ret) {
+                        if (ret.hasOwnProperty("code")) {
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
+                                if (typeof callback == 'function') {
+                                    var onAfterResult = success.call(undefined, data);
+                                    if (!onAfterResult) {
+                                        return false;
+                                    }
+                                }
+                                if ($('.summernote').size() > 0 && data && typeof data.url !== 'undefined') {
+                                    $('.summernote').summernote("insertImage", data.url, 'filename');
+                                }
                                 Toastr.success(__('Operation completed'));
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));
@@ -2066,7 +2090,7 @@ define('frontend',['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function
                 }
                 return Frontend.api.layer.msg(__('Operation completed'), $.extend({
                     offset: 0, icon: 1
-                }, type ? {} : options));
+                }, type ? {} : options), callback);
             },
             error: function (options, callback) {
                 var type = typeof options === 'function';
@@ -2075,7 +2099,7 @@ define('frontend',['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function
                 }
                 return Frontend.api.layer.msg(__('Operation failed'), $.extend({
                     offset: 0, icon: 2
-                }, type ? {} : options));
+                }, type ? {} : options), callback);
             },
             toastr: Toastr,
             layer: Layer
@@ -2084,7 +2108,26 @@ define('frontend',['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function
             var args = arguments,
                     string = args[0],
                     i = 1;
-            string = Lang[string] != undefined ? Lang[string] : string;
+            string = string.toLowerCase();
+            //string = typeof Lang[string] != 'undefined' ? Lang[string] : string;
+            if (typeof Lang[string] != 'undefined') {
+                if (typeof Lang[string] == 'object')
+                    return Lang[string];
+                string = Lang[string];
+            } else if (string.indexOf('.') !== -1) {
+                var arr = string.split('.');
+                var current = Lang[arr[0]];
+                for (var i = 1; i < arr.length; i++) {
+                    current = typeof current[arr[i]] != 'undefined' ? current[arr[i]] : '';
+                    if (typeof current != 'object')
+                        break;
+                }
+                if (typeof current == 'object')
+                    return current;
+                string = current;
+            } else {
+                string = args[0];
+            }
             return string.replace(/%((%)|s|d)/g, function (m) {
                 // m is the matched format, e.g. %s, %d
                 var val = null;
@@ -2113,7 +2156,10 @@ define('frontend',['jquery', 'bootstrap', 'toastr', 'layer', 'config'], function
     window.Toastr = Toastr;
     //将语言方法暴露到全局中去
     window.__ = Frontend.lang;
+    //将Frontend渲染至全局,以便于在子框架中调用
+    window.Frontend = Frontend;
     //Toastr定义
     Toastr.options = Frontend.config.toastr;
     return Frontend;
 });
+
diff --git a/public/assets/js/require-table.js b/public/assets/js/require-table.js
index 96da3b3..4a1decb 100644
--- a/public/assets/js/require-table.js
+++ b/public/assets/js/require-table.js
@@ -196,7 +196,7 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'moment', 'bootstr
                                     table: table.bootstrapTable('getOptions').extend.table
                                 }
                             };
-                            Backend.api.ajax(options, function (content) {
+                            Backend.api.ajax(options, function (data) {
                                 Toastr.success(__('Operation completed'));
                                 table.bootstrapTable('refresh');
                             });
@@ -215,7 +215,7 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'moment', 'bootstr
                 var url = action == "del" ? options.extend.del_url : options.extend.multi_url;
                 url = url + "/ids/" + ($.isArray(ids) ? ids.join(",") : ids);
                 var options = {url: url, data: {action: action, ids: ids, params: element ? $(element).data("params") : ''}};
-                Backend.api.ajax(options, function (content) {
+                Backend.api.ajax(options, function (data) {
                     Toastr.success(__('Operation completed'));
                     table.bootstrapTable('refresh');
                 });
diff --git a/public/assets/js/require-upload.js b/public/assets/js/require-upload.js
index e2571ea..c5d1826 100755
--- a/public/assets/js/require-upload.js
+++ b/public/assets/js/require-upload.js
@@ -67,19 +67,19 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'plupload'], function ($, un
                                 //document.getElementById(file.id).getElementsByTagName('b')[0].innerHTML += (' [Url]: ' + '<a href="' + url + '" target="_blank">' + url + '</a>');
                                 //这里建议不修改
                                 try {
-                                    var response = JSON.parse(info.response);
-                                    if (response.hasOwnProperty('code')) {
-                                        response.code = response.code == 200 ? 1 : response.code;
-                                        if (response.hasOwnProperty("url")) {
-                                            response.data = response.url;
-                                        }
-                                        $("input[data-plupload-id='" + id + "-text']").val(response.data);
+                                    var ret = JSON.parse(info.response);
+                                    if (ret.hasOwnProperty('code')) {
+                                        ret.data = ret.code == 200 ? ret : ret.data;
+                                        ret.code = ret.code == 200 ? 1 : ret.code;
+                                        var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                                        var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                                        $("input[data-plupload-id='" + id + "-text']").val(data.url);
                                         var afterUpload = $("#" + id).data("after-upload");
                                         if (afterUpload && typeof Upload.api.custom[afterUpload] == 'function') {
-                                            Upload.api.custom[afterUpload].call(info, id, response);
+                                            Upload.api.custom[afterUpload].call(info, id, data);
                                         }
                                         if (typeof onAfterUpload == 'function') {
-                                            onAfterUpload.call(info, id, response);
+                                            onAfterUpload.call(info, id, data);
                                         }
                                     } else {
                                         Toastr.error(e.message + "(code:-2)");
@@ -111,22 +111,21 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'plupload'], function ($, un
                     processData: false,
                     type: 'POST',
                     dataType: 'json',
-                    success: function (data) {
-                        if (data.hasOwnProperty("code")) {
-                            data.code = data.code == 200 ? 1 : data.code;
-                            if (data.hasOwnProperty("url")) {
-                                data.content = data.url;
-                            }
-                            var content = data.hasOwnProperty("content") && data.content != "" ? data.content : "";
-                            if (data.code === 1) {
+                    success: function (ret) {
+                        if (ret.hasOwnProperty("code")) {
+                            ret.data = ret.code == 200 ? ret : ret.data;
+                            ret.code = ret.code == 200 ? 1 : ret.code;
+                            var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
+                            var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
+                            if (ret.code === 1) {
                                 // 如果回调存在,则直接调用回调
                                 if (typeof callback == 'function') {
                                     callback.call(this, data);
                                 } else {
-                                    Toastr.success(content ? content : __('Operation completed'));
+                                    Toastr.success(msg ? msg : __('Operation completed'));
                                 }
                             } else {
-                                Toastr.error(content ? content : __('Operation failed'));
+                                Toastr.error(msg ? msg : __('Operation failed'));
                             }
                         } else {
                             Toastr.error(__('Unknown data format'));