chuweiqiang 1 год назад
Родитель
Сommit
507cf6378b
43 измененных файлов с 2945 добавлено и 4 удалено
  1. 1 0
      application/admin/controller/books/Books.php
  2. 131 0
      application/admin/controller/example/Bootstraptable.php
  3. 22 0
      application/admin/controller/example/Colorbadge.php
  4. 22 0
      application/admin/controller/example/Controllerjump.php
  5. 42 0
      application/admin/controller/example/Customform.php
  6. 24 0
      application/admin/controller/example/Customsearch.php
  7. 21 0
      application/admin/controller/example/Cxselect.php
  8. 44 0
      application/admin/controller/example/Echarts.php
  9. 92 0
      application/admin/controller/example/Multitable.php
  10. 44 0
      application/admin/controller/example/Relationmodel.php
  11. 83 0
      application/admin/controller/example/Tablelink.php
  12. 58 0
      application/admin/controller/example/Tabletemplate.php
  13. 15 0
      application/admin/model/Area.php
  14. 5 0
      application/admin/model/books/Books.php
  15. 14 0
      application/admin/view/books/books/add.html
  16. 14 0
      application/admin/view/books/books/edit.html
  17. 142 3
      application/admin/view/books/books/index.html
  18. 33 0
      application/admin/view/example/bootstraptable/detail.html
  19. 11 0
      application/admin/view/example/bootstraptable/edit.html
  20. 57 0
      application/admin/view/example/bootstraptable/index.html
  21. 21 0
      application/admin/view/example/colorbadge/index.html
  22. 21 0
      application/admin/view/example/controllerjump/index.html
  23. 302 0
      application/admin/view/example/customform/index.html
  24. 126 0
      application/admin/view/example/customsearch/index.html
  25. 160 0
      application/admin/view/example/cxselect/index.html
  26. 165 0
      application/admin/view/example/echarts/index.html
  27. 27 0
      application/admin/view/example/multitable/index.html
  28. 21 0
      application/admin/view/example/relationmodel/index.html
  29. 44 0
      application/admin/view/example/tablelink/index.html
  30. 67 0
      application/admin/view/example/tabletemplate/index.html
  31. 6 1
      application/extra/addons.php
  32. 3 0
      public/assets/js/backend/books/books.js
  33. 342 0
      public/assets/js/backend/example/bootstraptable.js
  34. 52 0
      public/assets/js/backend/example/colorbadge.js
  35. 60 0
      public/assets/js/backend/example/controllerjump.js
  36. 33 0
      public/assets/js/backend/example/customform.js
  37. 63 0
      public/assets/js/backend/example/customsearch.js
  38. 14 0
      public/assets/js/backend/example/cxselect.js
  39. 206 0
      public/assets/js/backend/example/echarts.js
  40. 93 0
      public/assets/js/backend/example/multitable.js
  41. 48 0
      public/assets/js/backend/example/relationmodel.js
  42. 81 0
      public/assets/js/backend/example/tablelink.js
  43. 115 0
      public/assets/js/backend/example/tabletemplate.js

+ 1 - 0
application/admin/controller/books/Books.php

@@ -42,6 +42,7 @@ class Books extends Backend
         $this->view->assign("bookTypeList", $this->model->getBookTypeList());
         $this->view->assign("isNewRecommendList", $this->model->getIsNewRecommendList());
         $this->view->assign("isAwardsList", $this->model->getIsAwardsList());
+        $this->view->assign("IsSeriesList", $this->model->getIsSeriesList());
         $this->view->assign("bookLevelList", $BookLevelModel->where('is_deleted',1)->where('status',0)->select());
         $this->view->assign("bookArrangementList", $BookArrangementModel->where('is_deleted',1)->where('status',0)->select());
         $this->view->assign("bookSpecialityList", $BookSpecialityModel->where('is_deleted',1)->where('status',0)->select());

+ 131 - 0
application/admin/controller/example/Bootstraptable.php

@@ -0,0 +1,131 @@
+<?php
+
+namespace app\admin\controller\example;
+
+use app\common\controller\Backend;
+
+/**
+ * 表格完整示例
+ *
+ * @icon   fa fa-table
+ * @remark 在使用Bootstrap-table中的常用方式,更多使用方式可查看:http://bootstrap-table.wenzhixin.net.cn/zh-cn/
+ */
+class Bootstraptable extends Backend
+{
+    /**
+     * @var \app\admin\model\AdminLog
+     */
+    protected $model = null;
+    /**
+     * 无需鉴权的方法(需登录)
+     * @var array
+     */
+    protected $noNeedRight = ['start', 'pause', 'change', 'detail', 'cxselect', 'searchlist'];
+
+    /**
+     * 快捷搜索的字段
+     * @var string
+     */
+    protected $searchFields = 'id,title,url';
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = model('AdminLog');
+    }
+
+    /**
+     * 查看
+     */
+    public function index()
+    {
+        if ($this->request->isAjax()) {
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams(null);
+            $list = $this->model
+                ->where($where)
+                ->order($sort, $order)
+                ->limit($offset, $limit)
+                ->paginate($limit);
+            $result = array("total" => $list->total(), "rows" => $list->items(), "extend" => ['money' => mt_rand(100000, 999999), 'price' => 200]);
+
+            return json($result);
+        }
+        return $this->view->fetch();
+    }
+
+    /**
+     * 详情
+     */
+    public function detail($ids)
+    {
+        $row = $this->model->get(['id' => $ids]);
+        if (!$row) {
+            $this->error(__('No Results were found'));
+        }
+        if ($this->request->isAjax()) {
+            $this->success("Ajax请求成功", null, ['id' => $ids]);
+        }
+        $this->view->assign("row", $row->toArray());
+        return $this->view->fetch();
+    }
+
+    /**
+     * 启用
+     */
+    public function start($ids = '')
+    {
+        $this->success("模拟启动成功");
+    }
+
+    /**
+     * 暂停
+     */
+    public function pause($ids = '')
+    {
+        $this->success("模拟暂停成功");
+    }
+
+    /**
+     * 切换
+     */
+    public function change($ids = '')
+    {
+        //你需要在此做具体的操作逻辑
+
+        $this->success("模拟切换成功");
+    }
+
+    /**
+     * 联动搜索
+     */
+    public function cxselect()
+    {
+        $type = $this->request->get('type');
+        $group_id = $this->request->get('group_id');
+        $list = null;
+        if ($group_id !== '') {
+            if ($type == 'group') {
+                $groupIds = $this->auth->getChildrenGroupIds(true);
+                $list = \app\admin\model\AuthGroup::where('id', 'in', $groupIds)->field('id as value, name')->select();
+            } else {
+                $adminIds = \app\admin\model\AuthGroupAccess::where('group_id', 'in', $group_id)->column('uid');
+                $list = \app\admin\model\Admin::where('id', 'in', $adminIds)->field('id as value, username AS name')->select();
+            }
+        }
+        $this->success('', null, $list);
+    }
+
+    /**
+     * 搜索下拉列表
+     */
+    public function searchlist()
+    {
+        $result = $this->model->limit(10)->select();
+        $searchlist = [];
+        foreach ($result as $key => $value) {
+            $searchlist[] = ['id' => $value['url'], 'name' => $value['url']];
+        }
+        $data = ['searchlist' => $searchlist];
+        $this->success('', null, $data);
+    }
+}

+ 22 - 0
application/admin/controller/example/Colorbadge.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace app\admin\controller\example;
+
+use app\common\controller\Backend;
+
+/**
+ * 彩色角标
+ *
+ * @icon fa fa-table
+ * @remark 在JS端控制角标的显示与隐藏,请注意左侧菜单栏角标的数值变化
+ */
+class Colorbadge extends Backend
+{
+    protected $model = null;
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = model('AdminLog');
+    }
+}

+ 22 - 0
application/admin/controller/example/Controllerjump.php

@@ -0,0 +1,22 @@
+<?php
+
+namespace app\admin\controller\example;
+
+use app\common\controller\Backend;
+
+/**
+ * 控制器间跳转
+ *
+ * @icon fa fa-table
+ * @remark FastAdmin支持在控制器间跳转,点击后将切换到另外一个TAB中,无需刷新当前页面
+ */
+class Controllerjump extends Backend
+{
+    protected $model = null;
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = model('AdminLog');
+    }
+}

+ 42 - 0
application/admin/controller/example/Customform.php

@@ -0,0 +1,42 @@
+<?php
+
+namespace app\admin\controller\example;
+
+use app\admin\model\AdminLog;
+use app\common\controller\Backend;
+
+/**
+ * 自定义表单示例
+ *
+ * @icon   fa fa-table
+ * @remark FastAdmin支持在控制器间跳转,点击后将切换到另外一个TAB中,无需刷新当前页面
+ */
+class Customform extends Backend
+{
+    protected $model = null;
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = model('AdminLog');
+    }
+
+    public function index()
+    {
+        if ($this->request->isPost()) {
+            $this->success("提交成功", null, ['data' => json_encode($this->request->post("row/a"), JSON_UNESCAPED_UNICODE)]);
+        }
+        return $this->view->fetch();
+    }
+
+    public function get_title_list()
+    {
+        $query = $this->request->get("query");
+        $suggestions = AdminLog::where('title', 'like', '%' . $query . '%')->limit(10)->column("title");
+        $result = [
+            'query'       => $query,
+            'suggestions' => $suggestions
+        ];
+        return json($result);
+    }
+}

+ 24 - 0
application/admin/controller/example/Customsearch.php

@@ -0,0 +1,24 @@
+<?php
+
+namespace app\admin\controller\example;
+
+use app\common\controller\Backend;
+
+/**
+ * 自定义搜索
+ *
+ * @icon fa fa-search
+ * @remark 自定义列表的搜索
+ */
+class Customsearch extends Backend
+{
+    protected $model = null;
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = model('AdminLog');
+        $ipList = $this->model->whereTime('createtime', '-37 days')->group("ip")->column("ip,ip as aa");
+        $this->view->assign("ipList", $ipList);
+    }
+}

+ 21 - 0
application/admin/controller/example/Cxselect.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace app\admin\controller\example;
+
+use app\common\controller\Backend;
+
+/**
+ * 多级联动
+ *
+ * @icon fa fa-table
+ * @remark FastAdmin使用了jQuery-cxselect实现多级联动,更多文档请参考https://github.com/karsonzhang/cxSelect
+ */
+class Cxselect extends Backend
+{
+    protected $model = null;
+
+    public function _initialize()
+    {
+        parent::_initialize();
+    }
+}

+ 44 - 0
application/admin/controller/example/Echarts.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace app\admin\controller\example;
+
+use app\common\controller\Backend;
+
+/**
+ * 统计图表示例
+ *
+ * @icon   fa fa-charts
+ * @remark 展示在FastAdmin中使用Echarts展示丰富多彩的统计图表
+ */
+class Echarts extends Backend
+{
+    protected $model = null;
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = model('AdminLog');
+    }
+
+    /**
+     * 查看
+     */
+    public function index()
+    {
+
+        return $this->view->fetch();
+    }
+
+    /**
+     * 详情
+     */
+    public function detail($ids)
+    {
+        $row = $this->model->get(['id' => $ids]);
+        if (!$row) {
+            $this->error(__('No Results were found'));
+        }
+        $this->view->assign("row", $row->toArray());
+        return $this->view->fetch();
+    }
+}

+ 92 - 0
application/admin/controller/example/Multitable.php

@@ -0,0 +1,92 @@
+<?php
+
+namespace app\admin\controller\example;
+
+use app\common\controller\Backend;
+
+/**
+ * 多表格示例
+ *
+ * @icon fa fa-table
+ * @remark 当一个页面上存在多个Bootstrap-table时该如何控制按钮和表格
+ */
+class Multitable extends Backend
+{
+    protected $model = null;
+    protected $noNeedRight = ['table1', 'table2'];
+
+    public function _initialize()
+    {
+        parent::_initialize();
+    }
+
+    /**
+     * 查看
+     */
+    public function index()
+    {
+        $this->loadlang('general/attachment');
+        $this->loadlang('general/crontab');
+        return $this->view->fetch();
+    }
+
+    public function table1()
+    {
+        $this->model = model('Attachment');
+        //设置过滤方法
+        $this->request->filter(['strip_tags']);
+        if ($this->request->isAjax()) {
+            //如果发送的来源是Selectpage,则转发到Selectpage
+            if ($this->request->request('keyField')) {
+                return $this->selectpage();
+            }
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+            $total = $this->model
+                    ->where($where)
+                ->field('id,filename,filesize,imagewidth,imageheight,mimetype')
+                    ->order($sort, $order)
+                    ->count();
+
+            $list = $this->model
+                    ->where($where)
+                    ->field('id,filename,filesize,imagewidth,imageheight,mimetype')
+                    ->order($sort, $order)
+                    ->limit($offset, $limit)
+                    ->select();
+
+            $result = array("total" => $total, "rows" => $list);
+
+            return json($result);
+        }
+        return $this->view->fetch('index');
+    }
+
+    public function table2()
+    {
+        $this->model = model('AdminLog');
+        //设置过滤方法
+        $this->request->filter(['strip_tags']);
+        if ($this->request->isAjax()) {
+            //如果发送的来源是Selectpage,则转发到Selectpage
+            if ($this->request->request('keyField')) {
+                return $this->selectpage();
+            }
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+            $total = $this->model
+                    ->where($where)
+                    ->order($sort, $order)
+                    ->count();
+
+            $list = $this->model
+                    ->where($where)
+                    ->order($sort, $order)
+                    ->limit($offset, $limit)
+                    ->select();
+
+            $result = array("total" => $total, "rows" => $list);
+
+            return json($result);
+        }
+        return $this->view->fetch('index');
+    }
+}

