Browse Source

新增表格自定义搜索的示例
新增微信菜单编辑在未配置事件时的错误提示
新增renderer的meta
修复模板示例显示时间的BUG
修复多级联动在不选中值时的BUG
修复测试邮件收件人错误的BUG
修复表格筛选按钮禁用时不能选中首列的BUG
修复summernote使用源码模式下的BUG
修复安装时下载链接错误的BUG
修复前端require-frontend.js中的配置问题

Karson 7 years ago
parent
commit
fa6622ee0f

+ 28 - 17
application/admin/controller/Ajax.php

@@ -437,16 +437,20 @@ class Ajax extends Backend
         $type = $this->request->get('type');
         $pid = $this->request->get('pid');
         $where = ['status' => 'normal'];
-        if ($type)
-        {
-            $where['type'] = $type;
-        }
-        if ($pid)
+        $categorylist = null;
+        if ($pid !== '')
         {
-            $where['pid'] = $pid;
-        }
+            if ($type)
+            {
+                $where['type'] = $type;
+            }
+            if ($pid)
+            {
+                $where['pid'] = $pid;
+            }
 
-        $categorylist = Db::name('category')->where($where)->field('id as value,name')->order('weigh desc,id desc')->select();
+            $categorylist = Db::name('category')->where($where)->field('id as value,name')->order('weigh desc,id desc')->select();
+        }
         $this->code = 1;
         $this->data = $categorylist;
         return;
@@ -460,17 +464,24 @@ class Ajax extends Backend
         $province = $this->request->get('province');
         $city = $this->request->get('city');
         $where = ['pid' => 0, 'level' => 1];
-        if ($province)
+        $provincelist = null;
+        if ($province !== '')
         {
-            $where['pid'] = $province;
-            $where['level'] = 2;
-        }
-        if ($city)
-        {
-            $where['pid'] = $city;
-            $where['level'] = 3;
+            if ($province)
+            {
+                $where['pid'] = $province;
+                $where['level'] = 2;
+            }
+            if ($city !== '')
+            {
+                if ($city)
+                {
+                    $where['pid'] = $city;
+                    $where['level'] = 3;
+                }
+                $provincelist = Db::name('area')->where($where)->field('id as value,name')->select();
+            }
         }
-        $provincelist = Db::name('area')->where($where)->field('id as value,name')->select();
         $this->code = 1;
         $this->data = $provincelist;
         return;

+ 4 - 3
application/admin/controller/Category.php

@@ -24,15 +24,16 @@ class Category extends Backend
         $this->model = model('Category');
 
         $tree = Tree::instance();
-        $tree->init(CategoryModel::getCategoryArray(), 'pid');
+        $tree->init($this->model->order('weigh desc,id desc')->select(), 'pid');
         $this->categorylist = $tree->getTreeList($tree->getTreeArray(0), 'name');
         $categorydata = [0 => __('None')];
         foreach ($this->categorylist as $k => $v)
         {
             $categorydata[$v['id']] = $v['name'];
         }
-        $this->view->assign("typelist", CategoryModel::getTypeList());
-        $this->view->assign("parentlist", $categorydata);
+        $this->view->assign("flagList", $this->model->getFlagList());
+        $this->view->assign("typeList", CategoryModel::getTypeList());
+        $this->view->assign("parentList", $categorydata);
     }
 
     /**

+ 33 - 6
application/admin/controller/wechat/Menu.php

@@ -3,7 +3,6 @@
 namespace app\admin\controller\wechat;
 
 use app\common\controller\Backend;
-use app\common\model\Configvalue;
 use app\common\model\WechatResponse;
 use EasyWeChat\Foundation\Application;
 use think\Config;
@@ -64,19 +63,47 @@ class Menu extends Backend
 
         try
         {
-            $ret = $app->menu->add(json_decode($this->wechatcfg->value, TRUE));
-            if ($ret->errcode == 0)
+            $hasError = false;
+            $menu = json_decode($this->wechatcfg->value, TRUE);
+            foreach ($menu as $k => $v)
             {
-                $this->code = 1;
+                if (isset($v['sub_button']))
+                {
+                    foreach ($v['sub_button'] as $m => $n)
+                    {
+                        if (isset($n['key']) && !$n['key'])
+                        {
+                            $hasError = true;
+                            break 2;
+                        }
+                    }
+                }
+                else if (isset($v['key']) && !$v['key'])
+                {
+                    $hasError = true;
+                    break;
+                }
+            }
+            if (!$hasError)
+            {
+                $ret = $app->menu->add($menu);
+                if ($ret->errcode == 0)
+                {
+                    $this->code = 1;
+                }
+                else
+                {
+                    $this->msg = $ret->errmsg;
+                }
             }
             else
             {
-                $this->content = $ret->errmsg;
+                $this->msg = __('Invalid parameters');
             }
         }
         catch (Exception $e)
         {
-            $this->content = $e->getMessage();
+            $this->msg = $e->getMessage();
         }
         return;
     }

+ 10 - 4
application/admin/lang/zh-cn/category.php

@@ -1,8 +1,14 @@
 <?php
 
 return [
-    'Diyname'     => '自定义别名',
-    'Keywords'    => '关键字',
-    'Description' => '描述',
-    'keywords'    => '关键字',
+    'Pid'  =>  '父ID',
+    'Type'  =>  '栏目类型',
+    'Image'  =>  '图片',
+    'Keywords'  =>  '关键字',
+    'Description'  =>  '描述',
+    'Diyname'  =>  '自定义名称',
+    'Createtime'  =>  '创建时间',
+    'Updatetime'  =>  '更新时间',
+    'Weigh'  =>  '权重',
+    'Status'  =>  '状态'
 ];

+ 27 - 0
application/admin/validate/Category.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace app\admin\validate;
+
+use think\Validate;
+
+class Category extends Validate
+{
+    /**
+     * 验证规则
+     */
+    protected $rule = [
+    ];
+    /**
+     * 提示消息
+     */
+    protected $message = [
+    ];
+    /**
+     * 验证场景
+     */
+    protected $scene = [
+        'add'  => [],
+        'edit' => [],
+    ];
+    
+}

