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'));