+ 44 - 0
application/admin/controller/example/Relationmodel.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace app\admin\controller\example;
+
+use app\common\controller\Backend;
+
+/**
+ * 关联模型
+ *
+ * @icon   fa fa-table
+ * @remark 当使用到关联模型时需要重载index方法
+ */
+class Relationmodel extends Backend
+{
+    protected $model = null;
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = model('AdminLog');
+    }
+
+    /**
+     * 查看
+     */
+    public function index()
+    {
+        $this->relationSearch = true;
+        $this->searchFields = "admin.username,id";
+        if ($this->request->isAjax()) {
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+            $list = $this->model
+                ->with("admin")
+                ->where($where)
+                ->order($sort, $order)
+                ->paginate($limit);
+
+            $result = array("total" => $list->total(), "rows" => $list->items());
+
+            return json($result);
+        }
+        return $this->view->fetch();
+    }
+}

+ 83 - 0
application/admin/controller/example/Tablelink.php

@@ -0,0 +1,83 @@
+<?php
+
+namespace app\admin\controller\example;
+
+use app\common\controller\Backend;
+
+/**
+ * 表格联动
+ * 点击左侧日志列表,右侧的表格数据会显示指定管理员的日志列表
+ * @icon fa fa-table
+ */
+class Tablelink extends Backend
+{
+    protected $model = null;
+    protected $noNeedRight = ['table1', 'table2'];
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = model('AdminLog');
+    }
+
+
+    public function table1()
+    {
+        $this->model = model('Admin');
+        //设置过滤方法
+        $this->request->filter(['strip_tags']);
+        if ($this->request->isAjax()) {
+            //如果发送的来源是Selectpage,则转发到Selectpage
+            if ($this->request->request('keyField')) {
+                return $this->selectpage();
+            }
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+            $total = $this->model
+                ->where($where)
+                ->field('id,username')
+                ->order($sort, $order)
+                ->count();
+
+            $list = $this->model
+                ->where($where)
+                ->field('id,username')
+                ->order($sort, $order)
+                ->limit($offset, $limit)
+                ->select();
+
+            $result = array("total" => $total, "rows" => $list);
+
+            return json($result);
+        }
+        return $this->view->fetch('index');
+    }
+
+    public function table2()
+    {
+        $this->model = model('AdminLog');
+        //设置过滤方法
+        $this->request->filter(['strip_tags']);
+        if ($this->request->isAjax()) {
+            //如果发送的来源是Selectpage,则转发到Selectpage
+            if ($this->request->request('keyField')) {
+                return $this->selectpage();
+            }
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams();
+            $total = $this->model
+                ->where($where)
+                ->order($sort, $order)
+                ->count();
+
+            $list = $this->model
+                ->where($where)
+                ->order($sort, $order)
+                ->limit($offset, $limit)
+                ->select();
+
+            $result = array("total" => $total, "rows" => $list);
+
+            return json($result);
+        }
+        return $this->view->fetch('index');
+    }
+}

+ 58 - 0
application/admin/controller/example/Tabletemplate.php

@@ -0,0 +1,58 @@
+<?php
+
+namespace app\admin\controller\example;
+
+use app\common\controller\Backend;
+
+/**
+ * 表格模板示例
+ *
+ * @icon   fa fa-table
+ * @remark 可以通过使用表格模板将表格中的行渲染成一样的展现方式,基于此功能可以任意定制自己想要的展示列表
+ */
+class Tabletemplate extends Backend
+{
+    protected $model = null;
+
+    public function _initialize()
+    {
+        parent::_initialize();
+        $this->model = model('AdminLog');
+    }
+
+    /**
+     * 查看
+     */
+    public function index()
+    {
+        if ($this->request->isAjax()) {
+            list($where, $sort, $order, $offset, $limit) = $this->buildparams(null);
+            $total = $this->model
+                ->where($where)
+                ->order($sort, $order)
+                ->count();
+            $list = $this->model
+                ->where($where)
+                ->order($sort, $order)
+                ->limit($offset, $limit)
+                ->select();
+            $result = array("total" => $total, "rows" => $list);
+
+            return json($result);
+        }
+        return $this->view->fetch();
+    }
+
+    /**
+     * 详情
+     */
+    public function detail($ids)
+    {
+        $row = $this->model->get(['id' => $ids]);
+        if (!$row) {
+            $this->error(__('No Results were found'));
+        }
+        $this->view->assign("row", $row->toArray());
+        return $this->view->fetch();
+    }
+}

+ 15 - 0
application/admin/model/Area.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace app\admin\model;
+
+use think\Model;
+
+class Area extends Model
+{
+
+    // 开启自动写入时间戳字段
+    protected $autoWriteTimestamp = false;
+    // 定义时间戳字段名
+    protected $createTime = false;
+    protected $updateTime = false;
+}

+ 5 - 0
application/admin/model/books/Books.php

@@ -47,6 +47,11 @@ class Books extends Model
         return ['0' => __('是'), '1' => __('否')];
     }
 
