Merge remote-tracking branch 'karson/master'

pull/8/head
pppscn 2019-01-13 17:24:07 +08:00
commit eed5a6fa13
20 changed files with 102 additions and 342 deletions

1
.gitignore vendored
View File

@ -14,3 +14,4 @@ composer.lock
!.gitkeep
.env
/.svn
.vscode

View File

@ -23,8 +23,8 @@ FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架。
* 共用同一账号体系的Web端会员中心权限验证和API接口会员权限验证
* 二级域名部署支持,同时域名支持绑定到插件
* 多语言支持,服务端及客户端支持
* 强大的第三方模块支持([CMS](https://www.fastadmin.net/store/cms.html)、[博客](https://www.fastadmin.net/store/blog.html)、[文档生成](https://www.fastadmin.net/store/docs.html)、[个人免签支付](https://www.fastadmin.net/store/pay.html))
* 整合第三方短信接口(阿里云、创蓝短信)
* 强大的第三方模块支持([CMS](https://www.fastadmin.net/store/cms.html)、[博客](https://www.fastadmin.net/store/blog.html)、[文档生成](https://www.fastadmin.net/store/docs.html))
* 整合第三方短信接口(阿里云、腾讯云短信)
* 无缝整合第三方云存储(七牛、阿里云OSS、又拍云)功能
* 第三方富文本编辑器支持(Summernote、Tinymce、百度编辑器)
* 第三方登录(QQ、微信、微博)整合
@ -53,7 +53,7 @@ https://demo.fastadmin.net
交流社区: https://forum.fastadmin.net
QQ群: [636393962](https://jq.qq.com/?_wv=1027&k=487PNBb)(交流群①) [708784003](https://jq.qq.com/?_wv=1027&k=5ObjtwM)(交流群②) [696992864](https://jq.qq.com/?_wv=1027&k=5R2AB00)(高级群,邀请加入)
QQ群: [636393962](https://jq.qq.com/?_wv=1027&k=487PNBb)(满) [708784003](https://jq.qq.com/?_wv=1027&k=5ObjtwM)(满) [964776039](https://jq.qq.com/?_wv=1027&k=59qjU2P)(3群)
Email: (karsonzhang#163.com, 把#换成@)

View File

@ -28,23 +28,6 @@
<a href="__PUBLIC__" target="_blank"><i class="fa fa-home" style="font-size:14px;"></i></a>
</li>
<li class="dropdown notifications-menu hidden-xs">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-bell-o"></i>
<span class="label label-warning"></span>
</a>
<ul class="dropdown-menu">
<li class="header">{:__('Latest news')}</li>
<li>
<!-- FastAdmin最新更新信息,你可以替换成你自己站点的信息,请注意修改public/assets/js/backend/index.js文件 -->
<ul class="menu">
</ul>
</li>
<li class="footer"><a href="#" target="_blank">{:__('View more')}</a></li>
</ul>
</li>
<!-- 账号信息下拉框 -->
<li class="hidden-xs">
<a href="javascript:;" data-toggle="checkupdate" title="{:__('Check for updates')}">

View File

@ -335,6 +335,7 @@
</div>
</div>
<!--如果需要删除最新新闻和最新发贴删除HTML后还需要删除dashboard.js中的代码-->
<div class="row">
<div class="col-lg-4">
<div class="box box-danger">

View File

@ -72,7 +72,7 @@
</div>
<div class="form-group">
<label for="password" class="control-label">{:__('Password')}:</label>
<input type="text" class="form-control" id="password" placeholder="{:__('Leave password blank if dont want to change')}" autocomplete="new-password" name="row[password]" value=""/>
<input type="password" class="form-control" id="password" placeholder="{:__('Leave password blank if dont want to change')}" autocomplete="new-password" name="row[password]" value="" data-rule="password"/>
</div>
<div class="form-group">
<button type="submit" class="btn btn-success">{:__('Submit')}</button>

View File

@ -81,7 +81,7 @@
<div class="input-group-addon"><span class="glyphicon glyphicon-option-horizontal" aria-hidden="true"></span></div>
<input type="text" name="captcha" class="form-control" placeholder="{:__('Captcha')}" data-rule="{:__('Captcha')}:required;length(4)" />
<span class="input-group-addon" style="padding:0;border:none;cursor:pointer;">
<img src="{:rtrim('__PUBLIC__', '/')}/captcha" width="100" height="30" onclick="this.src = '{:rtrim('__PUBLIC__', '/')}/captcha?r=' + Math.random();"/>
<img src="{:rtrim('__PUBLIC__', '/')}/index.php?s=/captcha" width="100" height="30" onclick="this.src = '{:rtrim('__PUBLIC__', '/')}/index.php?s=/captcha&r=' + Math.random();"/>
</span>
</div>
{/if}

View File

@ -320,7 +320,7 @@ class Backend extends Controller
case 'NOT BETWEEN':
$arr = array_slice(explode(',', $v), 0, 2);
if (stripos($v, ',') === false || !array_filter($arr))
continue;
continue 2;
//当出现一边为空时改变操作符
if ($arr[0] === '') {
$sym = $sym == 'BETWEEN' ? '<=' : '>';
@ -336,7 +336,7 @@ class Backend extends Controller
$v = str_replace(' - ', ',', $v);
$arr = array_slice(explode(',', $v), 0, 2);
if (stripos($v, ',') === false || !array_filter($arr))
continue;
continue 2;
//当出现一边为空时改变操作符
if ($arr[0] === '') {
$sym = $sym == 'RANGE' ? '<=' : '>';

View File

@ -272,7 +272,7 @@ return [
//自动检测更新
'checkupdate' => false,
//版本号
'version' => '1.0.0.20181127_beta',
'version' => '1.0.0.20190111_beta',
//API接口地址
'api_url' => 'https://api.fastadmin.net',
],

View File

@ -4,47 +4,8 @@ return array (
'autoload' => false,
'hooks' =>
array (
'sms_send' =>
array (
0 => 'alisms',
),
'sms_notice' =>
array (
0 => 'alisms',
),
'sms_check' =>
array (
0 => 'alisms',
),
'addon_after_upgrade' =>
array (
0 => 'cms',
),
'app_init' =>
array (
0 => 'epay',
),
'login_init' =>
array (
0 => 'loginbg',
),
),
'route' =>
array (
'/cms$' => 'cms/index/index',
'/cms/c/[:diyname]' => 'cms/channel/index',
'/cms/t/[:name]' => 'cms/tags/index',
'/cms/a/[:diyname]' => 'cms/archives/index',
'/cms/p/[:diyname]' => 'cms/page/index',
'/cms/s' => 'cms/search/index',
'/docs/api' => 'docs/index/api',
'/docs/[:name]' => 'docs/index/index',
'/example$' => 'example/index/index',
'/example/d/[:name]' => 'example/demo/index',
'/example/d1/[:name]' => 'example/demo/demo1',
'/example/d2/[:name]' => 'example/demo/demo2',
'/third$' => 'third/index/index',
'/third/connect/[:platform]' => 'third/index/connect',
'/third/callback/[:platform]' => 'third/index/callback',
),
);

View File

@ -6,7 +6,7 @@
"fastadmin",
"thinkphp"
],
"homepage": "http://www.fastadmin.net/",
"homepage": "https://www.fastadmin.net/",
"license": "Apache-2.0",
"authors": [
{
@ -16,7 +16,7 @@
],
"require": {
"php": ">=5.4.0",
"topthink/framework": "~5.0.14",
"topthink/framework": "~5.0.24",
"overtrue/wechat": "~3.1",
"endroid/qr-code": "^1.9",
"topthink/think-captcha": "^1.0",

View File

@ -863,7 +863,7 @@ table.table-nowrap thead > tr > th {
}
.layui-layer-fast .layui-layer-setwin .layui-layer-close2,
.layui-layer-fast .layui-layer-setwin .layui-layer-close2:hover {
background: url('../libs/layer/dist/theme/default/icon.png') no-repeat -149px -31px !important;
background: url('../libs/fastadmin-layer/dist/theme/default/icon.png') no-repeat -149px -31px !important;
top: -30px;
right: -30px;
}

File diff suppressed because one or more lines are too long

View File

@ -1,217 +1,3 @@
define([], function () {
require([], function () {
//绑定data-toggle=addresspicker属性点击事件
$(document).on('click', "[data-toggle='addresspicker']", function () {
var that = this;
var callback = $(that).data('callback');
var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";
var lat_id = $(that).data("lat-id") ? $(that).data("lat-id") : "";
var lng_id = $(that).data("lng-id") ? $(that).data("lng-id") : "";
var lat = lat_id ? $("#" + lat_id).val() : '';
var lng = lng_id ? $("#" + lng_id).val() : '';
var url = "/addons/address/index/select";
url += (lat && lng) ? '?lat=' + lat + '&lng=' + lng : '';
Fast.api.open(url, '位置选择', {
callback: function (res) {
input_id && $("#" + input_id).val(res.address);
lat_id && $("#" + lat_id).val(res.lat);
lng_id && $("#" + lng_id).val(res.lng);
try {
//执行回调函数
if (typeof callback === 'function') {
callback.call(that, res);
}
} catch (e) {
}
}
});
});
});
require.config({
paths: {
'fullcalendar': '../libs/fullcalendar/dist/fullcalendar',
'fullcalendar-lang': '../libs/fullcalendar/dist/locale/zh-cn',
},
// shim依赖配置
shim: {
'fullcalendar-lang': ['fullcalendar'],
},
});
require.config({
paths: {
'async': '../addons/example/js/async',
'BMap': ['//api.map.baidu.com/api?v=2.0&ak=mXijumfojHnAaN2VxpBGoqHM'],
},
shim: {
'BMap': {
deps: ['jquery'],
exports: 'BMap'
}
}
});
//修改验证码为检验验证
require.config({
paths: {
'geet': '../addons/geet/js/gt'
}
});
require(['geet'], function (Geet) {
var geetInit = false;
$("input[name='captcha']").each(function () {
var obj = $(this);
var form = obj.closest('form');
$("<input type='hidden' name='geeturl' value='" + (form.attr("action") ? form.attr("action") : location.pathname + location.search) + "' />").appendTo(form);
$("<input type='hidden' name='geetmodule' value='" + Config.modulename + "' />").appendTo(form);
$("<input type='hidden' name='geetmoduleurl' value='" + Config.moduleurl + "' />").appendTo(form);
form.attr('action', Fast.api.fixurl('/addons/geet/index/check'));
obj.parent().removeClass('input-group').addClass('form-group').html('<div id="embed-captcha"><input type="hidden" name="captcha" class="form-control" data-rule="请完成验证码,验证码:required;" /> </div> <p id="wait" class="show">正在加载验证码......</p>');
var handlerEmbed = function (captchaObj) {
// 将验证码加到id为captcha的元素里同时会有三个input的值geetest_challenge, geetest_validate, geetest_seccode
geetInit = captchaObj;
captchaObj.appendTo("#embed-captcha");
captchaObj.onReady(function () {
$("#wait")[0].className = "hide";
});
captchaObj.onSuccess(function () {
var result = captchaObj.getValidate();
if (result) {
$('#embed-captcha input[name="captcha"]').val('ok');
}
});
// 更多接口参考http://www.geetest.com/install/sections/idx-client-sdk.html
};
Fast.api.ajax("/addons/geet/index/start", function (data) {
// 更多配置参数请参见http://www.geetest.com/install/sections/idx-client-sdk.html#config
// 使用initGeetest接口
// 参数1配置参数
// 参数2回调回调的第一个参数验证码对象之后可以使用它做appendTo之类的事件
initGeetest({
gt: data.gt,
challenge: data.challenge,
new_captcha: data.new_captcha,
product: "embed", // 产品形式包括floatembedpopup。注意只对PC版验证码有效
width: '100%',
offline: !data.success // 表示用户后台检测极验服务器是否宕机,一般不需要关注
}, handlerEmbed);
form.on("error.form", function (e, data) {
geetInit.reset();
});
return false;
});
});
});
window.UMEDITOR_HOME_URL = Config.__CDN__ + "/assets/addons/umeditor/";
require.config({
paths: {
'umeditor': '../addons/umeditor/umeditor.min',
'umeditor.config': '../addons/umeditor/umeditor.config',
'umeditor.lang': '../addons/umeditor/lang/zh-cn/zh-cn',
},
shim: {
'umeditor': {
deps: [
'umeditor.config',
'css!../addons/umeditor/themes/default/css/umeditor.css'
],
exports: 'UM',
},
'umeditor.lang': ['umeditor']
}
});
//修改上传的接口调用
require(['upload', 'umeditor', 'umeditor.lang'], function (Upload, UME, undefined) {
//监听上传文本框的事件
$(document).on("edui.file.change", ".edui-image-file", function (e, up, me, input, callback) {
for (var i = 0; i < this.files.length; i++) {
Upload.api.send(this.files[i], function (data) {
var url = data.url;
me.uploadComplete(JSON.stringify({url: url, state: "SUCCESS"}));
});
}
up.updateInput(input);
me.toggleMask("Loading....");
callback && callback();
});
//重写编辑器加载
UME.plugins['autoupload'] = function () {
var me = this;
me.setOpt('pasteImageEnabled', true);
me.setOpt('dropFileEnabled', true);
var sendAndInsertImage = function (file, editor) {
try {
Upload.api.send(file, function (data) {
var url = data.url;
editor.execCommand('insertimage', {
src: url,
_src: url
});
});
} catch (er) {
}
};
function getPasteImage(e) {
return e.clipboardData && e.clipboardData.items && e.clipboardData.items.length == 1 && /^image\//.test(e.clipboardData.items[0].type) ? e.clipboardData.items : null;
}
function getDropImage(e) {
return e.dataTransfer && e.dataTransfer.files ? e.dataTransfer.files : null;
}
me.addListener('ready', function () {
if (window.FormData && window.FileReader) {
var autoUploadHandler = function (e) {
var hasImg = false,
items;
//获取粘贴板文件列表或者拖放文件列表
items = e.type == 'paste' ? getPasteImage(e.originalEvent) : getDropImage(e.originalEvent);
if (items) {
var len = items.length,
file;
while (len--) {
file = items[len];
if (file.getAsFile)
file = file.getAsFile();
if (file && file.size > 0 && /image\/\w+/i.test(file.type)) {
sendAndInsertImage(file, me);
hasImg = true;
}
}
if (hasImg)
return false;
}
};
me.getOpt('pasteImageEnabled') && me.$body.on('paste', autoUploadHandler);
me.getOpt('dropFileEnabled') && me.$body.on('drop', autoUploadHandler);
//取消拖放图片时出现的文字光标位置提示
me.$body.on('dragover', function (e) {
if (e.originalEvent.dataTransfer.types[0] == 'Files') {
return false;
}
});
}
});
};
$(".editor").each(function () {
var id = $(this).attr("id");
$(this).removeClass('form-control');
UME.list[id] = UME.getEditor(id, {
serverUrl: Fast.api.fixurl('/addons/umeditor/api/'),
initialFrameWidth: '100%',
zIndex: 90,
xssFilterRules: false,
outputXssFilter: false,
inputXssFilter: false,
imageUrl: '',
imagePath: Config.upload.cdnurl
});
});
});
});

View File

@ -178,6 +178,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
if (!userinfo) {
Layer.open({
content: Template("logintpl", {}),
zIndex: 99,
area: ['430px', '350px'],
title: __('Login FastAdmin'),
resize: false,
@ -196,7 +197,6 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
Layer.closeAll();
Layer.alert(ret.msg);
}, function (data, ret) {
Layer.alert(ret.msg);
});
},
btn2: function () {

View File

@ -52,21 +52,6 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form'], functi
Backend.api.addtabs($(this).data("url"));
});
//读取FastAdmin的更新信息
$.ajax({
url: Config.fastadmin.api_url + '/news/index',
type: 'post',
dataType: 'jsonp',
success: function (ret) {
$(".notifications-menu > a span").text(ret.new > 0 ? ret.new : '');
$(".notifications-menu .footer a").attr("href", ret.url);
$.each(ret.newslist, function (i, j) {
var item = '<li><a href="' + j.url + '" target="_blank"><i class="' + j.icon + '"></i> ' + j.title + '</a></li>';
$(item).appendTo($(".notifications-menu ul.menu"));
});
}
});
//读取首次登录推荐插件列表
if (localStorage.getItem("fastep") == "installed") {
$.ajax({
@ -203,7 +188,6 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form'], functi
}
});
var multiplenav = Config.fastadmin.multiplenav;
var firstnav = $("#firstnav .nav-addtabs");
var nav = multiplenav ? $("#secondnav .nav-addtabs") : firstnav;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -556,8 +556,9 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
type = typeof type === 'undefined' ? 'buttons' : type;
var options = table ? table.bootstrapTable('getOptions') : {};
var html = [];
var hidden, visible, disable, url, classname, icon, text, title, refresh, confirm, extend, click;
var hidden, visible, disable, url, classname, icon, text, title, refresh, confirm, extend, click, dropdown, link;
var fieldIndex = column.fieldIndex;
var dropdowns = {};
$.each(buttons, function (i, j) {
if (type === 'operate') {
@ -578,6 +579,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
if (!visible) {
return true;
}
dropdown = j.dropdown ? j.dropdown : '';
url = j.url ? j.url : '';
url = typeof url === 'function' ? url.call(table, row, j) : (url ? Fast.api.fixurl(Table.api.replaceurl(url, row, table)) : 'javascript:;');
classname = j.classname ? j.classname : 'btn-primary btn-' + name + 'one';
@ -591,9 +593,24 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
if (disable) {
classname = classname + ' disabled';
}
html.push('<a href="' + url + '" class="' + classname + '" ' + (confirm ? confirm + ' ' : '') + (refresh ? refresh + ' ' : '') + extend + ' title="' + title + '" data-table-id="' + (table ? table.attr("id") : '') + '" data-field-index="' + fieldIndex + '" data-row-index="' + index + '" data-button-index="' + i + '"><i class="' + icon + '"></i>' + (text ? ' ' + text : '') + '</a>');
link = '<a href="' + url + '" class="' + classname + '" ' + (confirm ? confirm + ' ' : '') + (refresh ? refresh + ' ' : '') + extend + ' title="' + title + '" data-table-id="' + (table ? table.attr("id") : '') + '" data-field-index="' + fieldIndex + '" data-row-index="' + index + '" data-button-index="' + i + '"><i class="' + icon + '"></i>' + (text ? ' ' + text : '') + '</a>';
if (dropdown) {
if (typeof dropdowns[dropdown] == 'undefined') {
dropdowns[dropdown] = [];
}
dropdowns[dropdown].push(link);
} else {
html.push(link);
}
}
});
if (!$.isEmptyObject(dropdowns)) {
var dropdownHtml = [];
$.each(dropdowns, function (i, j) {
dropdownHtml.push('<div class="btn-group"><button type="button" class="btn btn-primary dropdown-toggle btn-xs" data-toggle="dropdown">' + i + '</button><button type="button" class="btn btn-primary dropdown-toggle btn-xs" data-toggle="dropdown"><span class="caret"></span></button><ul class="dropdown-menu pull-right"><li>' + j.join('</li><li>') + '</li></ul></div>');
});
html.unshift(dropdownHtml);
}
return html.join(' ');
},
//替换URL中的数据

View File

@ -199,6 +199,7 @@ define(['jquery', 'bootstrap', 'plupload', 'template'], function ($, undefined,
container: $(this).parent().get(0), //取按钮的上级元素
flash_swf_url: '/assets/libs/plupload/js/Moxie.swf',
silverlight_xap_url: '/assets/libs/plupload/js/Moxie.xap',
drop_element: [id, $(this).data("input-id")],
filters: {
max_file_size: maxsize,
mime_types: mimetype,

View File

@ -122,8 +122,8 @@ if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') {
} else if (strlen($adminUsername) < 3 || strlen($adminUsername) > 12) {
echo "用户名请输入3~12位字符";
exit;
} else if (strlen($adminPassword) < 6 || strlen($adminPassword) > 16) {
echo "密码请输入6~16位字符";
} else if (strlen($adminPassword) < 6 || strlen($adminPassword) > 16 || stripos($adminPassword, ' ') !== false) {
echo "密码请输入6~16位字符,不能包含空格";
exit;
}
try {