+ 81 - 46
application/admin/view/category/add.html

@@ -1,54 +1,89 @@
-<form id="add-form" role="form" data-toggle="validator" method="POST" action="">
-    <div class="row">
-        <div class="col-xs-12 col-sm-6">
-            <div class="form-group">
-                <label for="type" class="control-label">{:__('Type')}:</label>
-                {:build_select('row[type]', $typelist, [], ['id'=>'c-type','class'=>'form-control selectpicker','data-rule'=>'required'])}
-            </div>
-            <div class="form-group">
-                <label for="title" class="control-label">{:__('Name')}:</label>
-                <input type="text" class="form-control" id="name" name="row[name]" value="" data-rule="required" />
-            </div>
-            <div class="form-group">
-                <label for="nickname" class="control-label">{:__('Nickname')}:</label>
-                <input type="text" class="form-control" id="nickname" name="row[nickname]" value="" data-rule="required" />
-            </div>
-            <div class="form-group">
-                <label for="keywords" class="control-label">{:__('Keywords')}:</label>
-                <input type="text" class="form-control" id="keywords" name="row[keywords]" value="" />
-            </div>
-            <div class="form-group">
-                <label for="description" class="control-label">{:__('Description')}:</label>
-                <textarea name="row[description]" id="description" class="form-control" cols="30" rows="3"></textarea>
-            </div>
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group form-inline">
-                        <label for="weigh" class="control-label">{:__('Weigh')}:</label>
-                        <input type="text" class="form-control" id="weigh" name="row[weigh]" value="0" data-rule="required" size="3" />
-                    </div>
-                </div>
-            </div>
+<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label for="c-type" class="control-label col-xs-12 col-sm-2">{:__('Type')}:</label>
+        <div class="col-xs-12 col-sm-8">
+                        
+            <select  id="c-type" data-rule="required" class="form-control selectpicker" name="row[type]">
+                {foreach name="typeList" item="vo"}
+                    <option value="{$key}" {in name="key" value=""}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+
         </div>
-        <div class="col-xs-12 col-sm-6">
+    </div>
+    <div class="form-group">
+        <label for="c-pid" class="control-label col-xs-12 col-sm-2">{:__('Pid')}:</label>
+        <div class="col-xs-12 col-sm-8">
+                        
+            <select  id="c-flag" data-rule="required" class="form-control selectpicker" name="row[pid]">
+                {foreach name="parentList" item="vo"}
+                    <option value="{$key}" {in name="key" value=""}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
 