+    public function getIsSeriesList()
+    {
+        return ['0' => __('是'), '1' => __('否')];
+    }
+
 
     public function getBookTypeTextAttr($value, $data)
     {

+ 14 - 0
application/admin/view/books/books/add.html

@@ -197,6 +197,20 @@
 
         </div>
     </div>
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">是否可以按照系列购买:</label>
+        <div class="col-xs-12 col-sm-8">
+
+            <select  id="c-is_series" class="form-control selectpicker" name="row[is_series]">
+                {foreach name="IsSeriesList" item="vo"}
+                <option value="{$key}" {in name="key" value="$row.is_series"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+
+        </div>
+    </div>
+
     <div class="form-group">
         <label class="control-label col-xs-12 col-sm-2">{:__('Price')}:</label>
         <div class="col-xs-12 col-sm-8">

+ 14 - 0
application/admin/view/books/books/edit.html

@@ -195,6 +195,20 @@
 
         </div>
     </div>
+
+    <div class="form-group">
+        <label class="control-label col-xs-12 col-sm-2">是否可以按照系列购买:</label>
+        <div class="col-xs-12 col-sm-8">
+
+            <select  id="c-is_series" class="form-control selectpicker" name="row[is_series]">
+                {foreach name="IsSeriesList" item="vo"}
+                <option value="{$key}" {in name="key" value="$row.is_series"}selected{/in}>{$vo}</option>
+                {/foreach}
+            </select>
+
+        </div>
+    </div>
+
     <div class="form-group">
         <label class="control-label col-xs-12 col-sm-2">{:__('Price')}:</label>
         <div class="col-xs-12 col-sm-8">

+ 142 - 3
application/admin/view/books/books/index.html

@@ -10,11 +10,11 @@
                         <a href="javascript:;" class="btn btn-success btn-add {:$auth->check('books/books/add')?'':'hide'}" title="{:__('Add')}" ><i class="fa fa-plus"></i> {:__('Add')}</a>
                         <a href="javascript:;" class="btn btn-success btn-edit btn-disabled disabled {:$auth->check('books/books/edit')?'':'hide'}" title="{:__('Edit')}" ><i class="fa fa-pencil"></i> {:__('Edit')}</a>
                         <a href="javascript:;" class="btn btn-danger btn-del btn-disabled disabled {:$auth->check('books/books/del')?'':'hide'}" title="{:__('Delete')}" ><i class="fa fa-trash"></i> {:__('Delete')}</a>
-                        
 
-                        
 
-                        
+
+
+
                     </div>
                     <table id="table" class="table table-striped table-bordered table-hover table-nowrap"
                            data-operate-edit="{:$auth->check('books/books/edit')}"
@@ -27,3 +27,142 @@
         </div>
     </div>
 </div>
+
+<script id="customformtpl" type="text/html">
+    <!--form表单必须添加form-commsearch这个类-->
+    <form action="" class="form-commonsearch">
+        <div style="border-radius:2px;margin-bottom:10px;background:#f5f5f5;padding:15px 20px;">
+            <h4>自定义搜索表单</h4>
+            <hr>
+            <div class="row">
+<!--                <div class="col-xs-12 col-sm-6 col-md-3">-->
+<!--                    <div class="form-group">-->
+<!--                        <label class="control-label">ID</label>-->
+<!--                        &lt;!&ndash;显式的operate操作符&ndash;&gt;-->
+<!--                        <div class="input-group">-->
+<!--                            <div class="input-group-btn">-->
+<!--                                <select class="form-control operate" data-name="id" style="width:60px;">-->
+<!--                                    <option value="=" selected>等于</option>-->
+<!--                                    <option value=">">大于</option>-->
+<!--                                    <option value="<">小于</option>-->
+<!--                                </select>-->
+<!--                            </div>-->
+<!--                            <input class="form-control" type="text" name="id" placeholder="" value=""/>-->
+<!--                        </div>-->
+<!--                    </div>-->
+<!--                </div>-->
+
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label">教材名称</label>
+                        <!--隐式的operate操作符,必须携带一个class为operate隐藏的文本框,且它的data-name="字段",值为操作符-->
+                        <input class="operate" type="hidden" data-name="title" value="like"/>
+                        <div>
+                            <input class="form-control" type="text" name="title" placeholder="请输入查找的教材名称" value=""/>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label">简介</label>
+                        <!--隐式的operate操作符,必须携带一个class为operate隐藏的文本框,且它的data-name="字段",值为操作符-->
+                        <input class="operate" type="hidden" data-name="content_desc" value="like"/>
+                        <div>
+                            <input class="form-control" type="text" name="content_desc" placeholder="请输入查找的简介" value=""/>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label">作者</label>
+                        <!--隐式的operate操作符,必须携带一个class为operate隐藏的文本框,且它的data-name="字段",值为操作符-->
+                        <input class="operate" type="hidden" data-name="author" value="like"/>
+                        <div>
+                            <input class="form-control" type="text" name="author" placeholder="请输入查找的作者名称" value=""/>
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label">用户名</label>
+                        <input type="hidden" class="operate" data-name="series_id" value="="/>
+                        <div>
+                            <input id="c-series_id" data-source="books.books_series/index" data-primary-key="id"
+                                   class="form-control selectpage" name="series_id" type="text"
+                                   value="" data-field="title"  style="display:block;">
+                        </div>
+                    </div>
+                </div>
+
+
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label">价格</label>
+                        <!--隐式的operate操作符,必须携带一个class为operate隐藏的文本框,且它的data-name="字段",值为操作符-->
+                        <input class="operate" type="hidden" data-name="price" value="="/>
+                        <div>
+                            <input class="form-control" type="number" name="price" placeholder="请输入查找的价格" value=""/>
+                        </div>
+                    </div>
+                </div>
+<!--                <div class="col-xs-12 col-sm-6 col-md-3">-->
+<!--                    <div class="form-group">-->
+<!--                        <label class="control-label">管理员ID</label>-->
+<!--                        <div class="row" data-toggle="cxselect" data-selects="group,admin">-->
+<!--                            <div class="col-xs-6">-->
+<!--                                <select class="group form-control" name="group"-->
+<!--                                        data-url="example/bootstraptable/cxselect?type=group"></select>-->
+<!--                            </div>-->
+<!--                            <div class="col-xs-6">-->
+<!--                                <select class="admin form-control" name="admin_id"-->
+<!--                                        data-url="example/bootstraptable/cxselect?type=admin"-->
+<!--                                        data-query-name="group_id"></select>-->
+<!--                            </div>-->
+<!--                            <input type="hidden" class="operate" data-name="admin_id" value="="/>-->
+<!--                        </div>-->
+<!--                    </div>-->
+<!--                </div>-->
+
+
+<!--                <div class="col-xs-12 col-sm-6 col-md-3">-->
+<!--                    <div class="form-group">-->
+<!--                        <label class="control-label">价格</label>-->
+<!--                        <div class="row row-between">-->
+<!--                            <div class="col-xs-6">-->
+<!--                                <input type="text" class="form-control" name="price" value="" placeholder="资源价格" id="price-min" data-index="14">-->
+<!--                            </div>-->
+<!--                            <div class="col-xs-6">-->
+<!--                                <input type="text" class="form-control" name="price" value="" placeholder="资源价格" id="price-max" data-index="14">-->
+<!--                            </div>-->
+<!--                        </div>-->
+<!--                    </div>-->
+<!--                </div>-->
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label">创建时间</label>
+                        <input type="hidden" class="operate" data-name="createtime" value="RANGE"/>
+                        <div>
+                            <input type="text" class="form-control datetimerange" name="createtime" value=""/>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label"></label>
+                        <div class="row">
+                            <div class="col-xs-6">
+                                <input type="submit" class="btn btn-success btn-block" value="提交"/>
+                            </div>
+                            <div class="col-xs-6">
+                                <input type="reset" class="btn btn-primary btn-block" value="重置"/>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </form>
+</script>

+ 33 - 0
application/admin/view/example/bootstraptable/detail.html

@@ -0,0 +1,33 @@
+<table class="table table-striped">
+    <thead>
+        <tr>
+            <th>{:__('Title')}</th>
+            <th>{:__('Content')}</th>
+        </tr>
+    </thead>
+    <tbody>
+        {volist name="row" id="vo"  }
+        <tr>
+            <td>{$key}</td>
+            <td style="word-break: break-all;">{$vo|htmlentities}</td>
+        </tr>
+        {/volist}
+        {if $Think.get.dialog}
+        <tr>
+            <td>回传数据</td>
+            <td>
+                <div class="input-group">
+                    <input name="callback" class="form-control" value="test" />
+                    <span class="input-group-btn"><a href="javascript:;" class="btn btn-success btn-callback" >回传数据</a></span>
+                </div>
+            </td>
+        </tr>
+        {/if}
+    </tbody>
+</table>
+<div class="hide layer-footer">
+    <label class="control-label col-xs-12 col-sm-2"></label>
+    <div class="col-xs-12 col-sm-8">
+        <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
+    </div>
+</div>

+ 11 - 0
application/admin/view/example/bootstraptable/edit.html

@@ -0,0 +1,11 @@
+<table class="table table-striped">
+    <tbody>
+        <tr><td>这里是编辑窗口</td></tr>
+    </tbody>
+</table>
+<div class="hide layer-footer">
+    <label class="control-label col-xs-12 col-sm-2"></label>
+    <div class="col-xs-12 col-sm-8">
+        <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
+    </div>
+</div>

+ 57 - 0
application/admin/view/example/bootstraptable/index.html

@@ -0,0 +1,57 @@
+<div class="panel panel-default panel-intro">
+
+    <div class="panel-heading">
+        {:build_heading(null,FALSE)}
+        <ul class="nav nav-tabs nav-custom-condition">
+            <li class="active"><a href="#t-all" data-value="" data-toggle="tab">{:__('All')}</a></li>
+            <li class=""><a href="#t-1" data-value='1' data-toggle="tab">自定义搜索条件1</a></li>
+            <li class=""><a href="#t-2" data-value='2' data-toggle="tab">自定义搜索条件2</a></li>
+        </ul>
+    </div>
+
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <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>
+                        <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">
+                                <li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
+                                <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/start" 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/pause" href="javascript:;"><i class="fa fa-pause"></i> 暂停</a>
+                        <a href="javascript:;" class="btn btn-default" style="font-size:14px;color:dodgerblue;">
+                            <span class="extend">
+                                金额:<span id="money">0</span>
+                                单价:<span id="price">0</span>
+                            </span>
+                        </a>
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%">
+
+                    </table>
+
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script id="categorytpl" type="text/html">
+    <div class="row">
+        <div class="col-xs-12">
+            <div class="form-inline" data-toggle="cxselect" data-selects="group,admin">
+                <select class="group form-control" name="group" data-url="example/bootstraptable/cxselect?type=group"></select>
+                <select class="admin form-control" name="admin_id" data-url="example/bootstraptable/cxselect?type=admin" data-query-name="group_id"></select>
+                <input type="hidden" class="operate" data-name="admin_id" value="=" />
+            </div>
+        </div>
+    </div>
+</script>

+ 21 - 0
application/admin/view/example/colorbadge/index.html

@@ -0,0 +1,21 @@
+<div class="panel panel-default panel-intro">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <div id="toolbar" class="toolbar">
+                        {:build_toolbar('refresh,delete')}
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover" width="100%">
+
+                    </table>
+
+
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 21 - 0
application/admin/view/example/controllerjump/index.html

@@ -0,0 +1,21 @@
+<div class="panel panel-default panel-intro">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <div id="toolbar" class="toolbar">
+                        {:build_toolbar('refresh,delete')}
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover" width="100%">
+
+                    </table>
+
+
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 302 - 0
application/admin/view/example/customform/index.html

@@ -0,0 +1,302 @@
+<style>
+    .upload-image {
+        background: url('__CDN__/assets/addons/example/img/plus.png') no-repeat center center;
+        background-size: 30px 30px;
+        height: 30px;
+        width: 30px;
+        border: 1px solid #ccc;
+    }
+</style>
+<div class="row">
+    <div class="col-md-6">
+        <div class="box box-success">
+            <div class="panel-heading">
+                {:__('自定义图片描述')}
+            </div>
+            <div class="panel-body">
+                <div class="alert alert-success-light">
+                    <b>温馨提示</b><br>
+                    默认我们的多图是没有图片描述的,如果我们需要自定义描述,可以使用以下的自定义功能<br>
+                    特别注意的是图片的url和描述是分开储存的,也就是说图片一个字段,描述一个字段,你在前台使用时需要自己匹配映射关系<br>
+                    <b>下面的演示textarea为了便于调试,设置为可见的,实际使用中应该添加个hidden的class进行隐藏</b>
+                </div>
+                <form id="first-form" role="form" data-toggle="validator" method="POST" action="">
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12">{:__('一维数组示例')}:</label>
+                        <div class="col-xs-12">
+                            <div class="input-group">
+                                <input id="c-files" data-rule="required" class="form-control" size="50" name="row[files]" type="text" value="https://cdn.fastadmin.net/uploads/addons/blog.png,https://cdn.fastadmin.net/uploads/addons/cms.png,https://cdn.fastadmin.net/uploads/addons/vote.png">
+                                <div class="input-group-addon no-border no-padding">
+                                    <span><button type="button" id="plupload-files" class="btn btn-danger plupload" data-input-id="c-files" data-mimetype="*" data-multiple="true" data-preview-id="p-files"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
+                                    <span><button type="button" id="fachoose-files" class="btn btn-primary fachoose" data-input-id="c-files" data-mimetype="*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
+                                </div>
+                                <span class="msg-box n-right" for="c-files"></span>
+                            </div>
+
+                            <!--ul需要添加 data-template和data-name属性,并一一对应且唯一 -->
+                            <ul class="row list-inline plupload-preview" id="p-files" data-template="introtpl" data-name="row[intro]"></ul>
+
+                            <!--请注意 ul和textarea间不能存在其它任何元素,实际开发中textarea应该添加个hidden进行隐藏-->
+                            <textarea name="row[intro]" class="form-control" style="margin-top:5px;">["简洁响应式博客","CMS内容管理系统","在线投票系统"]</textarea>
+
+                            <!--这里自定义图片预览的模板 开始-->
+                            <script type="text/html" id="introtpl">
+                                <li class="col-xs-3">
+                                    <a href="<%=fullurl%>" data-url="<%=url%>" target="_blank" class="thumbnail">
+                                        <img src="<%=fullurl%>" class="img-responsive">
+                                    </a>
+                                    <input type="text" name="row[intro][<%=index%>]" class="form-control mb-1" placeholder="请输入文件描述" value="<%=value?value:''%>"/>
+                                    <a href="javascript:;" class="btn btn-danger btn-xs btn-trash"><i class="fa fa-trash"></i></a>
+                                </li>
+                            </script>
+                            <!--这里自定义图片预览的模板 结束-->
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12">{:__('二维数组示例')}:</label>
+                        <div class="col-xs-12">
+                            <div class="input-group">
+                                <input id="c-images" data-rule="required" class="form-control" size="50" name="row[images]" type="text" value="https://cdn.fastadmin.net/uploads/addons/example.png,https://cdn.fastadmin.net/uploads/addons/upyun.png,https://cdn.fastadmin.net/uploads/addons/alioss.png">
+                                <div class="input-group-addon no-border no-padding">
+                                    <span><button type="button" id="plupload-images" class="btn btn-danger plupload" data-input-id="c-images" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="true" data-preview-id="p-images"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
+                                    <span><button type="button" id="fachoose-images" class="btn btn-primary fachoose" data-input-id="c-images" data-mimetype="image/*" data-multiple="true"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
+                                </div>
+                                <span class="msg-box n-right" for="c-images"></span>
+                            </div>
+
+                            <!--ul需要添加 data-template和data-name属性,并一一对应且唯一 -->
+                            <ul class="row list-inline plupload-preview" id="p-images" data-template="desctpl" data-name="row[desc]"></ul>
+
+                            <!--请注意 ul和textarea间不能存在其它任何元素,实际开发中textarea应该添加个hidden进行隐藏-->
+                            <textarea name="row[desc]" class="form-control" style="margin-top:5px;">[{"info":"开发者示例插件","size":"1M"},{"info":"又拍云储存整合","size":"2M"},{"info":"阿里OSS云储存","size":"1M"}]</textarea>
+
+                            <!--这里自定义图片预览的模板 开始-->
+                            <script type="text/html" id="desctpl">
+                                <li class="col-xs-3">
+                                    <a href="<%=fullurl%>" data-url="<%=url%>" target="_blank" class="thumbnail">
+                                        <img src="<%=fullurl%>" class="img-responsive">
+                                    </a>
+                                    <input type="text" name="row[desc][<%=index%>][info]" class="form-control mb-1" placeholder="请输入插件描述" value="<%=value?value['info']:''%>"/>
+                                    <input type="text" name="row[desc][<%=index%>][size]" class="form-control mb-1" placeholder="请输入插件大小" value="<%=value?value['size']:''%>"/>
+                                    <a href="javascript:;" class="btn btn-danger btn-xs btn-trash"><i class="fa fa-trash"></i></a>
+                                </li>
+                            </script>
+                            <!--这里自定义图片预览的模板 结束-->
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12"></label>
+                        <div class="col-xs-12">
+                            <button type="submit" class="btn btn-success btn-embossed">{:__('OK')}</button>
+                            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+                        </div>
+                    </div>
+
+                </form>
+            </div>
+        </div>
+
+    </div>
+    <div class="col-md-6">
+        <div class="box box-info">
+            <div class="panel-heading">
+                {:__('自定义Fieldlist示例')}
+            </div>
+            <div class="panel-body">
+                <div class="alert alert-danger-light">
+                    <b>温馨提示</b><br>
+                    默认我们的fieldlist只有一维数组,为键值形式,如果需要二维数组,可使用下面的自定义模板来实现<br>
+                    默认追加的元素是没有进行事件绑定的,我们需要监听btn-append这个按钮的fa.event.appendfieldlist事件<br>
+                    <b>下面的演示textarea为了便于调试,设置为可见的,实际使用中应该添加个hidden的class进行隐藏</b>
+                </div>
+                <form id="second-form" role="form" data-toggle="validator" method="POST" action="">
+
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12">{:__('Fieldlist示例')}:</label>
+                        <div class="col-xs-12">
+                            <table class="table fieldlist" data-template="basictpl" data-name="row[basic]" id="first-table">
+                                <tr>
+                                    <td>{:__('标题')}</td>
+                                    <td>{:__('介绍')}</td>
+                                    <td>{:__('大小')}</td>
+                                    <td>{:__('状态')}</td>
+                                    <td width="100"></td>
+                                </tr>
+                                <tr>
+                                    <td colspan="5"><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></td>
+                                </tr>
+                            </table>
+
+                            <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
+                            <textarea name="row[basic]" class="form-control" cols="30" rows="5">[{"title":"开发者示例插件","intro":"开发者必备","size":"1M","state":1},{"title":"又拍云储存整合","intro":"一款云储存","size":"2M","state":0},{"title":"阿里OSS云储存","intro":"一款云储存","size":"1M","state":1}]</textarea>
+                            <script id="basictpl" type="text/html">
+                                <tr class="form-inline">
+                                    <td><input type="text" name="<%=name%>[<%=index%>][title]" class="form-control" size="15" value="<%=row.title%>" placeholder="标题"/></td>
+                                    <td><input type="text" name="<%=name%>[<%=index%>][intro]" class="form-control" size="15" value="<%=row.intro%>" placeholder="介绍"/></td>
+                                    <td><input type="text" name="<%=name%>[<%=index%>][size]" class="form-control" style="width:50px" value="<%=row.size%>" placeholder="大小"/></td>
+                                    <td>
+                                        <input type="hidden" name="<%=name%>[<%=index%>][state]" id="c-state-<%=index%>" class="form-control" style="width:50px" value="<%=row.state%>" placeholder="状态"/>
+                                        <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-state-<%=index%>" data-yes="1" data-no="0" >
+                                            <i class="fa fa-toggle-on text-success <%if(row.state==0){%>fa-flip-horizontal text-gray<%}%> fa-2x"></i>
+                                        </a>
+                                    </td>
+                                    <td>
+                                        <!--下面的两个按钮务必保留-->
+                                        <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
+                                        <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
+                                    </td>
+                                </tr>
+                            </script>
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12">{:__('元素事件')}:</label>
+                        <div class="col-xs-12">
+                            <table class="table fieldlist" data-template="eventtpl" data-name="row[event]" id="second-table">
+                                <tr>
+                                    <td>{:__('管理员')}</td>
+                                    <td>{:__('图片')}</td>
+                                    <td>{:__('登录时间')}</td>
+                                    <td width="100"></td>
+                                </tr>
+                                <tr>
+                                    <td colspan="4"><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></td>
+                                </tr>
+                            </table>
+
+                            <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
+                            <textarea name="row[event]" class="form-control" cols="30" rows="5">[{"id":"1","image":"/assets/addons/example/img/200x200.png","time":"2019-06-28 12:05:03"}]</textarea>
+                            <script id="eventtpl" type="text/html">
+                                <tr class="form-inline">
+                                    <td><input type="text" name="<%=name%>[<%=index%>][id]" class="form-control selectpage" data-source="auth/admin/selectpage" data-field="username" value="<%=row.id%>" placeholder="管理员"/></td>
+                                    <td>
+                                        <input type="hidden" name="<%=name%>[<%=index%>][image]" id="c-image-<%=index%>" value="<%=row.image%>">
+                                        <!--@formatter:off-->
+                                        <button type="button" id="faupload-image" class="btn btn-danger faupload upload-image" data-input-id="c-image-<%=index%>" data-mimetype="image/gif,image/jpeg,image/png,image/jpg,image/bmp,image/webp" data-multiple="false" <%if(row.image){%>style="background-image: url('<%=Fast.api.cdnurl(row.image)%>')"<%}%>></button>
+                                        <!--@formatter:on-->
+                                    </td>
+                                    <td><input type="text" name="<%=name%>[<%=index%>][time]" class="form-control datetimepicker" style="width:120px" value="<%=row.time%>" placeholder="时间"/></td>
+                                    <td>
+                                        <!--下面的两个按钮务必保留-->
+                                        <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
+                                        <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
+                                    </td>
+                                </tr>
+                            </script>
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12"></label>
+                        <div class="col-xs-12">
+                            <button type="submit" class="btn btn-success btn-embossed">{:__('OK')}</button>
+                            <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
+                        </div>
+                    </div>
+
+                </form>
+            </div>
+        </div>
+
+    </div>
+    <div class="col-md-6">
+        <div class="box box-warning">
+            <div class="panel-heading">
+                自动完成+标签输入示例,<font color="red">只支持FastAdmin1.3.0+</font> {if version_compare($Think.config.fastadmin.version, '1.3.0')<0}<span class="label label-danger">你当前FastAdmin版本不支持</span>{/if}
+            </div>
+            <div class="panel-body">
+                <div class="alert alert-danger-light">
+                    <b>温馨提示</b><br>
+                </div>
+                <form id="third-form" role="form" data-toggle="validator" method="POST" action="">
+
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12">自动完成</label>
+                        <div class="col-xs-12">
+                            <input type="text" class="form-control" data-role="autocomplete" data-autocomplete-options='{"url":"example/customform/get_title_list", "minChars":1}' />
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12">标签输入 <span class="text-muted small">输入后<code>回车</code>或<code>,</code>确认</span></label>
+                        <div class="col-xs-12">
+                            <input type="text" class="form-control" data-role="tagsinput" />
+                        </div>
+                    </div>
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12">自动完成+标签输入</label>
+                        <div class="col-xs-12">
+                            <input type="text" class="form-control" data-role="tagsinput" data-tagsinput-options='{"minChars":1, "autocomplete":{"url":"example/customform/get_title_list"}}' />
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+    <div class="col-md-6">
+        <div class="box box-danger">
+            <div class="panel-heading">
+                动态显示,<font color="red">只支持FastAdmin1.3.3+</font> {if version_compare($Think.config.fastadmin.version, '1.3.3')<0}<span class="label label-danger">你当前FastAdmin版本不支持</span>{/if}
+            </div>
+            <div class="panel-body">
+                <form id="fourth-form" role="form" data-toggle="validator" method="POST" action="">
+
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12">常规使用</label>
+                        <div class="col-xs-12">
+                                <input type="radio" name="row[type]" value="value1" checked /> 类型1
+                                <input type="radio" name="row[type]" value="value2" /> 类型2
+                                <div data-favisible="type=value1" class="p-3">显示内容1</div>
+                                <div data-favisible="type=value2" class="p-3">显示内容2</div>
+                        </div>
+                    </div>
+                    <hr>
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12">使用开关组件</label>
+                        <div class="col-xs-12">
+
+                            <input  id="c-switch" name="row[switch]" type="hidden" value="0">
+                            <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-switch" data-yes="1" data-no="0" >
+                                <i class="fa fa-toggle-on text-success fa-flip-horizontal text-gray fa-2x"></i>
+                            </a>
+
+                            <div data-favisible="switch=1" class="p-3">显示内容隐藏的内容</div>
+                        </div>
+                    </div>
+                    <hr>
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12">组件嵌套</label>
+                        <div class="col-xs-12">
+                            <input type="radio" name="row[mode]" value="value1" /> 模式1
+                            <input type="radio" name="row[mode]" value="value2" /> 模式2
+                            <div data-favisible="mode=value1" class="p-3">
+                                <h4>显示内容1</h4>
+                                <input  id="c-switch1" name="row[switch1]" type="hidden" value="0">
+                                <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-switch1" data-yes="1" data-no="0" >
+                                    <i class="fa fa-toggle-on text-success fa-flip-horizontal text-gray fa-2x"></i>
+                                </a>
+
+                                <div data-favisible="switch1=1" class="p-3">显示内容隐藏的内容1</div>
+                            </div>
+                            <div data-favisible="mode=value2" class="p-3">
+                                <h4>显示内容2</h4>
+                                <input  id="c-switch2" name="row[switch2]" type="hidden" value="0">
+                                <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-switch2" data-yes="1" data-no="0" >
+                                    <i class="fa fa-toggle-on text-success fa-flip-horizontal text-gray fa-2x"></i>
+                                </a>
+
+                                <div data-favisible="switch2=1" class="p-3">显示内容隐藏的内容2</div>
+                            </div>
+                        </div>
+                    </div>
+                    <hr>
+                    <div class="form-group row">
+                        <label class="control-label col-xs-12">使用内容判断 <span class="text-muted small">只有输入指定的内容才显示</span></label>
+                        <div class="col-xs-12">
+                            <input type="text" class="form-control" name="row[title]" placeholder="请输入abc三个字母">
+                            <div data-favisible="title=abc" class="p-3">显示内容隐藏的内容</div>
+                        </div>
+                    </div>
+                </form>
+            </div>
+        </div>
+    </div>
+</div>

+ 126 - 0
application/admin/view/example/customsearch/index.html

@@ -0,0 +1,126 @@
+<div class="panel panel-default panel-intro">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <div id="toolbar" class="toolbar">
+                        {:build_toolbar('refresh')}
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover" width="100%">
+
+                    </table>
+
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+
+<script id="customformtpl" type="text/html">
+    <!--form表单必须添加form-commsearch这个类-->
+    <form action="" class="form-commonsearch">
+        <div style="border-radius:2px;margin-bottom:10px;background:#f5f5f5;padding:15px 20px;">
+            <h4>自定义搜索表单</h4>
+            <hr>
+            <div class="row">
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label">ID</label>
+                        <!--显式的operate操作符-->
+                        <div class="input-group">
+                            <div class="input-group-btn">
+                                <select class="form-control operate" data-name="id" style="width:60px;">
+                                    <option value="=" selected>等于</option>
+                                    <option value=">">大于</option>
+                                    <option value="<">小于</option>
+                                </select>
+                            </div>
+                            <input class="form-control" type="text" name="id" placeholder="" value=""/>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label">标题</label>
+                        <!--隐式的operate操作符,必须携带一个class为operate隐藏的文本框,且它的data-name="字段",值为操作符-->
+                        <input class="operate" type="hidden" data-name="title" value="="/>
+                        <div>
+                        <input class="form-control" type="text" name="title" placeholder="请输入查找的标题" value=""/>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label">管理员ID</label>
+                        <div class="row" data-toggle="cxselect" data-selects="group,admin">
+                            <div class="col-xs-6">
+                                <select class="group form-control" name="group"
+                                        data-url="example/bootstraptable/cxselect?type=group"></select>
+                            </div>
+                            <div class="col-xs-6">
+                                <select class="admin form-control" name="admin_id"
+                                        data-url="example/bootstraptable/cxselect?type=admin"
+                                        data-query-name="group_id"></select>
+                            </div>
+                            <input type="hidden" class="operate" data-name="admin_id" value="="/>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label">用户名</label>
+                        <input type="hidden" class="operate" data-name="username" value="="/>
+                        <div>
+                            <input id="c-category_id" data-source="auth/admin/index" data-primary-key="username"
+                                   data-field="username" class="form-control selectpage" name="username" type="text"
+                                   value="" style="display:block;">
+                        </div>
+                    </div>
+                </div>
+
+                <div class="col-xs-12 col-sm-6 col-md-3" style="min-height:68px;">
+                    <!--这里添加68px是为了避免刷新时出现元素错位闪屏-->
+                    <div class="form-group">
+                        <label class="control-label">IP</label>
+                        <input type="hidden" class="operate" data-name="ip" value="in"/>
+                        <div>
+                        <!--给select一个固定的高度-->
+                        <!--@formatter:off-->
+                        <select id="c-flag" class="form-control selectpicker" multiple name="ip" style="height:31px;">
+                            {foreach name="ipList" item="vo"}
+                            <option value="{$key}" {in name="key" value="" }selected{/in}>{$vo}</option>
+                            {/foreach}
+                        </select>
+                        <!--@formatter:on-->
+                        </div>
+                    </div>
+                </div>
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label">创建时间</label>
+                        <input type="hidden" class="operate" data-name="createtime" value="RANGE"/>
+                        <div>
+                        <input type="text" class="form-control datetimerange" name="createtime" value=""/>
+                        </div>
+                    </div>
+                </div>
+                <div class="col-xs-12 col-sm-6 col-md-3">
+                    <div class="form-group">
+                        <label class="control-label"></label>
+                        <div class="row">
+                            <div class="col-xs-6">
+                                <input type="submit" class="btn btn-success btn-block" value="提交"/>
+                            </div>
+                            <div class="col-xs-6">
+                                <input type="reset" class="btn btn-primary btn-block" value="重置"/>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </form>
+</script>

+ 160 - 0
application/admin/view/example/cxselect/index.html

@@ -0,0 +1,160 @@
+<style>#cxselect-example textarea{margin:10px 0;}</style>
+<div class="panel panel-default panel-intro">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding" id="cxselect-example">
+                    <form id="cxselectform" action="">
+                        <div class="row">
+                            <div class="col-md-6">
+
+                                <div class="panel panel-default">
+                                    <div class="panel-heading"><b>省市区联动</b>(通过AJAX读取数据)</div>
+                                    <div class="panel-body">
+                                        <div class="row">
+                                            <div class="col-xs-9">
+                                                <div class="form-inline" data-toggle="cxselect" data-selects="province,city,area">
+                                                    <select class="province form-control" name="province" data-url="ajax/area"></select>
+                                                    <select class="city form-control" name="city" data-url="ajax/area"></select>
+                                                    <select class="area form-control" name="area" data-url="ajax/area"></select>
+                                                </div>
+                                            </div>
+                                            <div class="col-xs-3 text-right">
+                                                <h6><label class="label label-primary"><i class="fa fa-pencil"></i> 增加</label></h6>
+                                            </div>
+                                            <div class="col-xs-12">
+                                                <textarea class="form-control" rows="8">
+                                                </textarea>
+                                            </div>
+                                        </div>
+                                        <div class="row">
+                                            <div class="col-xs-9">
+                                                <div class="form-inline" data-toggle="cxselect" data-selects="province,city,area">
+                                                    <select class="province form-control" name="province" data-url="ajax/area">
+                                                        <option value="1964" selected>广东省</option>
+                                                    </select>
+                                                    <select class="city form-control" name="city" data-url="ajax/area">
+                                                        <option value="1988" selected>深圳市</option>
+                                                    </select>
+                                                    <select class="area form-control" name="area" data-url="ajax/area">
+                                                        <option value="1991" selected>南山区</option>
+                                                    </select>
+                                                </div>
+                                            </div>
+                                            <div class="col-xs-3 text-right">
+                                                <h6><label class="label label-success"><i class="fa fa-edit"></i> 修改</label></h6>
+                                            </div>
+                                            <div class="col-xs-12">
+                                                <textarea class="form-control" rows="8">
+                                                </textarea>
+                                            </div>
+                                        </div>
+                                    </div>
+
+                                </div>
+                            </div>
+                            <div class="col-md-6">
+                                <div class="panel panel-default">
+                                    <div class="panel-heading"><b>类别联动</b>(Ajax读取数据)</div>
+                                    <div class="panel-body">
+                                        <div class="row">
+                                            <div class="col-xs-9">
+                                                <div class="form-inline" data-toggle="cxselect" data-selects="first,second">
+                                                    <select class="first form-control" name="first" data-url="ajax/category?type=page&pid=5"></select>
+                                                    <select class="second form-control" name="second" data-url="ajax/category" data-query-name="pid"></select>
+                                                </div>
+                                            </div>
+                                            <div class="col-xs-3 text-right">
+                                                <h6><label class="label label-primary"><i class="fa fa-pencil"></i> 增加</label></h6>
+                                            </div>
+                                            <div class="col-xs-12">
+                                                <textarea class="form-control" rows="8">
+                                                </textarea>
+                                            </div>
+                                        </div>
+                                        <div class="row">
+                                            <div class="col-xs-9">
+                                                <div class="form-inline" data-toggle="cxselect" data-selects="first,second">
+                                                    <select class="first form-control" name="first" data-url="ajax/category?type=page&pid=5">
+                                                        <option value="6" selected>网站建站</option>
+                                                    </select>
+                                                    <select class="second form-control" name="second" data-url="ajax/category" data-query-name="pid">
+                                                        <option value="9" selected>移动端</option>
+                                                    </select>
+                                                </div>
+                                            </div>
+                                            <div class="col-xs-3 text-right">
+                                                <h6><label class="label label-success"><i class="fa fa-edit"></i> 修改</label></h6>
+                                            </div>
+                                            <div class="col-xs-12">
+                                                <textarea class="form-control" rows="8">
+                                                </textarea>
+                                            </div>
+                                        </div>
+
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="col-md-6">
+                                <div class="panel panel-default">
+                                    <div class="panel-heading"><b>省市区联动</b>(通过JSON渲染数据)</div>
+                                    <div class="panel-body">
+                                        <div class="row">
+                                            <div class="col-xs-9">
+                                                <!--由于在初始化中修改了默认值,所以这里需要修改-jsonSpace/jsonValue/jsonName的值-->
+                                                <div class="form-inline" data-toggle="cxselect" data-url="__CDN__/assets/libs/fastadmin-cxselect/js/cityData.min.json"
+                                                     data-selects="province,city,area" data-json-space="" data-json-name="n" data-json-value="">
+                                                    <select class="province form-control" name="province"></select>
+                                                    <select class="city form-control" name="city"></select>
+                                                    <select class="area form-control" name="area"></select>
+                                                </div>
+                                            </div>
+                                            <div class="col-xs-3 text-right">
+                                                <h6><label class="label label-primary"><i class="fa fa-pencil"></i> 增加</label></h6>
+                                            </div>
+                                            <div class="col-xs-12">
+                                                <textarea class="form-control" rows="8">
+                                                </textarea>
+                                            </div>
+                                        </div>
+                                        <div class="row">
+                                            <div class="col-xs-9">
+                                                <!--由于在初始化中修改了默认值,所以这里需要修改-jsonSpace/jsonValue/jsonName的值-->
+                                                <div class="form-inline" data-toggle="cxselect" data-url="__CDN__/assets/libs/fastadmin-cxselect/js/cityData.min.json"
+                                                     data-selects="province,city,area" data-json-space="" data-json-name="n" data-json-value="">
+                                                    <select class="province form-control" data-first-title="选择省">
+                                                        <option value="">请选择</option>
+                                                        <option value="浙江省" selected>浙江省</option>
+                                                    </select>
+                                                    <select class="city form-control" data-first-title="选择市">
+                                                        <option value="">请选择</option>
+                                                        <option value="杭州市" selected>杭州市</option>
+                                                    </select>
+                                                    <select class="area form-control" data-first-title="选择地区">
+                                                        <option value="">请选择</option>
+                                                        <option value="西湖区" selected>西湖区</option>
+                                                    </select>
+                                                </div>
+                                            </div>
+                                            <div class="col-xs-3 text-right">
+                                                <h6><label class="label label-success"><i class="fa fa-edit"></i> 修改</label></h6>
+                                            </div>
+                                            <div class="col-xs-12">
+                                                <textarea class="form-control" rows="8">
+                                                </textarea>
+                                            </div>
+                                        </div>
+                                    </div>
+
+                                </div>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 165 - 0
application/admin/view/example/echarts/index.html

@@ -0,0 +1,165 @@
+<style>
+    .tab-content > .chart {
+        padding: 10px;
+    }
+</style>
+<div class="row">
+    <div class="col-lg-3 col-xs-6">
+        <!-- small box -->
+        <div class="small-box bg-aqua">
+            <div class="inner">
+                <h3>150</h3>
+
+                <p>今日订单</p>
+            </div>
+            <div class="icon">
+                <i class="fa fa-shopping-cart"></i>
+            </div>
+            <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
+        </div>
+    </div>
+    <!-- ./col -->
+    <div class="col-lg-3 col-xs-6">
+        <!-- small box -->
+        <div class="small-box bg-green">
+            <div class="inner">
+                <h3>53<sup style="font-size: 20px">%</sup></h3>
+
+                <p>同比增长率</p>
+            </div>
+            <div class="icon">
+                <i class="fa fa-area-chart"></i>
+            </div>
+            <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
+        </div>
+    </div>
+    <!-- ./col -->
+    <div class="col-lg-3 col-xs-6">
+        <!-- small box -->
+        <div class="small-box bg-yellow">
+            <div class="inner">
+                <h3>44</h3>
+
+                <p>今日注册用户数</p>
+            </div>
+            <div class="icon">
+                <i class="fa fa-users"></i>
+            </div>
+            <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
+        </div>
+    </div>
+    <!-- ./col -->
+    <div class="col-lg-3 col-xs-6">
+        <!-- small box -->
+        <div class="small-box bg-red">
+            <div class="inner">
+                <h3>65</h3>
+
+                <p>唯一访客用户</p>
+            </div>
+            <div class="icon">
+                <i class="fa fa-user"></i>
+            </div>
+            <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
+        </div>
+    </div>
+    <!-- ./col -->
+</div>
+<!-- /.row -->
+<!-- Main row -->
+<div class="row" style="margin-bottom:5px;">
+    <!-- Left col -->
+    <section class="col-lg-7 connectedSortable">
+        <!-- Custom tabs (Charts with tabs)-->
+        <div class="nav-tabs-custom charts-custom">
+            <!-- Tabs within a box -->
+            <ul class="nav nav-tabs pull-right">
+                <li class="active"><a href="#line-chart" data-toggle="tab">折线图</a></li>
+                <li><a href="#area-chart" data-toggle="tab">区域图</a></li>
+                <li class="pull-left header"><i class="fa fa-inbox"></i> 销售趋势</li>
+            </ul>
+            <div class="tab-content no-padding">
+                <!-- Morris chart - Sales -->
+                <div class="chart tab-pane active" id="line-chart" style="position: relative; height: 300px;"></div>
+                <div class="chart tab-pane" id="area-chart" style="position: relative; height: 300px;"></div>
+            </div>
+        </div>
+        <div class="nav-tabs-custom charts-custom">
+            <!-- Tabs within a box -->
+            <ul class="nav nav-tabs pull-right">
+                <li class="active"><a href="#pie-chart" data-toggle="tab">饼图</a></li>
+                <li><a href="#bar-chart" data-toggle="tab">柱状图</a></li>
+                <li class="pull-left header"><i class="fa fa-inbox"></i> 访问记录</li>
+            </ul>
+            <div class="tab-content no-padding">
+                <!-- Morris chart - Sales -->
+                <div class="chart tab-pane active" id="pie-chart" style="position: relative; height: 300px;"></div>
+                <div class="chart tab-pane" id="bar-chart" style="position: relative; height: 300px;"></div>
+            </div>
+        </div>
+        <!-- /.nav-tabs-custom -->
+
+    </section>
+    <!-- /.Left col -->
+    <section class="col-lg-5 connectedSortable">
+
+        <!-- Map box -->
+        <div class="box box-solid bg-light-blue-gradient">
+            <div class="box-header">
+                <!-- tools box -->
+                <div class="pull-right box-tools">
+                </div>
+                <!-- /. tools -->
+
+                <i class="fa fa-map-marker"></i>
+
+                <h3 class="box-title">
+                    访客分布
+                </h3>
+            </div>
+            <div class="box-body">
+                <div id="simplebar-chart" style="height: 250px; width: 100%;"></div>
+            </div>
+            <!-- /.box-body-->
+            <div class="box-footer no-border">
+                <div class="row">
+                    <div class="col-xs-12 text-center">
+                        <div class="knob-label">统计最近一周访客的记录</div>
+                    </div>
+                    <!-- ./col -->
+                </div>
+                <!-- /.row -->
+            </div>
+        </div>
+        <!-- /.box -->
+
+        <!-- solid sales graph -->
+        <div class="box box-solid bg-teal-gradient">
+            <div class="box-header">
+                <i class="fa fa-th"></i>
+
+                <h3 class="box-title">订单趋势</h3>
+
+                <div class="box-tools pull-right">
+                </div>
+            </div>
+            <div class="box-body border-radius-none">
+                <div class="chart" id="smoothline-chart" style="height: 250px;"></div>
+            </div>
+            <!-- /.box-body-->
+            <div class="box-footer no-border">
+                <div class="row">
+                    <div class="col-xs-12 text-center">
+                        <div class="knob-label">统计最近一周订单的趋势</div>
+                    </div>
+                    <!-- ./col -->
+                </div>
+                <!-- /.row -->
+            </div>
+        </div>
+        <!-- /.box -->
+
+    </section>
+    <!-- right col -->
+</div>
+<!-- /.row (main row) -->

+ 27 - 0
application/admin/view/example/multitable/index.html

@@ -0,0 +1,27 @@
+<div class="panel panel-default panel-intro">
+    <div class="panel-heading">
+        <div class="panel-lead"><em>多表格(Multitable)</em>用于展示在一个页面展示多个表格数据,并且每次切换时刷新</div>
+        <ul class="nav nav-tabs">
+            <li class="active"><a href="#first" data-toggle="tab">表格1</a></li>
+            <li><a href="#second" data-toggle="tab">表格2</a></li>
+        </ul>
+    </div>
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="first">
+                <div id="toolbar1" class="toolbar">
+                    {:build_toolbar('refresh')}
+                </div>
+                <table id="table1" class="table table-striped table-bordered table-hover" width="100%">
+                </table>
+            </div>
+            <div class="tab-pane fade" id="second">
+                <div id="toolbar2" class="toolbar">
+                    {:build_toolbar('refresh')}
+                </div>
+                <table id="table2" class="table table-striped table-bordered table-hover" width="100%">
+                </table>
+            </div>
+        </div>
+    </div>
+</div>

+ 21 - 0
application/admin/view/example/relationmodel/index.html

@@ -0,0 +1,21 @@
+<div class="panel panel-default panel-intro">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <div id="toolbar" class="toolbar">
+                        {:build_toolbar('refresh,delete')}
+                    </div>
+                    <table id="table" class="table table-striped table-bordered table-hover" width="100%">
+
+                    </table>
+
+
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>

+ 44 - 0
application/admin/view/example/tablelink/index.html

@@ -0,0 +1,44 @@
+<div class="row">
+    <div class="col-xs-12 col-sm-6 col-md-5 col-lg-4">
+        <div class="panel panel-default panel-intro">
+            <div class="panel-body">
+                <div id="1" class="tab-content">
+                    <div class="tab-pane fade active in" id="one">
+                        <div class="widget-body no-padding">
+                            <div id="toolbar1" class="toolbar">
+                                {:build_toolbar('refresh')}
+                            </div>
+                            <table id="table1" class="table table-striped table-bordered table-hover" width="100%">
+
+                            </table>
+
+
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="col-xs-12 col-sm-6 col-md-7 col-lg-8">
+        <div class="panel panel-default panel-intro">
+            <div class="panel-body">
+                <div id="myTabContent2" class="tab-content">
+                    <div class="tab-pane fade active in" id="two">
+                        <div class="widget-body no-padding">
+                            <div id="toolbar2" class="toolbar">
+                                {:build_toolbar('refresh')}
+                            </div>
+                            <table id="table2" class="table table-striped table-bordered table-hover" width="100%">
+
+                            </table>
+
+
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+        </div>
+    </div>
+</div>

+ 67 - 0
application/admin/view/example/tabletemplate/index.html

@@ -0,0 +1,67 @@
+<div class="panel panel-default panel-intro">
+    {:build_heading()}
+
+    <div class="panel-body">
+        <div id="myTabContent" class="tab-content">
+            <div class="tab-pane fade active in" id="one">
+                <div class="widget-body no-padding">
+                    <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-toggle-view" href="javascript:;"><i class="fa fa-leaf"></i> 切换视图</a>
+                    </div>
+                    <table id="table" class="table table-striped table-hover" width="100%">
+
+                    </table>
+
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<style type="text/css">
+    .example {
+        height:100%;position: relative;
+    }
+    .example > span {
+        position:absolute;left:15px;top:15px;
+    }
+</style>
+
+<script id="itemtpl" type="text/html">
+    <!--
+    如果启用了templateView,默认调用的是itemtpl这个模板,可以通过设置templateFormatter来修改
+    在当前模板中可以使用三个变量(item:行数据,i:当前第几行,data:所有的行数据)
+    此模板引擎使用的是art-template的native,可参考官方文档
+    -->
+
+    <div class="col-sm-4 col-md-3">
+        <!--下面四行是为了展示随机图片和标签,可移除-->
+        <% var imagearr = ['https://cdn.fastadmin.net/uploads/addons/blog.png', 'https://cdn.fastadmin.net/uploads/addons/cms.png', 'https://cdn.fastadmin.net/uploads/addons/vote.png', 'https://cdn.fastadmin.net/uploads/addons/blog.png', 'https://cdn.fastadmin.net/uploads/addons/alisms.png']; %>
+        <% var image = imagearr[item.id % 5]; %>
+        <% var labelarr = ['primary', 'success', 'info', 'danger', 'warning']; %>
+        <% var label = labelarr[item.id % 5]; %>
+        <div class="thumbnail example">
+            <span class="btn btn-<%=label%>">ID:<%=item.id%></span>
+            <img src="<%=image%>" style="width:100%;" alt="<%=item.title%>">
+            <div class="caption">
+                <h4><%=item.title?item.title:'无'%></h4>
+                <p class="text-muted">操作者IP:<%=item.ip%></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> 
+
+                    <!--如果需要响应编辑或删除事件,可以给元素添加 btn-edit或btn-del的类和data-id这个属性值-->
+                    <a href="#" class="btn btn-primary btn-edit" data-id="<%=item.id%>"><i class="fa fa-pencil"></i> 编辑</a> 
+                    <a href="#" class="btn btn-danger btn-del" data-id="<%=item.id%>"><i class="fa fa-times"></i> 删除</a>
+                    <span class="pull-right" style="margin-top:10px;">
+                        <!--如果需要多选操作,请确保有下面的checkbox元素存在,可移除-->
+                        <input name="checkbox" data-id="<%=item.id%>" type="checkbox" />
+                    </span>
+                </p>
+            </div>
+        </div>
+    </div>
+</script>

+ 6 - 1
application/extra/addons.php

@@ -3,7 +3,12 @@
 return [
     'autoload' => false,
     'hooks' => [],
-    'route' => [],
+    'route' => [
+        '/example$' => 'example/index/index',
+        '/example/d/[:name]' => 'example/demo/index',
+        '/example/d1/[:name]' => 'example/demo/demo1',
+        '/example/d2/[:name]' => 'example/demo/demo2',
+    ],
     'priority' => [],
     'domain' => '',
 ];

+ 3 - 0
public/assets/js/backend/books/books.js

@@ -23,6 +23,8 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                 pk: 'id',
                 sortName: 'id',
                 fixedColumns: true,
+                searchFormVisible: true,
+                searchFormTemplate: 'customformtpl',
                 fixedRightNumber: 1,
                 columns: [
                     [
@@ -40,6 +42,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
                         {field: 'is_new_recommend', title: __('是否新书推荐'), searchList: {"0":__('是'),"1":__('否')}, formatter: Table.api.formatter.normal},
                         {field: 'author', title: __('Author'), operate: 'LIKE', table: table, class: 'autocontent', formatter: Table.api.formatter.content},
                         {field: 'is_awards', title: __('是否获奖'), searchList: {"0":__('是'),"1":__('否')}, formatter: Table.api.formatter.normal},
+                        {field: 'is_series', title: __('是否可以按系列购买'), searchList: {"0":__('是'),"1":__('否')}, formatter: Table.api.formatter.normal},
                         {field: 'price', title: __('Price'), operate:'BETWEEN'},
                         {field: 'entity_price', title: __('Entity_price'), operate:'BETWEEN'},
                         {field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime},

+ 342 - 0
public/assets/js/backend/example/bootstraptable.js

@@ -0,0 +1,342 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function ($, undefined, Backend, Table, Form, Template) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'example/bootstraptable/index',
+                    add_url: '',
+                    edit_url: 'example/bootstraptable/edit',
+                    del_url: 'example/bootstraptable/del',
+                    multi_url: '',
+                }
+            });
+
+            var table = $("#table");
+
+            //在普通搜索提交搜索前
+            table.on('common-search.bs.table', function (event, table, query) {
+                //这里可以获取到普通搜索表单中字段的查询条件
+                console.log(query);
+            });
+
+            //在普通搜索渲染后
+            table.on('post-common-search.bs.table', function (event, table) {
+                var form = $("form", table.$commonsearch);
+                $("input[name='title']", form).addClass("selectpage").data("source", "auth/adminlog/selectpage").data("primaryKey", "title").data("field", "title").data("orderBy", "id desc");
+                $("input[name='username']", form).addClass("selectpage").data("source", "auth/admin/index").data("primaryKey", "username").data("field", "username").data("orderBy", "id desc");
+                Form.events.cxselect(form);
+                Form.events.selectpage(form);
+            });
+
+            //在表格内容渲染完成后回调的事件
+            table.on('post-body.bs.table', function (e, settings, json, xhr) {
+                console.log(e, settings, json, xhr);
+            });
+
+            //当表格数据加载完成时
+            table.on('load-success.bs.table', function (e, data) {
+                //这里可以获取从服务端获取的JSON数据
+                console.log(data);
+                //这里我们手动设置底部的值
+                $("#money").text(data.extend.money);
+                $("#price").text(data.extend.price);
+            });
+
+            // 初始化表格
+            // 这里使用的是Bootstrap-table插件渲染表格
+            // 相关文档:https://doc.fastadmin.net/doc/table.html
+            table.bootstrapTable({
+                //表格参数可以参考:https://doc.fastadmin.net/doc/190.html
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                columns: [
+                    [
+                        //更多列参数可以参考:https://doc.fastadmin.net/doc/191.html
+                        //该列为复选框字段,如果后台的返回state值将会默认选中
+                        {field: 'state', checkbox: true,},
+                        //sortable为是否排序,operate为搜索时的操作符,visible表示是否可见
+                        {field: 'id', title: 'ID', sortable: true, operate: false},
+                        //直接响应搜索
+                        {field: 'username', title: __('管理员'), formatter: Table.api.formatter.search},
+                        //模糊搜索
+                        {field: 'title', title: __('Title'), operate: 'LIKE %...%', placeholder: '模糊搜索,*表示任意字符', width: '280px'},
+                        //通过Ajax渲染searchList,也可以使用JSON数据
+                        {
+                            field: 'url',
+                            title: __('Url'),
+                            align: 'left',
+                            searchList: $.getJSON('example/bootstraptable/searchlist?search=a&field=row[user_id]'),
+                            formatter: Controller.api.formatter.url,
+                            addClass: "selectpicker"
+                        },
+                        //点击IP时同时执行搜索此IP
+                        {
+                            field: 'ip',
+                            title: __('IP'),
+                            events: Controller.api.events.ip,
+                            formatter: Controller.api.formatter.ip
+                        },
+                        //自定义栏位,custom是不存在的字段
+                        {field: 'custom', title: __('切换'), operate: false, formatter: Controller.api.formatter.custom},
+                        //browser是一个不存在的字段
+                        //通过formatter来渲染数据,同时为它添加上事件
+                        {
+                            field: 'browser',
+                            title: __('Browser'),
+                            operate: false,
+                            events: Controller.api.events.browser,
+                            formatter: Controller.api.formatter.browser
+                        },
+                        {
+                            field: 'admin_id', title: __('联动搜索'), searchList: function (column) {
+                                return Template('categorytpl', {});
+                            }, formatter: function (value, row, index) {
+                                return '无';
+                            }, visible: false
+                        },
+                        //启用时间段搜索
+                        {
+                            field: 'createtime',
+                            title: __('Update time'),
+                            sortable: true,
+                            formatter: Table.api.formatter.datetime,
+                            operate: 'RANGE',
+                            addclass: 'datetimerange'
+                        },
+                        //操作栏,默认有编辑、删除或排序按钮,可自定义配置buttons来扩展按钮
+                        {
+                            field: 'operate',
+                            width: "150px",
+                            title: __('Operate'),
+                            table: table,
+                            events: Table.api.events.operate,
+                            buttons: [
+                                {
+                                    name: 'click',
+                                    title: __('点击执行事件'),
+                                    classname: 'btn btn-xs btn-info btn-click',
+                                    icon: 'fa fa-leaf',
+                                    // dropdown: '更多',//如果包含dropdown,将会以下拉列表的形式展示
+                                    click: function (data) {
+                                        Layer.alert("点击按钮执行的事件");
+                                    }
+                                },
+                                {
+                                    name: 'detail',
+                                    title: __('弹出窗口打开'),
+                                    classname: 'btn btn-xs btn-primary btn-dialog',
+                                    icon: 'fa fa-list',
+                                    url: 'example/bootstraptable/detail',
+                                    callback: function (data) {
+                                        Layer.alert("接收到回传数据:" + JSON.stringify(data), {title: "回传数据"});
+                                    }
+                                },
+                                {
+                                    name: 'ajax',
+                                    title: __('发送Ajax'),
+                                    classname: 'btn btn-xs btn-success btn-magic btn-ajax',
+                                    icon: 'fa fa-magic',
+                                    confirm: '确认发送Ajax请求?',
+                                    url: 'example/bootstraptable/detail',
+                                    success: function (data, ret) {
+                                        Layer.alert(ret.msg + ",返回数据:" + JSON.stringify(data));
+                                        //如果需要阻止成功提示,则必须使用return false;
+                                        //return false;
+                                    },
+                                    error: function (data, ret) {
+                                        console.log(data, ret);
+                                        Layer.alert(ret.msg);
+                                        return false;
+                                    }
+                                },
+                                {
+                                    name: 'addtabs',
+                                    title: __('新选项卡中打开'),
+                                    classname: 'btn btn-xs btn-warning btn-addtabs',
+                                    icon: 'fa fa-folder-o',
+                                    url: 'example/bootstraptable/detail'
+                                }
+                            ],
+                            formatter: Table.api.formatter.operate
+                        },
+                    ],
+                ],
+                //更多配置参数可参考:https://doc.fastadmin.net/doc/190.html
+                //亦可以参考require-table.js中defaults的配置
+                //快捷搜索,这里可在控制器定义快捷搜索的字段
+                search: true,
+                //启用普通表单搜索
+                commonSearch: true,
+                //显示导出按钮
+                showExport: true,
+                //启用跨页选择
+                maintainSelected: true,
+                //启用固定列
+                fixedColumns: true,
+                //固定左侧列数
+                fixedNumber: 3,
+                //固定右侧列数
+                fixedRightNumber: 1,
+                //导出类型
+                exportDataType: "all", //共有basic, all, selected三种值 basic当前页 all全部 selected仅选中
+                //导出下拉列表选项
+                exportTypes: ['json', 'xml', 'csv', 'txt', 'doc', 'excel'],
+                //可以控制是否默认显示搜索单表,false则隐藏,默认为false
+                searchFormVisible: true,
+                queryParams: function (params) {
+                    //这里可以追加搜索条件
+                    var filter = JSON.parse(params.filter);
+                    var op = JSON.parse(params.op);
+                    //这里可以动态赋值,比如从URL中获取admin_id的值,filter.admin_id=Fast.api.query('admin_id');
+                    filter.admin_id = 1;
+                    op.admin_id = "=";
+                    params.filter = JSON.stringify(filter);
+                    params.op = JSON.stringify(op);
+                    return params;
+                },
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+
+            // 监听下拉列表改变的事件
+            $(document).on('change', 'select[name=admin]', function () {
+                $("input[name='admin_id']").val($(this).val());
+            });
+
+            //自定义Tab筛选条件
+            $('.panel-heading .nav-custom-condition a[data-toggle="tab"]', table.closest(".panel-intro")).on('shown.bs.tab', function (e) {
+                var value = $(this).data("value");
+                var options = table.bootstrapTable('getOptions');
+                var queryParams = options.queryParams;
+                options.pageNumber = 1;
+                options.queryParams = function (params) {
+                    //这一行必须要存在,否则在点击下一页时会丢失搜索栏数据
+                    params = queryParams(params);
+
+                    //如果希望追加搜索条件,可使用
+                    var filter = params.filter ? JSON.parse(params.filter) : {};
+                    var op = params.op ? JSON.parse(params.op) : {};
+                    if (value) {
+                        //这里可以自定义多个筛选条件
+                        filter.admin_id = value;
+                        op.admin_id = '=';
+                    } else {
+                        //选全部时要移除相应的条件
+                        delete filter.admin_id;
+                        delete op.admin_id;
+                    }
+
+                    params.filter = JSON.stringify(filter);
+                    params.op = JSON.stringify(op);
+
+                    //如果希望忽略搜索栏搜索条件,可使用
+                    //params.filter = JSON.stringify(value?{admin_id: value}:{});
+                    //params.op = JSON.stringify(value?{admin_id: '='}:{});
+                    return params;
+                };
+
+                table.trigger("uncheckbox");
+                table.bootstrapTable('refresh', {pageNumber: 1});
+                return false;
+            });
+
+            // 指定搜索条件
+            $(document).on("click", ".btn-singlesearch", function () {
+                var options = table.bootstrapTable('getOptions');
+                var queryParams = options.queryParams;
+                options.pageNumber = 1;
+                options.queryParams = function (params) {
+                    //这一行必须要存在,否则在点击下一页时会丢失搜索栏数据
+                    params = queryParams(params);
+
+                    //如果希望追加搜索条件,可使用
+                    var filter = params.filter ? JSON.parse(params.filter) : {};
+                    var op = params.op ? JSON.parse(params.op) : {};
+                    filter.url = 'login';
+                    op.url = 'like';
+
+                    params.filter = JSON.stringify(filter);
+                    params.op = JSON.stringify(op);
+
+                    //如果希望忽略搜索栏搜索条件,可使用
+                    //params.filter = JSON.stringify({url: 'login'});
+                    //params.op = JSON.stringify({url: 'like'});
+                    return params;
+                };
+                table.bootstrapTable('refresh', {});
+                Toastr.info("当前执行的是自定义搜索,搜索URL中包含login的数据");
+                return false;
+            });
+
+            // 获取选中项
+            $(document).on("click", ".btn-selected", function () {
+                Layer.alert(JSON.stringify(Table.api.selecteddata(table)));
+            });
+
+            // 启动和暂停按钮
+            $(document).on("click", ".btn-start,.btn-pause", function () {
+                //在table外不可以使用添加.btn-change的方法
+                //只能自己调用Table.api.multi实现
+                //如果操作全部则ids可以置为空
+                var ids = Table.api.selectedids(table);
+                Table.api.multi("changestatus", ids.join(","), table, this);
+            });
+
+        },
+        add: function () {
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        detail: function () {
+            $(document).on('click', '.btn-callback', function () {
+                Fast.api.close($("input[name=callback]").val());
+            });
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            },
+            formatter: {//渲染的方法
+                url: function (value, row, index) {
+                    return '<div class="input-group input-group-sm" style="width:250px;"><input type="text" class="form-control input-sm" value="' + value + '"><span class="input-group-btn input-group-sm"><a href="' + value + '" target="_blank" class="btn btn-default btn-sm"><i class="fa fa-link"></i></a></span></div>';
+                },
+                ip: function (value, row, index) {
+                    return '<a class="btn btn-xs btn-ip bg-success"><i class="fa fa-map-marker"></i> ' + value + '</a>';
+                },
+                browser: function (value, row, index) {
+                    //这里我们直接使用row的数据
+                    return '<a class="btn btn-xs btn-browser">' + row.useragent.split(" ")[0] + '</a>';
+                },
+                custom: function (value, row, index) {
+                    //添加上btn-change可以自定义请求的URL进行数据处理
+                    return '<a class="btn-change text-success" data-url="example/bootstraptable/change" data-confirm="确认切换状态?" data-id="' + row.id + '"><i class="fa ' + (row.title == '' ? 'fa-toggle-on fa-flip-horizontal text-gray' : 'fa-toggle-on') + ' fa-2x"></i></a>';
+                },
+            },
+            events: {//绑定事件的方法
+                ip: {
+                    //格式为:方法名+空格+DOM元素
+                    'click .btn-ip': function (e, value, row, index) {
+                        e.stopPropagation();
+                        var container = $("#table").data("bootstrap.table").$container;
+                        var options = $("#table").bootstrapTable('getOptions');
+                        //这里我们手动将数据填充到表单然后提交
+                        $("form.form-commonsearch [name='ip']", container).val(value);
+                        $("form.form-commonsearch", container).trigger('submit');
+                        Toastr.info("执行了自定义搜索操作");
+                    }
+                },
+                browser: {
+                    'click .btn-browser': function (e, value, row, index) {
+                        e.stopPropagation();
+                        Layer.alert("该行数据为: <code>" + JSON.stringify(row) + "</code>");
+                    }
+                },
+            }
+        }
+    };
+    return Controller;
+});

