diff --git a/.gitignore b/.gitignore index 0bf2f20..64a8884 100755 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,6 @@ composer.lock thinkphp vendor runtime -public/assets/libs/ \ No newline at end of file +public/assets/libs/ +/application/admin/command/Install/*.lock +/public/uploads diff --git a/application/admin/command/Install/fastadmin.sql b/application/admin/command/Install/fastadmin.sql index 82ced9c..daa036e 100644 --- a/application/admin/command/Install/fastadmin.sql +++ b/application/admin/command/Install/fastadmin.sql @@ -93,7 +93,9 @@ CREATE TABLE `fa_attachment` ( `createtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建日期', `updatetime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间', `uploadtime` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '上传时间', - PRIMARY KEY (`id`) + `sha1` varchar(40) NOT NULL DEFAULT '' COMMENT '文件 sha1编码', + PRIMARY KEY (`id`), + UNIQUE KEY `sha1` (`sha1`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='附件表'; -- ---------------------------- diff --git a/application/admin/controller/Ajax.php b/application/admin/controller/Ajax.php index 0ccfe78..b9ebaf5 100644 --- a/application/admin/controller/Ajax.php +++ b/application/admin/controller/Ajax.php @@ -9,6 +9,7 @@ use fast\Tree; use think\Config; use think\Db; use think\Lang; +use think\Cache; /** * Ajax异步请求接口 @@ -183,6 +184,16 @@ class Ajax extends Backend { $this->code = -1; $file = $this->request->file('file'); + + //判断是否已经存在附件 + $sha1 = $file->hash(); + $uploaded = model("attachment")->where('sha1',$sha1)->find(); + if($uploaded){ + $this->code = 200; + $this->data = $uploaded['url']; + return; + } + $upload = Config::get('upload'); preg_match('/(\d+)(\w+)/', $upload['maxsize'], $matches); @@ -230,7 +241,8 @@ class Ajax extends Backend 'imageframes' => 0, 'mimetype' => $fileInfo['type'], 'url' => $uploadDir . $splInfo->getSaveName(), - 'uploadtime' => time() + 'uploadtime' => time(), + 'sha1' => $sha1, ); model("attachment")->create(array_filter($params)); $this->code = 200; @@ -328,4 +340,25 @@ class Ajax extends Backend } } + /** + * 清空系统缓存 + */ + public function wipeCache() + { + $wipe_cache_type = ['TEMP_PATH', 'LOG_PATH', 'CACHE_PATH']; + foreach ($wipe_cache_type as $item) { + if ($item == 'LOG_PATH') { + $dirs = (array) glob(constant($item) . '*'); + foreach ($dirs as $dir) { + array_map('unlink', (array) glob($dir . DIRECTORY_SEPARATOR . '*.*')); + } + array_map('rmdir', $dirs); + } else { + array_map('unlink', (array) glob(constant($item) . DIRECTORY_SEPARATOR . '*.*')); + } + } + Cache::clear(); + $this->success('清空系统缓存成功!'); + } + } diff --git a/application/admin/view/common/header.html b/application/admin/view/common/header.html index 839fdcc..8e99d6a 100644 --- a/application/admin/view/common/header.html +++ b/application/admin/view/common/header.html @@ -43,6 +43,12 @@ </li> <li> + <a href="javascript:;" data-toggle="wipeCache" title="清空缓存"> + <i class="fa fa-trash"></i> + </a> + </li> + + <li> <a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-language"></i></a> <ul class="dropdown-menu"> <li class="{$config['language']=='zh-cn'?'active':''}"> diff --git a/application/common/controller/Backend.php b/application/common/controller/Backend.php index b379b1f..82a2272 100644 --- a/application/common/controller/Backend.php +++ b/application/common/controller/Backend.php @@ -162,7 +162,7 @@ class Backend extends Controller $sort = $this->request->get("sort", "id"); $order = $this->request->get("order", "DESC"); $offset = $this->request->get("offset", 0); - $limit = $this->request->get("limit", 10); + $limit = $this->request->get("limit", 0); $filter = json_decode($filter, TRUE); $op = json_decode($op, TRUE); $filter = $filter ? $filter : []; diff --git a/application/extra/upload.php b/application/extra/upload.php index 421b3e3..ffcfb42 100644 --- a/application/extra/upload.php +++ b/application/extra/upload.php @@ -5,19 +5,19 @@ return [ /** * 上传地址,如果不使用又拍云,则可以使用/ajax/upload */ - 'uploadurl' => 'http://v0.api.upyun.com/yourbucketname', + 'uploadurl' => '/admin/ajax/upload', /** * 又拍云或本机的CDN地址 */ - 'cdnurl' => 'http://yourbucketname.b0.upaiyun.com', + 'cdnurl' => '', /** * 上传成功后的通知地址 */ - 'notifyurl' => 'http://www.yoursite.com/upyun/notify', + 'notifyurl' => '', /** * 又拍云Bucket */ - 'bucket' => 'yourbucketname', + 'bucket' => '', /** * 生成的policy有效时间 */ @@ -29,7 +29,7 @@ return [ /** * 文件保存格式 */ - 'savekey' => '/uploads/media/{year}{mon}{day}/{filemd5}{.suffix}', + 'savekey' => '/uploads/{year}{mon}{day}/{filemd5}{.suffix}', /** * 最大可上传大小 */ diff --git a/public/.htaccess b/public/.htaccess index 0ac53ff..864872e 100755 --- a/public/.htaccess +++ b/public/.htaccess @@ -4,5 +4,5 @@ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f - RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] + RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1] </IfModule> diff --git a/public/assets/js/backend/general/attachment.js b/public/assets/js/backend/general/attachment.js index 51ec4fa..13473a3 100644 --- a/public/assets/js/backend/general/attachment.js +++ b/public/assets/js/backend/general/attachment.js @@ -54,9 +54,13 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table', 'config'], function ( }, formatter: { thumb: function (value, row, index) { - console.log(row); + //console.log(row); if (row.mimetype.indexOf("image") > -1) { - return '<a href="' + Config.upload.cdnurl + value + '" target="_blank"><img src="' + Config.upload.cdnurl + value + '!/fwfh/50x50" alt=""></a>'; + if (Config.upload.bucket.replace(/^\s+|\s+$/gm,'').length === 0){ + return '<a href="' + Config.upload.cdnurl + value + '" target="_blank"><img src="' + Config.upload.cdnurl + value + '" alt="" style="max-height:90px;max-width:120px"></a>'; + } else { + return '<a href="' + Config.upload.cdnurl + value + '" target="_blank"><img src="' + Config.upload.cdnurl + value + '!/fwfh/50x50" alt=""></a>'; + } } else { return '无'; } diff --git a/public/assets/js/backend/index.js b/public/assets/js/backend/index.js index f138299..5d44a58 100755 --- a/public/assets/js/backend/index.js +++ b/public/assets/js/backend/index.js @@ -47,6 +47,22 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'validator'], f e.stopPropagation(); }); + //清除缓存 + $(document).on('click', "[data-toggle='wipeCache']", function () { + $.ajax({ + url: 'ajax/wipeCache', + dataType: 'json', + cache: false, + success: function (ret) { + if (ret.code === 1) { + Backend.api.toastr.success(ret.msg); + } else { + Backend.api.toastr.error('清除系统缓存失败!'); + } + } + }); + }); + //全屏事件 $(document).on('click', "[data-toggle='fullscreen']", function () { var doc = document.documentElement; diff --git a/public/assets/js/require-table.js b/public/assets/js/require-table.js index 4a1decb..4d212af 100644 --- a/public/assets/js/require-table.js +++ b/public/assets/js/require-table.js @@ -9,9 +9,14 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'moment', 'bootstr method: 'get', toolbar: "#toolbar", search: true, + cache: false, advancedSearch: true, idTable: 'advancedTable', showExport: true, + exportDataType: "all", + exportTypes: ['json', 'xml', 'csv', 'txt', 'doc', 'excel'], + pageSize: 10, + pageList: [10, 25, 50, 'All'], pagination: true, clickToSelect: true, showRefresh: false, diff --git a/public/assets/js/require-upload.js b/public/assets/js/require-upload.js index c5d1826..6852145 100755 --- a/public/assets/js/require-upload.js +++ b/public/assets/js/require-upload.js @@ -69,11 +69,11 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'plupload'], function ($, un try { var ret = JSON.parse(info.response); if (ret.hasOwnProperty('code')) { - ret.data = ret.code == 200 ? ret : ret.data; + ret.data = ret.code == 200 ? ret.data : 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); + $("input[data-plupload-id='" + id + "-text']").val(data); var afterUpload = $("#" + id).data("after-upload"); if (afterUpload && typeof Upload.api.custom[afterUpload] == 'function') { Upload.api.custom[afterUpload].call(info, id, data);