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