+ 52 - 0
public/assets/js/backend/example/colorbadge.js

@@ -0,0 +1,52 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'example/colorbadge/index',
+                    add_url: '',
+                    edit_url: '',
+                    del_url: 'example/colorbadge/del',
+                    multi_url: '',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                columns: [
+                    [
+                        {field: 'state', checkbox: true, },
+                        {field: 'id', title: 'ID'},
+                        {field: 'title', title: __('Title')},
+                        {field: 'ip', title: __('IP')},
+                        {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
+                    ]
+                ],
+                onLoadSuccess: function (data) {
+                    // 在表格第次加载成功后,刷新左侧菜单栏彩色小角标,支持一次渲染多个
+                    // 如果需要在进入后台即显示左侧的彩色小角标,请使用服务端渲染方式,详情修改application/admin/controller/Index.php
+                    Backend.api.sidebar({
+                        'example/colorbadge': data.total
+                    });
+                    Toastr.info("左侧角标已经刷新成功");
+                }
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+            Form.api.bindevent($("form[role=form]"));
+        },
+        edit: function () {
+            Form.api.bindevent($("form[role=form]"));
+        }
+    };
+    return Controller;
+});

+ 60 - 0
public/assets/js/backend/example/controllerjump.js

@@ -0,0 +1,60 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'example/controllerjump/index',
+                    add_url: '',
+                    edit_url: '',
+                    del_url: 'example/controllerjump/del',
+                    multi_url: '',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                columns: [
+                    [
+                        {field: 'state', checkbox: true, },
+                        {field: 'id', title: 'ID'},
+                        {field: 'admin_id', title: __('Admin_id')},
+                        {field: 'title', title: __('Title')},
+                        {field: 'ip', title: __('IP'),formatter: Controller.api.formatter.ip},
+                        {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
+                    ]
+                ]
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+            Form.api.bindevent($("form[role=form]"));
+        },
+        edit: function () {
+            Form.api.bindevent($("form[role=form]"));
+        },
+        api: {
+            formatter: {
+                ip: function (value, row, index) {
+                    //这里手动构造URL
+                    url = "example/bootstraptable?" + this.field + "=" + value;
+
+                    //方式一,直接返回class带有addtabsit的链接,这可以方便自定义显示内容
+                    //return '<a href="' + url + '" class="label label-success addtabsit" title="' + __("Search %s", value) + '">' + __('Search %s', value) + '</a>';
+
+                    //方式二,直接调用Table.api.formatter.addtabs
+                    this.url = url;
+                    return Table.api.formatter.addtabs.call(this, value, row, index);
+                }
+            }
+        }
+    };
+    return Controller;
+});