-            <div class="form-group">
-                <label for="pid" class="control-label">{:__('Parent')}:</label>
-                {:build_select('row[pid]', $parentlist, null, ['id'=>'c-pid','class'=>'form-control selectpicker','data-rule'=>'required'])}
-            </div>
-            <div class="form-group">
-                <label for="c-flag" class="control-label">{:__('Flag')}:</label>
-                {:build_select('row[flag]', ['recommend'=>__('Recommend'), 'index'=>__('Index'), 'hot'=>__('Hot')], null, ['id'=>'c-flag','class'=>'form-control selectpicker','data-rule'=>'required'])}
-            </div>
-            <div class="form-group">
-                <label for="content" class="control-label">{:__('Status')}:</label>
-                <div>
-                    {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')])}
-                </div>
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-name" class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text" value="">
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-nickname" class="control-label col-xs-12 col-sm-2">{:__('Nickname')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-nickname" data-rule="required" class="form-control" name="row[nickname]" type="text" value="">
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-flag" class="control-label col-xs-12 col-sm-2">{:__('Flag')}:</label>
+        <div class="col-xs-12 col-sm-8">
+                        
+            <select  id="c-flag" class="form-control selectpicker" multiple="" name="row[flag][]">
+                {foreach name="flagList" item="vo"}
+                    <option value="{$key}" {in name="key" value=""}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-image" class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <div class="form-inline">
+                <input id="c-image" class="form-control" size="50" name="row[image]" type="text" value="">
+                <span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/*" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
+                <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
+                <ul class="row list-inline plupload-preview" id="p-image"></ul>
             </div>
         </div>
     </div>
-    <div class="form-group hidden layer-footer">
+    <div class="form-group">
+        <label for="c-keywords" class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-keywords" class="form-control" name="row[keywords]" type="text" value="">
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-description" class="control-label col-xs-12 col-sm-2">{:__('Description')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <textarea id="c-description" class="form-control" name="row[description]"></textarea>
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-weigh" class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-weigh" class="form-control" name="row[weigh]" type="number" value="0">
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-status" class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')])}
+        </div>
+    </div>
+    <div class="form-group layer-footer">
         <label class="control-label col-xs-12 col-sm-2"></label>
         <div class="col-xs-12 col-sm-8">
             <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>

+ 81 - 46
application/admin/view/category/edit.html

@@ -1,54 +1,89 @@
-<form id="add-form" role="form" data-toggle="validator" method="POST" action="">
-    <div class="row">
-        <div class="col-xs-12 col-sm-6">
-            <div class="form-group">
-                <label for="type" class="control-label">{:__('Type')}:</label>
-                {:build_select('row[type]', $typelist, $row['type'], ['id'=>'c-type','class'=>'form-control selectpicker','data-rule'=>'required'])}
-            </div>
-            <div class="form-group">
-                <label for="title" class="control-label">{:__('Name')}:</label>
-                <input type="text" class="form-control" id="name" name="row[name]" value="{$row.name}" data-rule="required" />
-            </div>
-            <div class="form-group">
-                <label for="nickname" class="control-label">{:__('Nickname')}:</label>
-                <input type="text" class="form-control" id="nickname" name="row[nickname]" value="{$row.nickname}" data-rule="required" />
-            </div>
-            <div class="form-group">
-                <label for="keywords" class="control-label">{:__('Keywords')}:</label>
-                <input type="text" class="form-control" id="keywords" name="row[keywords]" value="{$row.keywords}" />
-            </div>
-            <div class="form-group">
-                <label for="description" class="control-label">{:__('Description')}:</label>
-                <textarea name="row[description]" id="description" class="form-control" cols="30" rows="3">{$row.description}</textarea>
-            </div>
-            <div class="row">
-                <div class="col-sm-4">
-                    <div class="form-group form-inline">
-                        <label for="weigh" class="control-label">{:__('Weigh')}:</label>
-                        <input type="text" class="form-control" id="weigh" name="row[weigh]" value="{$row.weigh}" data-rule="required" size="3" />
-                    </div>
-                </div>
-            </div>
+<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
+
+    <div class="form-group">
+        <label for="c-type" class="control-label col-xs-12 col-sm-2">{:__('Type')}:</label>
+        <div class="col-xs-12 col-sm-8">
+                        
+            <select  id="c-type" data-rule="required" class="form-control selectpicker" name="row[type]">
+                {foreach name="typeList" item="vo"}
+                    <option value="{$key}" {in name="key" value="$row.type"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+
         </div>
-        <div class="col-xs-12 col-sm-6">
+    </div>
+    <div class="form-group">
+        <label for="c-pid" class="control-label col-xs-12 col-sm-2">{:__('Pid')}:</label>
+        <div class="col-xs-12 col-sm-8">
+                        
+            <select  id="c-flag" data-rule="required" class="form-control selectpicker" name="row[pid]">
+                {foreach name="parentList" item="vo"}
+                    <option value="{$key}" {in name="key" value="$row.pid"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
 
-            <div class="form-group">
-                <label for="pid" class="control-label">{:__('Parent')}:</label>
-                {:build_select('row[pid]', $parentlist, $row['pid'], ['id'=>'c-pid','class'=>'form-control selectpicker','data-rule'=>'required'])}
-            </div>
-            <div class="form-group">
-                <label for="c-flag" class="control-label">{:__('Flag')}:</label>
-                {:build_select('row[flag]', ['recommend'=>__('Recommend'), 'index'=>__('Index'), 'hot'=>__('Hot')], $row['flag'], ['id'=>'c-flag','class'=>'form-control selectpicker','data-rule'=>'required'])}
-            </div>
-            <div class="form-group">
-                <label for="content" class="control-label">{:__('Status')}:</label>
-                <div>
-                    {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')], $row['status'])}
-                </div>
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-name" class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text" value="{$row.name}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-nickname" class="control-label col-xs-12 col-sm-2">{:__('Nickname')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-nickname" data-rule="required" class="form-control" name="row[nickname]" type="text" value="{$row.nickname}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-flag" class="control-label col-xs-12 col-sm-2">{:__('Flag')}:</label>
+        <div class="col-xs-12 col-sm-8">
+                        
+            <select  id="c-flag" class="form-control selectpicker" multiple="" name="row[flag][]">
+                {foreach name="flagList" item="vo"}
+                    <option value="{$key}" {in name="key" value="$row.flag"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-image" class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <div class="form-inline">
+                <input id="c-image" class="form-control" size="50" name="row[image]" type="text" value="{$row.image}">
+                <span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/*" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
+                <span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
+                <ul class="row list-inline plupload-preview" id="p-image"></ul>
             </div>
         </div>
     </div>
-    <div class="form-group hidden layer-footer">
+    <div class="form-group">
+        <label for="c-keywords" class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-keywords" class="form-control" name="row[keywords]" type="text" value="{$row.keywords}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-description" class="control-label col-xs-12 col-sm-2">{:__('Description')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <textarea id="c-description" class="form-control" name="row[description]">{$row.description}</textarea>
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-weigh" class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            <input id="c-weigh" class="form-control" name="row[weigh]" type="number" value="{$row.weigh}">
+        </div>
+    </div>
+    <div class="form-group">
+        <label for="c-status" class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
+        <div class="col-xs-12 col-sm-8">
+            {:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')], $row['status'])}
+        </div>
+    </div>
+    <div class="form-group layer-footer">
         <label class="control-label col-xs-12 col-sm-2"></label>
         <div class="col-xs-12 col-sm-8">
             <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>

+ 1 - 0
application/admin/view/common/meta.html

@@ -1,6 +1,7 @@
 <meta charset="utf-8">
 <title>{$title|default=''}</title>
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
+<meta name="renderer" content="webkit">
 
 <link rel="shortcut icon" href="__CDN__/assets/img/favicon.ico" />
 <!-- Loading Bootstrap -->

+ 1 - 1
application/admin/view/example/bootstraptable/index.html

@@ -8,7 +8,6 @@
                     <div id="toolbar" class="toolbar">
                         {:build_toolbar('refresh,delete')}
                         <a class="btn btn-info btn-disabled disabled btn-selected" href="javascript:;"><i class="fa fa-leaf"></i> 获取选中项</a>
-                        <a class="btn btn-success btn-singlesearch" href="javascript:;"><i class="fa fa-leaf"></i> 单独设置搜索条件</a>
                         <div class="dropdown btn-group">
                             <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> <?= __('More') ?></a>
                             <ul class="dropdown-menu text-left" role="menu">
@@ -16,6 +15,7 @@
                                 <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
                             </ul>
                         </div>
+                        <a class="btn btn-success btn-singlesearch" href="javascript:;"><i class="fa fa-user"></i> 自定义搜索</a>
                         <a class="btn btn-success btn-change btn-start" data-params="action=start" data-url="example/bootstraptable/change" href="javascript:;"><i class="fa fa-play"></i> 启动</a>
                         <a class="btn btn-danger btn-change btn-pause" data-params="action=pause" data-url="example/bootstraptable/change" href="javascript:;"><i class="fa fa-pause"></i> 暂停</a>
                     </div>

+ 1 - 1
application/admin/view/example/tabletemplate/index.html

@@ -48,7 +48,7 @@
             <div class="caption">
                 <h4><%=item.title?item.title:'无'%></h4>
                 <p class="text-muted">操作者IP:<%=item.ip%></p>
-                <p class="text-muted">操作时间:<%=Moment(item.createtime).format("YYYY-MM-DD HH:mm:ss")%></p>
+                <p class="text-muted">操作时间:<%=Moment(item.createtime*1000).format("YYYY-MM-DD HH:mm:ss")%></p>
                 <p>
                     <!--详情的事件需要在JS中手动绑定-->
                     <a href="#" class="btn btn-primary btn-success btn-detail" data-id="<%=item.id%>"><i class="fa fa-camera"></i> 详情</a> 

+ 1 - 1
application/common/library/Email.php

@@ -177,7 +177,7 @@ class Email
                 $headers .= "Content-type: text/html; charset=" . $this->options['charset'] . "\r\n";
                 $headers .= "To: {$this->options['to_name']} <{$this->options['to']}>\r\n"; //收件人
                 $headers .= "From: {$this->options['from_name']} <{$this->options['from']}>\r\n"; //发件人
-                $result = mail($this->options['mail_to'], $this->options['subject'], $this->options['body'], $headers);
+                $result = mail($this->options['to'], $this->options['subject'], $this->options['body'], $headers);
                 $this->setError($result ? '' : error_get_last()['message']);
                 break;
             default:

+ 26 - 4
application/common/model/Category.php

@@ -15,8 +15,11 @@ class Category Extends Model
     // 定义时间戳字段名
     protected $createTime = 'createtime';
     protected $updateTime = 'updatetime';
-    // 定义字段类型
-    protected $type = [
+    
+    // 追加属性
+    protected $append = [
+        'type_text',
+        'flag_text',
     ];
 
     /**
@@ -29,6 +32,26 @@ class Category Extends Model
         return $typelist;
     }
 
+    public function getTypeTextAttr($value, $data)
+    {
+        $value = $value ? $value : $data['type'];
+        $list = $this->getTypeList();
+        return isset($list[$value]) ? $list[$value] : '';
+    }
+
+    public function getFlagList()
+    {
+        return ['hot' => __('Hot'), 'index' => __('Index'), 'recommend' => __('Recommend')];
+    }
+
+    public function getFlagTextAttr($value, $data)
+    {
+        $value = $value ? $value : $data['flag'];
+        $valueArr = explode(',', $value);
+        $list = $this->getFlagList();
+        return implode(',', array_intersect_key($list, array_flip($valueArr)));
+    }
+
     /**
      * 读取分类列表
      * @param string $type 指定类型
@@ -37,8 +60,7 @@ class Category Extends Model
      */
     public static function getCategoryArray($type = NULL, $status = NULL)
     {
-        $list = collection(self::where(function($query) use($type, $status)
-                {
+        $list = collection(self::where(function($query) use($type, $status) {
                     if (!is_null($type))
                     {
                         $query->where('type', '=', $type);

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

@@ -5,6 +5,7 @@
         <title>FastAdmin</title>
         <meta name="viewport" content="width=device-width, initial-scale=1">
         <meta name="description" content="基于ThinkPHP5和Bootstrap的极速后台开发框架">
+        <meta name="renderer" content="webkit">
         <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">

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

@@ -4,6 +4,7 @@
         <title>会员中心</title>
         <meta name="viewport" content="width=device-width, initial-scale=1.0" />
         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+        <meta name="renderer" content="webkit" />
         <link href="__CDN__/assets/css/bootstrap.min.css" rel="stylesheet" />
         <link href="__CDN__/assets/css/fastadmin.min.css" rel="stylesheet" />
         <link href="__CDN__/assets/libs/font-awesome/css/font-awesome.min.css" rel="stylesheet" />

+ 4 - 2
public/assets/css/backend.css

@@ -409,9 +409,11 @@ table.table-template {
 .fixed-table-container {
   border: none!important;
 }
-.note-editor .note-editing-area .note-editable {
-  display: block !important;
+/*修复nice-validator和summernote的编辑框冲突*/
+.nice-validator .note-editor .note-editing-area .note-editable {
+  display: inherit;
 }
+/*预览区域*/
 .plupload-preview {
   padding: 10px;
   margin-bottom: 0;

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


+ 9 - 13
public/assets/js/backend/category.js

@@ -1,4 +1,4 @@
-define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefined, Backend, Form, Table) {
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
 
     var Controller = {
         index: function () {
@@ -10,7 +10,7 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
                     edit_url: 'category/edit',
                     del_url: 'category/del',
                     multi_url: 'category/multi',
-                    table: 'category'
+                    table: 'category',
                 }
             });
 
@@ -19,28 +19,25 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
             // 初始化表格
             table.bootstrapTable({
                 url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
                 sortName: 'weigh',
                 columns: [
                     [
-                        {field: 'state', checkbox: true, },
-                        {field: 'id', title: 'ID'},
-                        {field: 'name', title: __('Name'), align: 'left'},
-                        {field: 'nickname', title: __('Nickname')},
+                        {field: 'id', title: __('Id')},
                         {field: 'type', title: __('Type')},
-                        {field: 'flag', title: __('Flag'), formatter: Table.api.formatter.flag},
+                        {field: 'name', title: __('Name'), align:'left'},
+                        {field: 'nickname', title: __('Nickname')},
+                        {field: 'flag_text', title: __('Flag'), operate:false, formatter: Table.api.formatter.label},
+                        {field: 'image', title: __('Image'), formatter: Table.api.formatter.image},
                         {field: 'weigh', title: __('Weigh')},
                         {field: 'status', title: __('Status'), formatter: Table.api.formatter.status},
                         {field: 'operate', title: __('Operate'), events: Table.api.events.operate, formatter: Table.api.formatter.operate}
                     ]
-                ],
-                pagination: false,
-                search: false,
-                commonSearch: false,
+                ]
             });
 
             // 为表格绑定事件
             Table.api.bindevent(table);
-
         },
         add: function () {
             Controller.api.bindevent();
@@ -53,7 +50,6 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
                 Form.api.bindevent($("form[role=form]"));
             }
         }
-
     };
     return Controller;
 });

+ 27 - 8
public/assets/js/backend/example/bootstraptable.js

@@ -30,7 +30,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                         //模糊搜索
                         {field: 'title', title: __('Title'), operate: 'LIKE %...%', placeholder: '模糊搜索,*表示任意字符', style: 'width:200px'},
                         //通过Ajax渲染searchList,也可以使用JSON数据
-                        {field: 'url', title: __('Url'), align: 'left', defaultValue: 3, searchList: $.getJSON('ajax/typeahead?search=a&field=row[user_id]'), formatter: Controller.api.formatter.url},
+                        {field: 'url', title: __('Url'), align: 'left', searchList: $.getJSON('ajax/typeahead?search=a&field=row[user_id]'), formatter: Controller.api.formatter.url},
                         //点击IP时同时执行搜索此IP,同时普通搜索使用下拉列表的形式
                         {field: 'ip', title: __('IP'), searchList: ['127.0.0.1', '127.0.0.2'], events: Controller.api.events.ip, formatter: Controller.api.formatter.ip},
                         //自定义栏位
@@ -41,7 +41,9 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                         //启用时间段搜索
                         {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'BETWEEN', type: 'datetime', addclass: 'datetimepicker', data: 'data-date-format="YYYY-MM-DD HH:mm:ss"'},
                         //我们向操作栏额外添加上一个详情按钮,并保留已有的编辑和删除控制,同时为这个按钮添加上点击事件
-                        {field: 'operate', title: __('Operate'), events: Controller.api.events.operate, formatter: Controller.api.formatter.operate}
+                        {field: 'operate', title: __('Operate'), events: Controller.api.events.operate, formatter: function (value, row, index) {
+                                return Table.api.formatter.operate.call(this, value, row, index, table);
+                            }}
                     ],
                 ],
                 //禁用默认搜索
@@ -51,10 +53,10 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 //可以控制是否默认显示搜索单表,false则隐藏,默认为false
                 searchFormVisible: true
             });
-            
+
             //在表格内容渲染完成后回调的事件
             table.on('post-body.bs.table', function (e, settings, json, xhr) {
-                
+
             });
 
             // 为表格绑定事件
@@ -62,14 +64,29 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
 
             //指定搜索条件
             $(document).on("click", ".btn-singlesearch", function () {
-                table.bootstrapTable('refresh', {query: {filter: JSON.stringify({url: '/admin/index/login.html'}), op: JSON.stringify({url: '='})}});
+                var options = table.bootstrapTable('getOptions');
+                options.pageNumber = 1;
+                options.queryParams = function (params) {
+                    return {
+                        search: params.search,
+                        sort: params.sort,
+                        order: params.order,
+                        filter: JSON.stringify({admin_id: 1}),
+                        op: JSON.stringify({admin_id: '='}),
+                        offset: params.offset,
+                        limit: params.limit,
+                    };
+                };
+                table.bootstrapTable('refresh', {});
+                Toastr.info("当前执行的是自定义搜索");
+                return false;
             });
 
             //获取选中项
             $(document).on("click", ".btn-selected", function () {
                 Layer.alert(JSON.stringify(table.bootstrapTable('getSelections')));
             });
-            
+
             //启动和暂停按钮
             $(document).on("click", ".btn-start,.btn-pause", function () {
                 //在table外不可以使用添加.btn-change的方法
@@ -116,10 +133,12 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                     //格式为:方法名+空格+DOM元素
                     'click .btn-ip': function (e, value, row, index) {
                         e.stopPropagation();
+                        console.log();
+                        var container = $("#table").data("bootstrap.table").$container;
                         var options = $("#table").bootstrapTable('getOptions');
                         //这里我们手动将数据填充到表单然后提交
-                        $("#commonSearchContent_" + options.idTable + " form [name='ip']").val(value);
-                        $("#commonSearchContent_" + options.idTable + " form").trigger('submit');
+                        $("form.form-commonsearch [name='ip']", container).val(value);
+                        $("form.form-commonsearch", container).trigger('submit');
                         Toastr.info("执行了自定义搜索操作");
                     }
                 },

+ 0 - 1
public/assets/js/backend/wechat/menu.js

@@ -254,7 +254,6 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'sortable'], function
             });
             $(document).on('click', "#menuSyn", function () {
                 $.post("wechat/menu/sync", {}, function (ret) {
-
                     var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
                     if (ret.code == 1) {
                         Backend.api.toastr.success('菜单同步更新成功,生效时间看微信官网说明,或者你重新关注微信号!');

+ 50 - 30
public/assets/js/require-backend.min.js

@@ -7800,31 +7800,33 @@ define('table',['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap
                     $(Table.config.refreshbtn, toolbar).find(".fa").removeClass("fa-spin");
                     $(Table.config.disabledbtn, toolbar).toggleClass('disabled', true);
 
-                    // 挺拽选择,需要重新绑定事件
-                    require(['drag', 'drop'], function () {
-                        $(Table.config.firsttd, table).drag("start", function (ev, dd) {
-                            return $('<div class="selection" />').css('opacity', .65).appendTo(document.body);
-                        }).drag(function (ev, dd) {
-                            $(dd.proxy).css({
-                                top: Math.min(ev.pageY, dd.startY),
-                                left: Math.min(ev.pageX, dd.startX),
-                                height: Math.abs(ev.pageY - dd.startY),
-                                width: Math.abs(ev.pageX - dd.startX)
+                    if ($(Table.config.firsttd, table).find("input[type='checkbox'][data-index]").size() > 0) {
+                        // 挺拽选择,需要重新绑定事件
+                        require(['drag', 'drop'], function () {
+                            $(Table.config.firsttd, table).drag("start", function (ev, dd) {
+                                return $('<div class="selection" />').css('opacity', .65).appendTo(document.body);
+                            }).drag(function (ev, dd) {
+                                $(dd.proxy).css({
+                                    top: Math.min(ev.pageY, dd.startY),
+                                    left: Math.min(ev.pageX, dd.startX),
+                                    height: Math.abs(ev.pageY - dd.startY),
+                                    width: Math.abs(ev.pageX - dd.startX)
+                                });
+                            }).drag("end", function (ev, dd) {
+                                $(dd.proxy).remove();
+                            });
+                            $(Table.config.firsttd, table).drop("start", function () {
+                                Table.api.toggleattr(this);
+                            }).drop(function () {
+                                Table.api.toggleattr(this);
+                            }).drop("end", function () {
+                                Table.api.toggleattr(this);
+                            });
+                            $.drop({
+                                multi: true
                             });
-                        }).drag("end", function (ev, dd) {
-                            $(dd.proxy).remove();
-                        });
-                        $(Table.config.firsttd, table).drop("start", function () {
-                            Table.api.toggleattr(this);
-                        }).drop(function () {
-                            Table.api.toggleattr(this);
-                        }).drop("end", function () {
-                            Table.api.toggleattr(this);
-                        });
-                        $.drop({
-                            multi: true
                         });
-                    });
+                    }
                 });
 
                 // 处理选中筛选框后按钮的状态统一变更
@@ -12049,6 +12051,9 @@ define("addtabs", function(){});
                 if ($(elem.combo_input).attr('placeholder'))
                     $(elem.combo_input).attr('placeholder_bak', $(elem.combo_input).attr('placeholder'));
             }
+            if ($(elem.container).parent().hasClass("input-group")) {
+                $(elem.container).height($(elem.container).parent().height());
+            }
 
             this.elem = elem;
         },
@@ -12104,16 +12109,30 @@ define("addtabs", function(){});
                     data = null;
                 self._afterInit(self, data);
             } else {
+                var _paramsFunc = self.option.params;
+                var _params = {};
+                //原始参数
+                var _orgParams = {
+                    db_table: self.option.db_table,
+                    field: self.option.field,
+                    order_by: self.option.order_by,
+                    pkey_name: self.option.primary_key,
+                    pkey_value: self.option.init_record
+                };
+                if (_paramsFunc) {
+                    var result = $.isFunction(_paramsFunc) ? _paramsFunc() : _paramsFunc;
+                    if (result && $.isPlainObject(result)) {
+                        _params = $.extend({}, _orgParams, result);
+                    } else {
+                        _params = _orgParams;
+                    }
+                } else {
+                    _params = _orgParams;
+                }
                 $.ajax({
                     dataType: 'json',
                     url: self.option.source,
-                    data: {
-                        db_table: self.option.db_table,
-                        field: self.option.field,
-                        order_by: self.option.order_by,
-                        pkey_name: self.option.primary_key,
-                        pkey_value: self.option.init_record
-                    },
+                    data: _params,
                     success: function (json) {
                         if (typeof json.list !== 'undefined' && $.isArray(json.list)) {
                             self._afterInit(self, json.list);
@@ -13562,3 +13581,4 @@ define("addtabs", function(){});
     });
     return SelectPage;
 }));
+

+ 19 - 7
public/assets/js/require-frontend.js

@@ -12,12 +12,14 @@ require.config({
         'form': 'require-form',
         'table': 'require-table',
         'upload': 'require-upload',
+        'validator': 'require-validator',
         'drag': 'jquery.drag.min',
         'drop': 'jquery.drop.min',
         'echarts': 'echarts.min',
         'echarts-theme': 'echarts-theme',
         'adminlte': 'adminlte',
         'bootstrap-table-commonsearch': 'bootstrap-table-commonsearch',
+        'bootstrap-table-template': 'bootstrap-table-template',
         //
         // 以下的包从bower的libs目录加载
         'jquery': '../libs/jquery/dist/jquery.min',
@@ -39,19 +41,25 @@ require.config({
         'slimscroll': '../libs/jquery-slimscroll/jquery.slimscroll',
         'crontab': '../libs/jqcron/src/jqCron.cn',
         'summernote': '../libs/summernote/dist/lang/summernote-zh-CN.min',
-        'validator': '../libs/nice-validator/dist/jquery.validator.js?local=zh-CN',
+        'validator-core': '../libs/nice-validator/dist/jquery.validator',
+        'validator-lang': '../libs/nice-validator/dist/local/zh-CN',
         'plupload': '../libs/plupload/js/plupload.min',
         'toastr': '../libs/toastr/toastr',
         'jstree': '../libs/jstree/dist/jstree.min',
         'layer': '../libs/layer/src/layer',
         'cookie': '../libs/jquery.cookie/jquery.cookie',
+        'cxselect': '../libs/jquery-cxselect/js/jquery.cxselect',
         'template': '../libs/art-template/dist/template-native',
+        'selectpage': '../libs/selectpage/selectpage',
     },
     // shim依赖配置
     shim: {
         'bootstrap': ['jquery'],
         'bootstrap-table': {
-            deps: ['bootstrap', 'css!../libs/bootstrap-table/dist/bootstrap-table.min.css'],
+            deps: [
+                'bootstrap',
+//                'css!../libs/bootstrap-table/dist/bootstrap-table.min.css'
+            ],
             exports: '$.fn.bootstrapTable'
         },
         'bootstrap-table-lang': {
@@ -74,6 +82,10 @@ require.config({
             deps: ['bootstrap-table'],
             exports: '$.fn.bootstrapTable.defaults'
         },
+        'bootstrap-table-template': {
+            deps: ['bootstrap-table', 'template'],
+            exports: '$.fn.bootstrapTable.defaults'
+        },
         'tableexport': {
             deps: ['jquery'],
             exports: '$.fn.extend'
@@ -92,21 +104,21 @@ require.config({
         'bootstrap-switch': ['jquery'],
         'bootstrap-dialog': ['css!../libs/bootstrap3-dialog/dist/css/bootstrap-dialog.min.css'],
         'bootstrap-datetimepicker': [
-            'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
             'moment/locale/zh-cn',
+//            'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
         ],
         'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ],
         'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'],
 //        'toastr': ['css!../libs/toastr/toastr.min.css'],
         'jstree': ['css!../libs/jstree/dist/themes/default/style.css', ],
         'plupload': {
-            deps: [
-                '../libs/plupload/js/moxie.min'
-            ],
+            deps: ['../libs/plupload/js/moxie.min'],
             exports: "plupload"
         },
 //        'layer': ['css!../libs/layer/build/skin/default/layer.css'],
-
+//        'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'],
+        'validator-lang': ['validator-core'],
+//        'selectpage': ['css!../libs/selectpage/selectpage.css'],
     },
     baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径
     map: {

+ 19 - 7
public/assets/js/require-frontend.min.js

@@ -26,12 +26,14 @@ require.config({
         'form': 'require-form',
         'table': 'require-table',
         'upload': 'require-upload',
+        'validator': 'require-validator',
         'drag': 'jquery.drag.min',
         'drop': 'jquery.drop.min',
         'echarts': 'echarts.min',
         'echarts-theme': 'echarts-theme',
         'adminlte': 'adminlte',
         'bootstrap-table-commonsearch': 'bootstrap-table-commonsearch',
+        'bootstrap-table-template': 'bootstrap-table-template',
         //
         // 以下的包从bower的libs目录加载
         'jquery': '../libs/jquery/dist/jquery.min',
@@ -53,19 +55,25 @@ require.config({
         'slimscroll': '../libs/jquery-slimscroll/jquery.slimscroll',
         'crontab': '../libs/jqcron/src/jqCron.cn',
         'summernote': '../libs/summernote/dist/lang/summernote-zh-CN.min',
-        'validator': '../libs/nice-validator/dist/jquery.validator.js?local=zh-CN',
+        'validator-core': '../libs/nice-validator/dist/jquery.validator',
+        'validator-lang': '../libs/nice-validator/dist/local/zh-CN',
         'plupload': '../libs/plupload/js/plupload.min',
         'toastr': '../libs/toastr/toastr',
         'jstree': '../libs/jstree/dist/jstree.min',
         'layer': '../libs/layer/src/layer',
         'cookie': '../libs/jquery.cookie/jquery.cookie',
+        'cxselect': '../libs/jquery-cxselect/js/jquery.cxselect',
         'template': '../libs/art-template/dist/template-native',
+        'selectpage': '../libs/selectpage/selectpage',
     },
     // shim依赖配置
     shim: {
         'bootstrap': ['jquery'],
         'bootstrap-table': {
-            deps: ['bootstrap', 'css!../libs/bootstrap-table/dist/bootstrap-table.min.css'],
+            deps: [
+                'bootstrap',
+//                'css!../libs/bootstrap-table/dist/bootstrap-table.min.css'
+            ],
             exports: '$.fn.bootstrapTable'
         },
         'bootstrap-table-lang': {
@@ -88,6 +96,10 @@ require.config({
             deps: ['bootstrap-table'],
             exports: '$.fn.bootstrapTable.defaults'
         },
+        'bootstrap-table-template': {
+            deps: ['bootstrap-table', 'template'],
+            exports: '$.fn.bootstrapTable.defaults'
+        },
         'tableexport': {
             deps: ['jquery'],
             exports: '$.fn.extend'
@@ -106,21 +118,21 @@ require.config({
         'bootstrap-switch': ['jquery'],
         'bootstrap-dialog': ['css!../libs/bootstrap3-dialog/dist/css/bootstrap-dialog.min.css'],
         'bootstrap-datetimepicker': [
-            'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
             'moment/locale/zh-cn',
+//            'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
         ],
         'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ],
         'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'],
 //        'toastr': ['css!../libs/toastr/toastr.min.css'],
         'jstree': ['css!../libs/jstree/dist/themes/default/style.css', ],
         'plupload': {
-            deps: [
-                '../libs/plupload/js/moxie.min'
-            ],
+            deps: ['../libs/plupload/js/moxie.min'],
             exports: "plupload"
         },
 //        'layer': ['css!../libs/layer/build/skin/default/layer.css'],
-
+//        'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'],
+        'validator-lang': ['validator-core'],
+//        'selectpage': ['css!../libs/selectpage/selectpage.css'],
     },
     baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径
     map: {

+ 25 - 23
public/assets/js/require-table.js

@@ -113,31 +113,33 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table',
                     $(Table.config.refreshbtn, toolbar).find(".fa").removeClass("fa-spin");
                     $(Table.config.disabledbtn, toolbar).toggleClass('disabled', true);
 
-                    // 挺拽选择,需要重新绑定事件
-                    require(['drag', 'drop'], function () {
-                        $(Table.config.firsttd, table).drag("start", function (ev, dd) {
-                            return $('<div class="selection" />').css('opacity', .65).appendTo(document.body);
-                        }).drag(function (ev, dd) {
-                            $(dd.proxy).css({
-                                top: Math.min(ev.pageY, dd.startY),
-                                left: Math.min(ev.pageX, dd.startX),
-                                height: Math.abs(ev.pageY - dd.startY),
-                                width: Math.abs(ev.pageX - dd.startX)
+                    if ($(Table.config.firsttd, table).find("input[type='checkbox'][data-index]").size() > 0) {
+                        // 挺拽选择,需要重新绑定事件
+                        require(['drag', 'drop'], function () {
+                            $(Table.config.firsttd, table).drag("start", function (ev, dd) {
+                                return $('<div class="selection" />').css('opacity', .65).appendTo(document.body);
+                            }).drag(function (ev, dd) {
+                                $(dd.proxy).css({
+                                    top: Math.min(ev.pageY, dd.startY),
+                                    left: Math.min(ev.pageX, dd.startX),
+                                    height: Math.abs(ev.pageY - dd.startY),
+                                    width: Math.abs(ev.pageX - dd.startX)
+                                });
+                            }).drag("end", function (ev, dd) {
+                                $(dd.proxy).remove();
+                            });
+                            $(Table.config.firsttd, table).drop("start", function () {
+                                Table.api.toggleattr(this);
+                            }).drop(function () {
+                                Table.api.toggleattr(this);
+                            }).drop("end", function () {
+                                Table.api.toggleattr(this);
+                            });
+                            $.drop({
+                                multi: true
                             });
-                        }).drag("end", function (ev, dd) {
-                            $(dd.proxy).remove();
-                        });
-                        $(Table.config.firsttd, table).drop("start", function () {
-                            Table.api.toggleattr(this);
-                        }).drop(function () {
-                            Table.api.toggleattr(this);
-                        }).drop("end", function () {
-                            Table.api.toggleattr(this);
-                        });
-                        $.drop({
-                            multi: true
                         });
-                    });
+                    }
                 });
 
                 // 处理选中筛选框后按钮的状态统一变更

+ 4 - 2
public/assets/less/backend.less

@@ -438,10 +438,12 @@ table.table-template{
     border:none!important;
 }
 
-.note-editor .note-editing-area .note-editable{
-    display: block !important;
+/*修复nice-validator和summernote的编辑框冲突*/
+.nice-validator .note-editor .note-editing-area .note-editable{
+    display:inherit;
 }
 
+/*预览区域*/
 .plupload-preview {
     padding:10px;
     margin-bottom:0;

+ 1 - 1
public/install.php

@@ -20,7 +20,7 @@ $sitename = "FastAdmin";
 
 $link = array(
     'qqun'  => "https://jq.qq.com/?_wv=1027&amp;k=487PNBb",
-    'osc'   => 'https://git.oschina.net/karson/fastadmin',
+    'osc'   => 'https://git.oschina.net/karson/fastadmin/attach_files',
     'home'  => 'http://www.fastadmin.net?ref=install',
     'forum' => 'http://forum.fastadmin.net?ref=install',
     'doc'   => 'http://doc.fastadmin.net?ref=install',