Browse Source

新增附件选择指定管理员或指定会员数据功能
新增附件查找多文件类型功能
新增插件自定义配置功能
新增前台会员中心边栏Hook
新增会员中心控制器空请求捕获
新增自定义编辑、排序、删除按钮功能
修复图片删除按钮无法点击的BUG
修复会员规则排序BUG
优化配置中extend的位置

Karson 6 years ago
parent
commit
9e3f1ccf42

+ 5 - 4
application/admin/command/Menu.php

@@ -27,7 +27,7 @@ class Menu extends Command
             ->addOption('force', 'f', Option::VALUE_OPTIONAL, 'force delete menu,without tips', null)
             ->addOption('equal', 'e', Option::VALUE_OPTIONAL, 'the controller must be equal', null)
             ->setDescription('Build auth menu from controller');
-            //要执行的controller必须一样,不适用模糊查询
+        //要执行的controller必须一样,不适用模糊查询
     }
 
     protected function execute(Input $input, Output $output)
@@ -44,7 +44,7 @@ class Menu extends Command
         //是否为删除模式
         $delete = $input->getOption('delete');
         //是否控制器完全匹配
-        $equal= $input->getOption('equal');
+        $equal = $input->getOption('equal');
 
 
         if ($delete) {
@@ -54,10 +54,10 @@ class Menu extends Command
             $ids = [];
             $list = $this->model->where(function ($query) use ($controller, $equal) {
                 foreach ($controller as $index => $item) {
-                    if($equal)
+                    if ($equal)
                         $query->whereOr('name', 'eq', $item);
                     else
-                        $query->whereOr('name', 'like', strtolower($item) . "%");         
+                        $query->whereOr('name', 'like', strtolower($item) . "%");
                 }
             })->select();
             foreach ($list as $k => $v) {
@@ -156,6 +156,7 @@ class Menu extends Command
 
     protected function importRule($controller)
     {
+        $controller = str_replace('\\', '/', $controller);
         $controllerArr = explode('/', $controller);
         end($controllerArr);
         $key = key($controllerArr);

+ 3 - 1
application/admin/controller/Addon.php

@@ -82,7 +82,9 @@ class Addon extends Backend
             $this->error(__('Parameter %s can not be empty', ''));
         }
         $this->view->assign("addon", ['info' => $info, 'config' => $config]);
-        return $this->view->fetch();
+        $configFile = ADDON_PATH . $name . DS . 'config.html';
+        $viewFile = is_file($configFile) ? $configFile : '';
+        return $this->view->fetch($viewFile);
     }
 
     /**

+ 30 - 22
application/admin/controller/general/Attachment.php

@@ -31,22 +31,35 @@ class Attachment extends Backend
     {
         //设置过滤方法
         $this->request->filter(['strip_tags']);
-        if ($this->request->isAjax())
-        {
+        if ($this->request->isAjax()) {
+            $mimetypeQuery = [];
+            $filter = $this->request->request('filter');
+            $filterArr = (array)json_decode($filter, TRUE);
+            if (isset($filterArr['mimetype']) && stripos($filterArr['mimetype'], ',') !== false) {
+                $this->request->get(['filter' => json_encode(array_merge($filterArr, ['mimetype' => '']))]);
+                $mimetypeQuery = function ($query) use ($filterArr) {
+                    $mimetypeArr = explode(',', $filterArr['mimetype']);
+                    foreach ($mimetypeArr as $index => $item) {
+                        $query->whereOr('mimetype', 'like', '%' . $item . '%');
+                    }
+                };
+            }
+
             list($where, $sort, $order, $offset, $limit) = $this->buildparams();
             $total = $this->model
-                    ->where($where)
-                    ->order($sort, $order)
-                    ->count();
+                ->where($mimetypeQuery)
+                ->where($where)
+                ->order($sort, $order)
+                ->count();
 
             $list = $this->model
-                    ->where($where)
-                    ->order($sort, $order)
-                    ->limit($offset, $limit)
-                    ->select();
+                ->where($mimetypeQuery)
+                ->where($where)
+                ->order($sort, $order)
+                ->limit($offset, $limit)
+                ->select();
             $cdnurl = preg_replace("/\/(\w+)\.php$/i", '', $this->request->root());
-            foreach ($list as $k => &$v)
-            {
+            foreach ($list as $k => &$v) {
                 $v['fullurl'] = ($v['storage'] == 'local' ? $cdnurl : $this->view->config['upload']['cdnurl']) . $v['url'];
             }
             unset($v);
@@ -62,8 +75,7 @@ class Attachment extends Backend
      */
     public function select()
     {
-        if ($this->request->isAjax())
-        {
+        if ($this->request->isAjax()) {
             return $this->index();
         }
         return $this->view->fetch();
@@ -74,8 +86,7 @@ class Attachment extends Backend
      */
     public function add()
     {
-        if ($this->request->isAjax())
-        {
+        if ($this->request->isAjax()) {
             $this->error();
         }
         return $this->view->fetch();
@@ -87,18 +98,15 @@ class Attachment extends Backend
      */
     public function del($ids = "")
     {
-        if ($ids)
-        {
-            \think\Hook::add('upload_delete', function($params) {
+        if ($ids) {
+            \think\Hook::add('upload_delete', function ($params) {
                 $attachmentFile = ROOT_PATH . '/public' . $params['url'];
-                if (is_file($attachmentFile))
-                {
+                if (is_file($attachmentFile)) {
                     @unlink($attachmentFile);
                 }
             });
             $attachmentlist = $this->model->where('id', 'in', $ids)->select();
-            foreach ($attachmentlist as $attachment)
-            {
+            foreach ($attachmentlist as $attachment) {
                 \think\Hook::listen("upload_delete", $attachment);
                 $attachment->delete();
             }

+ 2 - 0
application/admin/lang/zh-cn/general/attachment.php

@@ -2,6 +2,8 @@
 
 return [
     'Id'                 => 'ID',
+    'Admin_id'           => '管理员ID',
+    'User_id'            => '会员ID',
     'Url'                => '物理路径',
     'Imagewidth'         => '宽度',
     'Imageheight'        => '高度',

+ 2 - 3
application/admin/model/UserRule.php

@@ -41,10 +41,9 @@ class UserRule extends Model
 
     public static function getTreeList($selected = [])
     {
-        $ruleList = collection(self::where('status', 'normal')->select())->toArray();
+        $ruleList = collection(self::where('status', 'normal')->order('weigh desc,id desc')->select())->toArray();
         $nodeList = [];
-        foreach ($ruleList as $k => $v)
-        {
+        foreach ($ruleList as $k => $v) {
             $state = array('selected' => $v['ismenu'] ? false : in_array($v['id'], $selected));
             $nodeList[] = array('id' => $v['id'], 'parent' => $v['pid'] ? $v['pid'] : '#', 'text' => __($v['title']), 'type' => 'menu', 'state' => $state);
         }

+ 5 - 5
application/admin/view/addon/config.html

@@ -15,10 +15,10 @@
                         <div class="col-sm-8 col-xs-12">
                             {switch $item.type}
                             {case string}
-                            <input type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control" data-rule="{$item.rule}" data-tip="{$item.tip}" {$item.extend} />
+                            <input {$item.extend} type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control" data-rule="{$item.rule}" data-tip="{$item.tip}" />
                             {/case}
                             {case text}
-                            <textarea name="row[{$item.name}]" class="form-control" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}" {$item.extend}>{$item.value}</textarea>
+                            <textarea {$item.extend} name="row[{$item.name}]" class="form-control" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}">{$item.value}</textarea>
                             {/case}
                             {case array}
                             <dl class="fieldlist" data-name="row[{$item.name}]">
@@ -31,10 +31,10 @@
                             </dl>
                             {/case}
                             {case datetime}
-                            <input type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control datetimepicker" data-tip="{$item.tip}" data-rule="{$item.rule}" {$item.extend} />
+                            <input {$item.extend} type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control datetimepicker" data-tip="{$item.tip}" data-rule="{$item.rule}" />
                             {/case}
                             {case number}
-                            <input type="number" name="row[{$item.name}]" value="{$item.value}" class="form-control" data-tip="{$item.tip}" data-rule="{$item.rule}" {$item.extend} />
+                            <input {$item.extend} type="number" name="row[{$item.name}]" value="{$item.value}" class="form-control" data-tip="{$item.tip}" data-rule="{$item.rule}" />
                             {/case}
                             {case checkbox}
                             {foreach name="item.content" item="vo"}
@@ -48,7 +48,7 @@
                             {/case}
                             {case value="select" break="0"}{/case}
                             {case value="selects"}
-                            <select name="row[{$item.name}]{$item.type=='selects'?'[]':''}" class="form-control selectpicker" data-tip="{$item.tip}" {$item.type=='selects'?'multiple':''}>
+                            <select {$item.extend} name="row[{$item.name}]{$item.type=='selects'?'[]':''}" class="form-control selectpicker" data-tip="{$item.tip}" {$item.type=='selects'?'multiple':''}>
                                 {foreach name="item.content" item="vo"}
                                 <option value="{$key}" {in name="key" value="$item.value"}selected{/in}>{$vo}</option>
                                 {/foreach}

+ 3 - 0
application/admin/view/addon/index.html

@@ -56,6 +56,9 @@
     .form-userinfo .breadcrumb {
         margin-bottom:10px;
     }
+    .btn-toggle {
+        padding:0;
+    }
 </style>
 <div class="panel panel-default panel-intro">
     <div class="panel-heading">

+ 6 - 6
application/admin/view/general/config/index.html

@@ -45,13 +45,13 @@
                                             <div class="col-sm-8 col-xs-12">
                                                 {switch $item.type}
                                                 {case string}
-                                                <input type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control" data-rule="{$item.rule}" data-tip="{$item.tip}" {$item.extend} />
+                                                <input {$item.extend} type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control" data-rule="{$item.rule}" data-tip="{$item.tip}" />
                                                 {/case}
                                                 {case text}
-                                                <textarea name="row[{$item.name}]" class="form-control" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}" {$item.extend}>{$item.value}</textarea>
+                                                <textarea {$item.extend} name="row[{$item.name}]" class="form-control" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}">{$item.value}</textarea>
                                                 {/case}
                                                 {case editor}
-                                                <textarea name="row[{$item.name}]" id="editor-{$item.name}" class="form-control editor" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}" {$item.extend}>{$item.value}</textarea>
+                                                <textarea {$item.extend} name="row[{$item.name}]" id="editor-{$item.name}" class="form-control editor" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}">{$item.value}</textarea>
                                                 {/case}
                                                 {case array}
                                                 <dl class="fieldlist" data-name="row[{$item.name}]">
@@ -64,10 +64,10 @@
                                                 </dl>
                                                 {/case}
                                                 {case datetime}
-                                                <input type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control datetimepicker" data-tip="{$item.tip}" data-rule="{$item.rule}" {$item.extend} />
+                                                <input {$item.extend} type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control datetimepicker" data-tip="{$item.tip}" data-rule="{$item.rule}" />
                                                 {/case}
                                                 {case number}
-                                                <input type="number" name="row[{$item.name}]" value="{$item.value}" class="form-control" data-tip="{$item.tip}" data-rule="{$item.rule}" {$item.extend} />
+                                                <input {$item.extend} type="number" name="row[{$item.name}]" value="{$item.value}" class="form-control" data-tip="{$item.tip}" data-rule="{$item.rule}" />
                                                 {/case}
                                                 {case checkbox}
                                                 {foreach name="item.content" item="vo"}
@@ -81,7 +81,7 @@
                                                 {/case}
                                                 {case value="select" break="0"}{/case}
                                                 {case value="selects"}
-                                                <select name="row[{$item.name}]{$item.type=='selects'?'[]':''}" class="form-control selectpicker" data-tip="{$item.tip}" {$item.type=='selects'?'multiple':''}>
+                                                <select {$item.extend} name="row[{$item.name}]{$item.type=='selects'?'[]':''}" class="form-control selectpicker" data-tip="{$item.tip}" {$item.type=='selects'?'multiple':''}>
                                                     {foreach name="item.content" item="vo"}
                                                     <option value="{$key}" {in name="key" value="$item.value"}selected{/in}>{$vo}</option>
                                                     {/foreach}

+ 1 - 1
application/config.php

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

+ 11 - 0
application/index/controller/User.php

@@ -54,6 +54,17 @@ class User extends Frontend
     }
 
     /**
+     * 空的请求
+     * @param $name
+     * @return mixed
+     */
+    public function _empty($name)
+    {
+        Hook::listen("user_request_empty", $name);
+        return $this->view->fetch('user/' . $name);
+    }
+
+    /**
      * 会员中心
      */
     public function index()

+ 1 - 0
application/index/lang/zh-cn.php

@@ -104,6 +104,7 @@ return [
     'Features'                                               => '功能特性',
     'Home'                                                   => '首页',
     'Store'                                                  => '插件市场',
+    'Wxapp'                                                  => '小程序',
     'Services'                                               => '服务',
     'Download'                                               => '下载',
     'Demo'                                                   => '演示',

+ 1 - 1
application/index/view/common/meta.html

@@ -12,7 +12,7 @@
 <meta name="author" content="FastAdmin">
 
 <link rel="shortcut icon" href="__CDN__/assets/img/favicon.ico" />
-<!-- Loading Bootstrap -->
+
 <link href="__CDN__/assets/css/frontend{$Think.config.app_debug?'':'.min'}.css?v={$Think.config.site.version}" rel="stylesheet">
 
 <!-- HTML5 shim, for IE6-8 support of HTML5 elements. All other JS at the end of file. -->

+ 2 - 0
application/index/view/common/sidenav.html

@@ -1,4 +1,5 @@
 <div class="sidenav">
+    {:hook('user_sidenav_before')}
     <ul class="list-group">
         <li class="list-group-heading">{:__('User center')}</li>
         <li class="list-group-item {:$config['actionname']=='index'?'active':''}"> <a href="{:url('user/index')}"><i class="fa fa-user-circle fa-fw"></i> {:__('User center')}</a> </li>
@@ -6,4 +7,5 @@
         <li class="list-group-item {:$config['actionname']=='changepwd'?'active':''}"> <a href="{:url('user/changepwd')}"><i class="fa fa-key fa-fw"></i> {:__('Change password')}</a> </li>
         <li class="list-group-item {:$config['actionname']=='logout'?'active':''}"> <a href="{:url('user/logout')}"><i class="fa fa-sign-out fa-fw"></i> {:__('Sign out')}</a> </li>
     </ul>
+    {:hook('user_sidenav_after')}
 </div>

+ 3 - 1
application/index/view/index/index.html

@@ -41,6 +41,7 @@
                     <ul class="nav navbar-nav navbar-right">
                         <li><a href="https://www.fastadmin.net" target="_blank">{:__('Home')}</a></li>
                         <li><a href="https://www.fastadmin.net/store.html" target="_blank">{:__('Store')}</a></li>
+                        <li><a href="https://www.fastadmin.net/wxapp.html" target="_blank">{:__('Wxapp')}</a></li>
                         <li><a href="https://www.fastadmin.net/service.html" target="_blank">{:__('Services')}</a></li>
                         <li><a href="https://www.fastadmin.net/download.html" target="_blank">{:__('Download')}</a></li>
                         <li><a href="https://www.fastadmin.net/demo.html" target="_blank">{:__('Demo')}</a></li>
@@ -176,7 +177,7 @@
                     $("#mainNav").toggleClass("affix", $(window).height() - $(window).scrollTop() <= 50);
                 });
 
-                //发送版本统计信息
+                // 发送版本统计信息,请移除
                 try {
                     var installed = localStorage.getItem("installed");
                     if (!installed) {
@@ -203,6 +204,7 @@
         </script>
 
         <script>
+            // FastAdmin统计代码,请移除
             var _hmt = _hmt || [];
             (function () {
                 var hm = document.createElement("script");

+ 1 - 0
application/index/view/layout/default.html

@@ -22,6 +22,7 @@
                     <ul class="nav navbar-nav navbar-right">
                         <li><a href="https://www.fastadmin.net" target="_blank">{:__('Home')}</a></li>
                         <li><a href="https://www.fastadmin.net/store.html" target="_blank">{:__('Store')}</a></li>
+                        <li><a href="https://www.fastadmin.net/wxapp.html" target="_blank">{:__('Wxapp')}</a></li>
                         <li><a href="https://www.fastadmin.net/service.html" target="_blank">{:__('Services')}</a></li>
                         <li><a href="https://www.fastadmin.net/download.html" target="_blank">{:__('Download')}</a></li>
                         <li><a href="https://www.fastadmin.net/demo.html" target="_blank">{:__('Demo')}</a></li>

+ 1 - 1
bower.json

@@ -27,7 +27,7 @@
     "art-template": "^3.1.3",
     "requirejs-plugins": "~1.0.3",
     "bootstrap-daterangepicker": "~2.1.25",
-    "fastadmin-citypicker": "~1.3.0",
+    "fastadmin-citypicker": "~1.3.1",
     "fastadmin-cxselect": "~1.4.0",
     "fastadmin-dragsort": "~1.0.0",
     "fastadmin-addtabs": "~1.0.3",

+ 1 - 1
public/assets/css/frontend.css

@@ -22,7 +22,7 @@ body {
   border: none;
 }
 .navbar-nav li > a {
-  font-size: 13px;
+  font-size: 14px;
 }
 .toast-top-center {
   top: 50px;

File diff suppressed because it is too large
+ 1 - 1
public/assets/css/frontend.min.css


+ 0 - 10
public/assets/js/backend.js

@@ -215,16 +215,6 @@ define(['fast', 'template', 'moment'], function (Fast, Template, Moment) {
             if ($(".layer-footer").size() > 0 && self === top) {
                 $(".layer-footer").show();
             }
-            //优化在多个弹窗下点击不能切换的操作体验
-            if (Fast.api.query("dialog") == "1" && self != top && self.frameElement && self.frameElement.tagName == "IFRAME") {
-                $(window).on('click', function () {
-                    var layero = self.frameElement.parentNode.parentElement;
-                    if (parent.Layer.zIndex != parseInt(parent.window.$(layero).css("z-index"))) {
-                        parent.window.$(layero).trigger("mousedown");
-                        parent.Layer.zIndex = parseInt(parent.window.$(layero).css("z-index"));
-                    }
-                });
-            }
             //tooltip和popover
             if (!('ontouchstart' in document.documentElement)) {
                 $('body').tooltip({selector: '[data-toggle="tooltip"]'});

+ 4 - 4
public/assets/js/backend/addon.js

@@ -84,7 +84,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
                             field: 'downloads',
                             title: __('Downloads'),
                             operate: 'LIKE',
-                            width: '100px',
+                            width: '80px',
                             align: 'center',
                             formatter: Controller.api.formatter.downloads
                         },
@@ -92,14 +92,14 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
                             field: 'version',
                             title: __('Version'),
                             operate: 'LIKE',
-                            width: '100px',
+                            width: '80px',
                             align: 'center',
                             formatter: Controller.api.formatter.version
                         },
                         {
                             field: 'toggle',
                             title: __('Status'),
-                            width: '100px',
+                            width: '80px',
                             formatter: Controller.api.formatter.toggle
                         },
                         {
@@ -515,7 +515,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
                     if (!row.addon) {
                         return '';
                     }
-                    return '<a href="javascript:;" data-toggle="tooltip" title="' + __('Click to toggle status') + '" class="btn-' + (row.addon.state == 1 ? "disable" : "enable") + '" data-action="' + (row.addon.state == 1 ? "disable" : "enable") + '" data-name="' + row.name + '"><i class="fa ' + (row.addon.state == 0 ? 'fa-toggle-on fa-rotate-180 text-gray' : 'fa-toggle-on text-success') + ' fa-2x"></i></a>';
+                    return '<a href="javascript:;" data-toggle="tooltip" title="' + __('Click to toggle status') + '" class="btn btn-toggle btn-' + (row.addon.state == 1 ? "disable" : "enable") + '" data-action="' + (row.addon.state == 1 ? "disable" : "enable") + '" data-name="' + row.name + '"><i class="fa ' + (row.addon.state == 0 ? 'fa-toggle-on fa-rotate-180 text-gray' : 'fa-toggle-on text-success') + ' fa-2x"></i></a>';
                 },
                 author: function (value, row, index) {
                     return '<a href="https://wpa.qq.com/msgrd?v=3&uin=' + row.qq + '&site=fastadmin.net&menu=yes" target="_blank" data-toggle="tooltip" title="' + __('Click to contact developer') + '" class="text-primary">' + value + '</a>';

+ 6 - 2
public/assets/js/backend/general/attachment.js

@@ -24,14 +24,16 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
                     [
                         {field: 'state', checkbox: true,},
                         {field: 'id', title: __('Id')},
+                        {field: 'admin_id', title: __('Admin_id'), visible: false, addClass:"selectpage", extend:"data-source='auth/admin/index' data-field='nickname'"},
+                        {field: 'user_id', title: __('User_id'), visible: false, addClass:"selectpage", extend:"data-source='user/user/index' data-field='nickname'"},
                         {field: 'url', title: __('Preview'), formatter: Controller.api.formatter.thumb, operate: false},
                         {field: 'url', title: __('Url'), formatter: Controller.api.formatter.url},
                         {field: 'imagewidth', title: __('Imagewidth'), sortable: true},
                         {field: 'imageheight', title: __('Imageheight'), sortable: true},
-                        {field: 'imagetype', title: __('Imagetype'), formatter:Table.api.formatter.search},
+                        {field: 'imagetype', title: __('Imagetype'), formatter: Table.api.formatter.search},
                         {field: 'storage', title: __('Storage'), formatter: Table.api.formatter.search},
                         {field: 'filesize', title: __('Filesize'), operate: 'BETWEEN', sortable: true},
-                        {field: 'mimetype', title: __('Mimetype'), formatter:Table.api.formatter.search},
+                        {field: 'mimetype', title: __('Mimetype'), formatter: Table.api.formatter.search},
                         {
                             field: 'createtime',
                             title: __('Createtime'),
@@ -73,6 +75,8 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
                     [
                         {field: 'state', checkbox: true,},
                         {field: 'id', title: __('Id')},
+                        {field: 'admin_id', title: __('Admin_id'), visible: false},
+                        {field: 'user_id', title: __('User_id'), visible: false},
                         {field: 'url', title: __('Preview'), formatter: Controller.api.formatter.thumb},
                         {field: 'imagewidth', title: __('Imagewidth')},
                         {field: 'imageheight', title: __('Imageheight')},

File diff suppressed because it is too large
+ 87 - 86
public/assets/js/require-backend.min.js


+ 3 - 1
public/assets/js/require-form.js

@@ -216,7 +216,9 @@ define(['jquery', 'bootstrap', 'upload', 'validator'], function ($, undefined, U
                         var that = this;
                         var multiple = $(this).data("multiple") ? $(this).data("multiple") : false;
                         var mimetype = $(this).data("mimetype") ? $(this).data("mimetype") : '';
-                        parent.Fast.api.open("general/attachment/select?element_id=" + $(this).attr("id") + "&multiple=" + multiple + "&mimetype=" + mimetype, __('Choose'), {
+                        var admin_id = $(this).data("admin-id") ? $(this).data("admin-id") : '';
+                        var user_id = $(this).data("user-id") ? $(this).data("user-id") : '';
+                        parent.Fast.api.open("general/attachment/select?element_id=" + $(this).attr("id") + "&multiple=" + multiple + "&mimetype=" + mimetype + "&admin_id=" + admin_id + "&user_id=" + user_id, __('Choose'), {
                             callback: function (data) {
                                 var button = $("#" + $(that).attr("id"));
                                 var maxcount = $(button).data("maxcount");

+ 10 - 5
public/assets/js/require-table.js

@@ -365,6 +365,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                 icon: function (value, row, index) {
                     if (!value)
                         return '';
+                    value = value === null ? '' : value.toString();
                     value = value.indexOf(" ") > -1 ? value : "fa fa-" + value;
                     //渲染fontawesome图标
                     return '<i class="' + value + '"></i> ' + value;
@@ -400,9 +401,9 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                     if (typeof this.custom !== 'undefined') {
                         custom = $.extend(custom, this.custom);
                     }
+                    value = value === null ? '' : value.toString();
                     var keys = typeof this.searchList === 'object' ? Object.keys(this.searchList) : [];
                     var index = keys.indexOf(value);
-                    value = value === null ? '' : value.toString();
                     var color = value && typeof custom[value] !== 'undefined' ? custom[value] : null;
                     var display = index > -1 ? this.searchList[value] : null;
                     var icon = typeof this.icon !== 'undefined' ? this.icon : null;
@@ -486,8 +487,12 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                     var options = table ? table.bootstrapTable('getOptions') : {};
                     // 默认按钮组
                     var buttons = $.extend([], this.buttons || []);
-
-                    if (options.extend.dragsort_url !== '') {
+                    // 所有按钮名称
+                    var names = [];
+                    buttons.forEach(function (item) {
+                        names.push(item.name);
+                    });
+                    if (options.extend.dragsort_url !== '' && names.indexOf('dragsort') === -1) {
                         buttons.push({
                             name: 'dragsort',
                             icon: 'fa fa-arrows',
@@ -496,7 +501,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                             classname: 'btn btn-xs btn-primary btn-dragsort'
                         });
                     }
-                    if (options.extend.edit_url !== '') {
+                    if (options.extend.edit_url !== '' && names.indexOf('edit') === -1) {
                         buttons.push({
                             name: 'edit',
                             icon: 'fa fa-pencil',
@@ -506,7 +511,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
                             url: options.extend.edit_url
                         });
                     }
-                    if (options.extend.del_url !== '') {
+                    if (options.extend.del_url !== '' && names.indexOf('del') === -1) {
                         buttons.push({
                             name: 'del',
                             icon: 'fa fa-trash',

+ 1 - 1
public/assets/js/require-upload.js

@@ -246,7 +246,7 @@ define(['jquery', 'bootstrap', 'plupload', 'template'], function ($, undefined,
                     if (preview_id && multiple) {
                         require(['dragsort'], function () {
                             $("#" + preview_id).dragsort({
-                                dragSelector: "li",
+                                dragSelector: "li a:not(.btn-trash)",
                                 dragEnd: function () {
                                     $("#" + preview_id).trigger("fa.preview.change");
                                 },

+ 1 - 1
public/assets/less/frontend.less

@@ -41,7 +41,7 @@ body {
 }
 .navbar-nav {
     li > a {
-        font-size:13px;
+        font-size:14px;
     }
 }
 .toast-top-center{