+ 33 - 0
public/assets/js/backend/example/customform.js

@@ -0,0 +1,33 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            Template.helper("Fast", Fast);
+
+            //因为日期选择框不会触发change事件,导致无法刷新textarea,所以加上判断
+            $(document).on("dp.change", "#second-form .datetimepicker", function () {
+                $(this).parent().prev().find("input").trigger("change");
+            });
+            $(document).on("fa.event.appendfieldlist", "#first-table .btn-append", function (e, obj) {
+
+            });
+            $(document).on("fa.event.appendfieldlist", "#second-table .btn-append", function (e, obj) {
+                //绑定动态下拉组件
+                Form.events.selectpage(obj);
+                //绑定日期组件
+                Form.events.datetimepicker(obj);
+                //绑定上传组件
+                Form.events.faupload(obj);
+
+                //上传成功回调事件,变更按钮的背景
+                $(".upload-image", obj).data("upload-success", function (data) {
+                    $(this).css("background-image", "url('" + Fast.api.cdnurl(data.url) + "')");
+                })
+            });
+            Form.api.bindevent($("form[role=form]"), function (data, ret) {
+                Layer.alert(data.data);
+            });
+        },
+    };
+    return Controller;
+});

+ 63 - 0
public/assets/js/backend/example/customsearch.js

@@ -0,0 +1,63 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+    var Controller = {
+        index: function () {
+            //
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'example/customsearch/index',
+                    add_url: 'example/customsearch/add',
+                    edit_url: '',
+                    del_url: 'example/customsearch/del',
+                    multi_url: 'example/customsearch/multi',
+                    table: '',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                pk: 'id',
+                sortName: 'id',
+                searchFormVisible: true,
+                searchFormTemplate: 'customformtpl',
+                columns: [
+                    [
+                        {checkbox: true},
+                        {field: 'id', title: 'ID', operate: false},
+                        {field: 'admin_id', title: __('Admin_id'), visible: false, operate: false},
+                        {field: 'username', title: __('Username'), formatter: Table.api.formatter.search},
+                        {field: 'title', title: __('Title')},
+                        {field: 'url', title: __('Url'), align: 'left'},
+                        {field: 'ip', title: __('IP')},
+                        {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
+                        {
+                            field: 'operate',
+                            title: __('Operate'),
+                            table: table,
+                            events: Table.api.events.operate,
+                            formatter: Table.api.formatter.operate
+                        }
+                    ]
+                ]
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            }
+        }
+    };
+    return Controller;
+});

+ 14 - 0
public/assets/js/backend/example/cxselect.js

@@ -0,0 +1,14 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            $("#cxselect-example .col-xs-12").each(function () {
+                $("textarea", this).val($(this).prev().prev().html().replace(/[ ]{2}/g, ''));
+            });
+            
+            //这里需要手动为Form绑定上元素事件
+            Form.api.bindevent($("form#cxselectform"));
+        }
+    };
+    return Controller;
+});

+ 206 - 0
public/assets/js/backend/example/echarts.js

@@ -0,0 +1,206 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template', 'echarts', 'echarts-theme'], function ($, undefined, Backend, Table, Form, Template, Echarts) {
+
+    var Controller = {
+        index: function () {
+            //这句话在多选项卡统计表时必须存在,否则会导致影响的图表宽度不正确
+            $(document).on("click", ".charts-custom a[data-toggle=\"tab\"]", function () {
+                var that = this;
+                setTimeout(function () {
+                    var id = $(that).attr("href");
+                    var chart = Echarts.getInstanceByDom($(id)[0]);
+                    chart.resize();
+                }, 0);
+            });
+
+            // 基于准备好的dom,初始化echarts实例
+            var lineChart = Echarts.init(document.getElementById('line-chart'), 'walden');
+
+            // 指定图表的配置项和数据
+            var option = {
+                xAxis: {
+                    type: 'category',
+                    data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
+                },
+                yAxis: {
+                    type: 'value'
+                },
+                series: [{
+                    data: [49, 92, 61, 134, 90, 130, 120],
+                    type: 'line'
+                }]
+            };
+
+            // 使用刚指定的配置项和数据显示图表。
+            lineChart.setOption(option);
+            // 基于准备好的dom,初始化echarts实例
+            var areaChart = Echarts.init(document.getElementById('area-chart'), 'walden');
+
+            // 指定图表的配置项和数据
+            var option = {
+                xAxis: {
+                    type: 'category',
+                    boundaryGap: false,
+                    data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
+                },
+                yAxis: {
+                    type: 'value'
+                },
+                series: [{
+                    data: [820, 932, 901, 934, 1290, 1330, 1320],
+                    type: 'line',
+                    areaStyle: {}
+                }]
+            };
+
+            // 使用刚指定的配置项和数据显示图表。
+            areaChart.setOption(option);
+
+            var pieChart = Echarts.init(document.getElementById('pie-chart'), 'walden');
+            var option = {
+                tooltip: {
+                    trigger: 'item',
+                    formatter: '{a} <br/>{b}: {c} ({d}%)'
+                },
+                legend: {
+                    orient: 'vertical',
+                    left: 10,
+                    data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']
+                },
+                series: [
+                    {
+                        name: '访问来源',
+                        type: 'pie',
+                        radius: ['50%', '70%'],
+                        avoidLabelOverlap: false,
+                        label: {
+                            normal: {
+                                show: false,
+                                position: 'center'
+                            },
+                            emphasis: {
+                                show: true,
+                                textStyle: {
+                                    fontSize: '30',
+                                    fontWeight: 'bold'
+                                }
+                            }
+                        },
+                        labelLine: {
+                            normal: {
+                                show: false
+                            }
+                        },
+                        data: [
+                            {value: 335, name: '直接访问'},
+                            {value: 310, name: '邮件营销'},
+                            {value: 234, name: '联盟广告'},
+                            {value: 135, name: '视频广告'},
+                            {value: 1548, name: '搜索引擎'}
+                        ]
+                    }
+                ]
+            };
+            // 使用刚指定的配置项和数据显示图表。
+            pieChart.setOption(option);
+
+            var barChart = Echarts.init(document.getElementById('bar-chart'), 'walden');
+            option = {
+                legend: {},
+                tooltip: {},
+                dataset: {
+                    source: [
+                        ['产品销售', '2015', '2016', '2017'],
+                        ['风扇', 43.3, 85.8, 93.7],
+                        ['电视机', 83.1, 73.4, 55.1],
+                        ['空调', 86.4, 65.2, 82.5],
+                        ['冰箱', 72.4, 53.9, 39.1]
+                    ]
+                },
+                xAxis: {type: 'category'},
+                yAxis: {},
+                // Declare several bar series, each will be mapped
+                // to a column of dataset.source by default.
+                series: [
+                    {type: 'bar'},
+                    {type: 'bar'},
+                    {type: 'bar'}
+                ]
+            };
+            // 使用刚指定的配置项和数据显示图表。
+            barChart.setOption(option);
+
+
+            var barChart = Echarts.init(document.getElementById('simplebar-chart'));
+            option = {
+                xAxis: {
+                    type: 'category',
+                    axisLine: {
+                        lineStyle: {
+                            color: "#fff"
+                        }
+                    },
+                    data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
+                },
+                yAxis: {
+                    type: 'value',
+                    axisLine: {
+                        lineStyle: {
+                            color: "#fff"
+                        }
+                    }
+                },
+                series: [{
+                    data: [120, 200, 150, 80, 70, 110, 130],
+                    type: 'bar',
+                    itemStyle: {
+                        color: "#fff",
+                        opacity: 0.6
+                    }
+                }]
+            };
+            // 使用刚指定的配置项和数据显示图表。
+            barChart.setOption(option);
+
+            var barChart = Echarts.init(document.getElementById('smoothline-chart'));
+            option = {
+                textStyle: {
+                    color: "#fff"
+                },
+                color: ['#fff'],
+                xAxis: {
+                    type: 'category',
+                    boundaryGap: false,
+                    data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
+                    axisLine: {
+                        lineStyle: {
+                            color: "#fff"
+                        }
+                    }
+                },
+                yAxis: {
+                    type: 'value',
+                    splitLine: {
+                        show: false
+                    },
+                    axisLine: {
+                        lineStyle: {
+                            color: "#fff"
+                        }
+                    }
+                },
+                series: [{
+                    data: [820, 932, 901, 934, 1290, 1330, 1320],
+                    type: 'line',
+                    smooth: true,
+                    areaStyle: {
+                        opacity: 0.4
+                    }
+
+                }]
+            };
+            // 使用刚指定的配置项和数据显示图表。
+            barChart.setOption(option);
+        }
+    };
+    return Controller;
+});

+ 93 - 0
public/assets/js/backend/example/multitable.js

@@ -0,0 +1,93 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init();
+            
+            //绑定事件
+            $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
+                var panel = $($(this).attr("href"));
+                if (panel.length > 0) {
+                    Controller.table[panel.attr("id")].call(this);
+                    $(this).on('click', function (e) {
+                        $($(this).attr("href")).find(".btn-refresh").trigger("click");
+                    });
+                }
+                //移除绑定的事件
+                $(this).unbind('shown.bs.tab');
+            });
+            
+            //必须默认触发shown.bs.tab事件
+            $('ul.nav-tabs li.active a[data-toggle="tab"]').trigger("shown.bs.tab");
+        },
+        table: {
+            first: function () {
+                // 表格1
+                var table1 = $("#table1");
+                table1.bootstrapTable({
+                    url: 'example/multitable/table1',
+                    toolbar: '#toolbar1',
+                    sortName: 'id',
+                    search: false,
+                    columns: [
+                        [
+                            {field: 'state', checkbox: true, },
+                            {field: 'id', title: 'ID'},
+                            {field: 'filename', title: __('Name')},
+                            {field: 'imagewidth', title: __('Imagewidth')},
+                            {field: 'imageheight', title: __('Imageheight')},
+                            {field: 'mimetype', title: __('Mimetype')},
+                            {field: 'operate', title: __('Operate'), table: table1, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
+                        ]
+                    ]
+                });
+
+                // 为表格1绑定事件
+                Table.api.bindevent(table1);
+            },
+            second: function () {
+                // 表格2
+                var table2 = $("#table2");
+                table2.bootstrapTable({
+                    url: 'example/multitable/table2',
+                    extend: {
+                        index_url: '',
+                        add_url: '',
+                        edit_url: '',
+                        del_url: '',
+                        multi_url: '',
+                        table: '',
+                    },
+                    toolbar: '#toolbar2',
+                    sortName: 'id',
+                    search: false,
+                    columns: [
+                        [
+                            {field: 'id', title: 'ID'},
+                            {field: 'title', title: __('Title')},
+                            {field: 'url', title: __('Url'), align: 'left', formatter: Table.api.formatter.url},
+                            {field: 'ip', title: __('ip')},
+                            {field: 'createtime', title: __('Createtime'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
+                        ]
+                    ]
+                });
+
+                // 为表格2绑定事件
+                Table.api.bindevent(table2);
+            }
+        },
+        add: function () {
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            },
+        }
+    };
+    return Controller;
+});

+ 48 - 0
public/assets/js/backend/example/relationmodel.js

@@ -0,0 +1,48 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'example/relationmodel/index',
+                    add_url: '',
+                    edit_url: '',
+                    del_url: 'example/relationmodel/del',
+                    multi_url: '',
+                }
+            });
+
+            var table = $("#table");
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                columns: [
+                    [
+                        {field: 'state', checkbox: true, },
+                        {field: 'id', title: 'ID', operate: '='},
+                        {field: 'title', title: __('Title'), operate: 'LIKE %...%', placeholder: '关键字,模糊搜索'},
+                        {field: 'admin.avatar', title: __('Avatar'), operate: false, formatter: Table.api.formatter.image},
+                        {field: 'admin.username', title: __('Username'), operate: 'FIND_IN_SET'},
+                        {field: 'admin.nickname', title: __('Nickname'), operate: 'LIKE %...%', placeholder: '关键字,模糊搜索'},
+                        {field: 'ip', title: __('IP'), operate: '='},
+                        {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
+                        {field: 'admin.createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
+                    ]
+                ],
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+        },
+        add: function () {
+            Form.api.bindevent($("form[role=form]"));
+        },
+        edit: function () {
+            Form.api.bindevent($("form[role=form]"));
+        },
+    };
+    return Controller;
+});

+ 81 - 0
public/assets/js/backend/example/tablelink.js

@@ -0,0 +1,81 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init();
+            this.table.first();
+            this.table.second();
+        },
+        table: {
+            first: function () {
+                // 表格1
+                var table1 = $("#table1");
+                table1.bootstrapTable({
+                    url: 'example/tablelink/table1',
+                    toolbar: '#toolbar1',
+                    sortName: 'id',
+                    search: false,
+                    columns: [
+                        [
+                            // {field: 'state', checkbox: true,},
+                            {field: 'id', title: 'ID'},
+                            {field: 'username', title: __('Nickname')},
+                            {
+                                field: 'operate', title: __('Operate'), table: table1, events: Table.api.events.operate, buttons: [
+                                    {
+                                        name: 'log',
+                                        title: '日志列表',
+                                        text: '日志列表',
+                                        icon: 'fa fa-list',
+                                        classname: 'btn btn-primary btn-xs btn-click',
+                                        click: function (e, data) {
+                                            $("#myTabContent2 .form-commonsearch input[name='username']").val(data.username);
+                                            $("#myTabContent2 .btn-refresh").trigger("click");
+                                        }
+                                    }
+                                ], formatter: Table.api.formatter.operate
+                            }
+                        ]
+                    ]
+                });
+
+                // 为表格1绑定事件
+                Table.api.bindevent(table1);
+            },
+            second: function () {
+                // 表格2
+                var table2 = $("#table2");
+                table2.bootstrapTable({
+                    url: 'example/tablelink/table2',
+                    extend: {
+                        index_url: '',
+                        add_url: '',
+                        edit_url: '',
+                        del_url: '',
+                        multi_url: '',
+                        table: '',
+                    },
+                    toolbar: '#toolbar2',
+                    sortName: 'id',
+                    search: false,
+                    columns: [
+                        [
+                            {field: 'state', checkbox: true,},
+                            {field: 'id', title: 'ID'},
+                            {field: 'username', title: __('Nickname')},
+                            {field: 'title', title: __('Title')},
+                            {field: 'url', title: __('Url'), align: 'left', formatter: Table.api.formatter.url},
+                            {field: 'ip', title: __('ip')},
+                            {field: 'createtime', title: __('Createtime'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
+                        ]
+                    ]
+                });
+
+                // 为表格2绑定事件
+                Table.api.bindevent(table2);
+            }
+        },
+    };
+    return Controller;
+});

+ 115 - 0
public/assets/js/backend/example/tabletemplate.js

@@ -0,0 +1,115 @@
+define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function ($, undefined, Backend, Table, Form, Template) {
+
+    var Controller = {
+        index: function () {
+            // 初始化表格参数配置
+            Table.api.init({
+                extend: {
+                    index_url: 'example/tabletemplate/index',
+                    add_url: '',
+                    edit_url: '',
+                    del_url: 'example/tabletemplate/del',
+                    multi_url: '',
+                }
+            });
+
+            var table = $("#table");
+
+            Template.helper("Moment", Moment);
+
+            // 初始化表格
+            table.bootstrapTable({
+                url: $.fn.bootstrapTable.defaults.extend.index_url,
+                templateView: true,
+                columns: [
+                    [
+                        {field: 'state', checkbox: true, },
+                        {field: 'id', title: 'ID', operate: false},
+                        //直接响应搜索
+                        {field: 'username', title: __('Username'), formatter: Table.api.formatter.search},
+                        //模糊搜索
+                        {field: 'title', title: __('Title'), operate: 'LIKE %...%', placeholder: '模糊搜索,*表示任意字符', style: 'width:200px'},
+                        //通过Ajax渲染searchList
+                        {field: 'url', title: __('Url'), align: 'left', 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},
+                        //browser是一个不存在的字段
+                        //通过formatter来渲染数据,同时为它添加上事件
+                        {field: 'browser', title: __('Browser'), operate: false, events: Controller.api.events.browser, formatter: Controller.api.formatter.browser},
+                        //启用时间段搜索
+                        {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
+                        {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
+                    ],
+                ],
+                //禁用默认搜索
+                search: false,
+                //启用普通表单搜索
+                commonSearch: false,
+                //可以控制是否默认显示搜索单表,false则隐藏,默认为false
+                searchFormVisible: false,
+                //分页大小
+                pageSize: 12
+            });
+
+            // 为表格绑定事件
+            Table.api.bindevent(table);
+
+            //指定搜索条件
+            $(document).on("click", ".btn-toggle-view", function () {
+                var options = table.bootstrapTable('getOptions');
+                table.bootstrapTable('refreshOptions', {templateView: !options.templateView});
+            });
+
+            //点击详情
+            $(document).on("click", ".btn-detail[data-id]", function () {
+                Backend.api.open('example/bootstraptable/detail/ids/' + $(this).data('id'), __('Detail'));
+            });
+
+            //获取选中项
+            $(document).on("click", ".btn-selected", function () {
+                //在templateView的模式下不能调用table.bootstrapTable('getSelections')来获取选中的ID,只能通过下面的Table.api.selectedids来获取
+                Layer.alert(JSON.stringify(Table.api.selectedids(table)));
+            });
+        },
+        add: function () {
+            Controller.api.bindevent();
+        },
+        edit: function () {
+            Controller.api.bindevent();
+        },
+        api: {
+            bindevent: function () {
+                Form.api.bindevent($("form[role=form]"));
+            },
+            formatter: {
+                url: function (value, row, index) {
+                    return '<div class="input-group input-group-sm" style="width:250px;"><input type="text" class="form-control input-sm" value="' + value + '"><span class="input-group-btn input-group-sm"><a href="' + value + '" target="_blank" class="btn btn-default btn-sm"><i class="fa fa-link"></i></a></span></div>';
+                },
+                ip: function (value, row, index) {
+                    return '<a class="btn btn-xs btn-ip bg-success"><i class="fa fa-map-marker"></i> ' + value + '</a>';
+                },
+                browser: function (value, row, index) {
+                    //这里我们直接使用row的数据
+                    return '<a class="btn btn-xs btn-browser">' + row.useragent.split(" ")[0] + '</a>';
+                }
+            },
+            events: {
+                ip: {
+                    'click .btn-ip': function (e, value, row, index) {
+                        var options = $("#table").bootstrapTable('getOptions');
+                        //这里我们手动将数据填充到表单然后提交
+                        $("#commonSearchContent_" + options.idTable + " form [name='ip']").val(value);
+                        $("#commonSearchContent_" + options.idTable + " form").trigger('submit');
+                        Toastr.info("执行了自定义搜索操作");
+                    }
+                },
+                browser: {
+                    'click .btn-browser': function (e, value, row, index) {
+                        Layer.alert("该行数据为: <code>" + JSON.stringify(row) + "</code>");
+                    }
+                }
+            }
+        }
+    };
+    return Controller;
+});