作者 郭文星

123

正在显示 59 个修改的文件 包含 3847 行增加93 行删除
  1 +{"files":["application\\admin\\controller\\example\\Bootstraptable.php","application\\admin\\controller\\example\\Colorbadge.php","application\\admin\\controller\\example\\Controllerjump.php","application\\admin\\controller\\example\\Customform.php","application\\admin\\controller\\example\\Customsearch.php","application\\admin\\controller\\example\\Cxselect.php","application\\admin\\controller\\example\\Echarts.php","application\\admin\\controller\\example\\Multitable.php","application\\admin\\controller\\example\\Relationmodel.php","application\\admin\\controller\\example\\Tablelink.php","application\\admin\\controller\\example\\Tabletemplate.php","application\\admin\\model\\Area.php","application\\admin\\view\\example\\bootstraptable\\detail.html","application\\admin\\view\\example\\bootstraptable\\edit.html","application\\admin\\view\\example\\bootstraptable\\index.html","application\\admin\\view\\example\\colorbadge\\index.html","application\\admin\\view\\example\\controllerjump\\index.html","application\\admin\\view\\example\\customform\\index.html","application\\admin\\view\\example\\customsearch\\index.html","application\\admin\\view\\example\\cxselect\\index.html","application\\admin\\view\\example\\echarts\\index.html","application\\admin\\view\\example\\multitable\\index.html","application\\admin\\view\\example\\relationmodel\\index.html","application\\admin\\view\\example\\tablelink\\index.html","application\\admin\\view\\example\\tabletemplate\\index.html","public\\assets\\js\\backend\\example\\bootstraptable.js","public\\assets\\js\\backend\\example\\colorbadge.js","public\\assets\\js\\backend\\example\\controllerjump.js","public\\assets\\js\\backend\\example\\customform.js","public\\assets\\js\\backend\\example\\customsearch.js","public\\assets\\js\\backend\\example\\cxselect.js","public\\assets\\js\\backend\\example\\echarts.js","public\\assets\\js\\backend\\example\\multitable.js","public\\assets\\js\\backend\\example\\relationmodel.js","public\\assets\\js\\backend\\example\\tablelink.js","public\\assets\\js\\backend\\example\\tabletemplate.js","public\\assets\\addons\\example\\css\\common.css","public\\assets\\addons\\example\\img\\200x200.png","public\\assets\\addons\\example\\img\\plus.png","public\\assets\\addons\\example\\js\\async.js"],"license":"regular","licenseto":"15629","licensekey":"bhPvgCDzwu3MR19F ksNc2PNUvdOFCKHwzx08FQ==","domains":["netcar123.com"],"licensecodes":[],"validations":["04fc4fb96e772ed591aa668d537fdaad"],"menus":["example","example\/bootstraptable","example\/bootstraptable\/index","example\/bootstraptable\/detail","example\/bootstraptable\/change","example\/bootstraptable\/del","example\/bootstraptable\/multi","example\/customsearch","example\/customsearch\/index","example\/customsearch\/del","example\/customsearch\/multi","example\/customform","example\/customform\/index","example\/tablelink","example\/tablelink\/index","example\/colorbadge","example\/colorbadge\/index","example\/colorbadge\/del","example\/colorbadge\/multi","example\/controllerjump","example\/controllerjump\/index","example\/controllerjump\/del","example\/controllerjump\/multi","example\/cxselect","example\/cxselect\/index","example\/cxselect\/del","example\/cxselect\/multi","example\/multitable","example\/multitable\/index","example\/multitable\/del","example\/multitable\/multi","example\/relationmodel","example\/relationmodel\/index","example\/relationmodel\/del","example\/relationmodel\/multi","example\/tabletemplate","example\/tabletemplate\/index","example\/tabletemplate\/detail","example\/tabletemplate\/del","example\/tabletemplate\/multi","example\/echarts","example\/echarts\/index"]}
  1 +<?php
  2 +
  3 +namespace addons\example;
  4 +
  5 +use app\common\library\Menu;
  6 +use think\Addons;
  7 +
  8 +/**
  9 + * Example
  10 + */
  11 +class Example extends Addons
  12 +{
  13 +
  14 + /**
  15 + * 插件安装方法
  16 + * @return bool
  17 + */
  18 + public function install()
  19 + {
  20 + $menu = [
  21 + [
  22 + 'name' => 'example',
  23 + 'title' => '开发示例管理',
  24 + 'icon' => 'fa fa-magic',
  25 + 'sublist' => [
  26 + [
  27 + 'name' => 'example/bootstraptable',
  28 + 'title' => '表格完整示例',
  29 + 'icon' => 'fa fa-table',
  30 + 'sublist' => [
  31 + ['name' => 'example/bootstraptable/index', 'title' => '查看'],
  32 + ['name' => 'example/bootstraptable/detail', 'title' => '详情'],
  33 + ['name' => 'example/bootstraptable/change', 'title' => '变更'],
  34 + ['name' => 'example/bootstraptable/del', 'title' => '删除'],
  35 + ['name' => 'example/bootstraptable/multi', 'title' => '批量更新'],
  36 + ]
  37 + ],
  38 + [
  39 + 'name' => 'example/customsearch',
  40 + 'title' => '自定义搜索',
  41 + 'icon' => 'fa fa-table',
  42 + 'sublist' => [
  43 + ['name' => 'example/customsearch/index', 'title' => '查看'],
  44 + ['name' => 'example/customsearch/del', 'title' => '删除'],
  45 + ['name' => 'example/customsearch/multi', 'title' => '批量更新'],
  46 + ]
  47 + ],
  48 + [
  49 + 'name' => 'example/customform',
  50 + 'title' => '自定义表单示例',
  51 + 'icon' => 'fa fa-edit',
  52 + 'sublist' => [
  53 + ['name' => 'example/customform/index', 'title' => '查看'],
  54 + ]
  55 + ],
  56 + [
  57 + 'name' => 'example/tablelink',
  58 + 'title' => '表格联动示例',
  59 + 'icon' => 'fa fa-table',
  60 + 'remark' => '点击左侧日志列表,右侧的表格数据会显示指定管理员的日志列表',
  61 + 'sublist' => [
  62 + ['name' => 'example/tablelink/index', 'title' => '查看'],
  63 + ]
  64 + ],
  65 + [
  66 + 'name' => 'example/colorbadge',
  67 + 'title' => '彩色角标',
  68 + 'icon' => 'fa fa-table',
  69 + 'remark' => '左侧彩色的角标会根据当前数据量的大小进行更新',
  70 + 'sublist' => [
  71 + ['name' => 'example/colorbadge/index', 'title' => '查看'],
  72 + ['name' => 'example/colorbadge/del', 'title' => '删除'],
  73 + ['name' => 'example/colorbadge/multi', 'title' => '批量更新'],
  74 + ]
  75 + ],
  76 + [
  77 + 'name' => 'example/controllerjump',
  78 + 'title' => '控制器间跳转',
  79 + 'icon' => 'fa fa-table',
  80 + 'remark' => '点击IP地址可以跳转到新的选项卡中查看指定IP的数据',
  81 + 'sublist' => [
  82 + ['name' => 'example/controllerjump/index', 'title' => '查看'],
  83 + ['name' => 'example/controllerjump/del', 'title' => '删除'],
  84 + ['name' => 'example/controllerjump/multi', 'title' => '批量更新'],
  85 + ]
  86 + ],
  87 + [
  88 + 'name' => 'example/cxselect',
  89 + 'title' => '多级联动',
  90 + 'icon' => 'fa fa-table',
  91 + 'remark' => '基于jquery.cxselect实现的多级联动',
  92 + 'sublist' => [
  93 + ['name' => 'example/cxselect/index', 'title' => '查看'],
  94 + ['name' => 'example/cxselect/del', 'title' => '删除'],
  95 + ['name' => 'example/cxselect/multi', 'title' => '批量更新'],
  96 + ]
  97 + ],
  98 + [
  99 + 'name' => 'example/multitable',
  100 + 'title' => '多表格示例',
  101 + 'icon' => 'fa fa-table',
  102 + 'remark' => '展示在一个页面显示多个Bootstrap-table表格',
  103 + 'sublist' => [
  104 + ['name' => 'example/multitable/index', 'title' => '查看'],
  105 + ['name' => 'example/multitable/del', 'title' => '删除'],
  106 + ['name' => 'example/multitable/multi', 'title' => '批量更新'],
  107 + ]
  108 + ],
  109 + [
  110 + 'name' => 'example/relationmodel',
  111 + 'title' => '关联模型示例',
  112 + 'icon' => 'fa fa-table',
  113 + 'remark' => '列表中的头像、用户名和昵称字段均从关联表中取出',
  114 + 'sublist' => [
  115 + ['name' => 'example/relationmodel/index', 'title' => '查看'],
  116 + ['name' => 'example/relationmodel/del', 'title' => '删除'],
  117 + ['name' => 'example/relationmodel/multi', 'title' => '批量更新'],
  118 + ]
  119 + ],
  120 + [
  121 + 'name' => 'example/tabletemplate',
  122 + 'title' => '表格模板示例',
  123 + 'icon' => 'fa fa-table',
  124 + 'remark' => '',
  125 + 'sublist' => [
  126 + ['name' => 'example/tabletemplate/index', 'title' => '查看'],
  127 + ['name' => 'example/tabletemplate/detail', 'title' => '详情'],
  128 + ['name' => 'example/tabletemplate/del', 'title' => '删除'],
  129 + ['name' => 'example/tabletemplate/multi', 'title' => '批量更新'],
  130 + ]
  131 + ],
  132 + [
  133 + 'name' => 'example/echarts',
  134 + 'title' => '统计图表示例',
  135 + 'icon' => 'fa fa-bar-chart',
  136 + 'sublist' => [
  137 + ['name' => 'example/echarts/index', 'title' => '查看'],
  138 + ]
  139 + ],
  140 + ]
  141 + ]
  142 + ];
  143 + Menu::create($menu);
  144 + return true;
  145 + }
  146 +
  147 + /**
  148 + * 插件卸载方法
  149 + * @return bool
  150 + */
  151 + public function uninstall()
  152 + {
  153 + Menu::delete('example');
  154 + return true;
  155 + }
  156 +
  157 + /**
  158 + * 插件启用方法
  159 + */
  160 + public function enable()
  161 + {
  162 + Menu::enable('example');
  163 + }
  164 +
  165 + /**
  166 + * 插件禁用方法
  167 + */
  168 + public function disable()
  169 + {
  170 + Menu::disable('example');
  171 + }
  172 +
  173 +}
  1 +<?php
  2 +
  3 +return [
  4 + [
  5 + 'name' => 'condition1',
  6 + 'title' => '条件1',
  7 + 'type' => 'radio',
  8 + 'group' => '选项组一',
  9 + 'content' => [
  10 + 'value1' => '值1',
  11 + 'value2' => '值2',
  12 + ],
  13 + 'value' => 'value2',
  14 + 'rule' => 'required',
  15 + 'msg' => '',
  16 + 'tip' => '',
  17 + 'ok' => '',
  18 + 'extend' => '',
  19 + ],
  20 + [
  21 + 'name' => 'condition2',
  22 + 'title' => '条件2',
  23 + 'type' => 'checkbox',
  24 + 'group' => '选项组一',
  25 + 'visible' => 'condition1=value1',
  26 + 'content' => [
  27 + 'value1' => '值1',
  28 + 'value2' => '值2',
  29 + 'value3' => '值3',
  30 + ],
  31 + 'value' => 'value1,value2',
  32 + 'rule' => 'required',
  33 + 'msg' => '',
  34 + 'tip' => '',
  35 + 'ok' => '',
  36 + 'extend' => '',
  37 + ],
  38 + [
  39 + 'name' => 'condition3',
  40 + 'title' => '条件3',
  41 + 'type' => 'select',
  42 + 'group' => '选项组一',
  43 + 'visible' => 'condition1=value2',
  44 + 'content' => [
  45 + 'value1' => '值1',
  46 + 'value2' => '值2',
  47 + ],
  48 + 'value' => 'value1',
  49 + 'rule' => 'required',
  50 + 'msg' => '',
  51 + 'tip' => '',
  52 + 'ok' => '',
  53 + 'extend' => '',
  54 + ],
  55 + [
  56 + 'name' => 'condition4',
  57 + 'title' => '条件4',
  58 + 'type' => 'selects',
  59 + 'group' => '选项组一',
  60 + 'content' => [
  61 + 'value1' => '值1',
  62 + 'value2' => '值2',
  63 + 'value3' => '值3',
  64 + ],
  65 + 'value' => 'value1,value2',
  66 + 'rule' => 'required',
  67 + 'msg' => '',
  68 + 'tip' => '',
  69 + 'ok' => '',
  70 + 'extend' => '',
  71 + ],
  72 + [
  73 + 'name' => 'title',
  74 + 'title' => '标题',
  75 + 'type' => 'string',
  76 + 'group' => '选项组一',
  77 + 'visible' => 'condition3=value1',
  78 + 'content' => [],
  79 + 'value' => '3x',
  80 + 'rule' => 'required',
  81 + 'msg' => '',
  82 + 'tip' => '',
  83 + 'ok' => '',
  84 + 'extend' => '',
  85 + ],
  86 + [
  87 + 'name' => 'domain',
  88 + 'title' => '绑定二级域名前缀',
  89 + 'type' => 'string',
  90 + 'group' => '选项组二',
  91 + 'content' => [],
  92 + 'value' => '',
  93 + 'rule' => '',
  94 + 'msg' => '',
  95 + 'tip' => '',
  96 + 'ok' => '',
  97 + 'extend' => '',
  98 + ],
  99 + [
  100 + 'name' => 'rewrite',
  101 + 'title' => '伪静态',
  102 + 'type' => 'array',
  103 + 'group' => '选项组二',
  104 + 'content' => [],
  105 + 'value' => [
  106 + 'index/index' => '/example$',
  107 + 'demo/index' => '/example/d/[:name]',
  108 + 'demo/demo1' => '/example/d1/[:name]',
  109 + 'demo/demo2' => '/example/d2/[:name]',
  110 + ],
  111 + 'rule' => 'required',
  112 + 'msg' => '',
  113 + 'tip' => '',
  114 + 'ok' => '',
  115 + 'extend' => '',
  116 + ],
  117 + [
  118 + 'name' => '__tips__',
  119 + 'title' => '温馨提示',
  120 + 'type' => 'string',
  121 + 'content' => [],
  122 + 'value' => '这里是提示的文本内容',
  123 + 'rule' => '',
  124 + 'msg' => '',
  125 + 'tip' => '',
  126 + 'ok' => '',
  127 + 'extend' => '',
  128 + ],
  129 +];
  1 +<?php
  2 +
  3 +namespace addons\example\controller;
  4 +
  5 +use think\addons\Controller;
  6 +
  7 +/**
  8 + * 测试控制器
  9 + */
  10 +class Demo extends Controller
  11 +{
  12 +
  13 + protected $layout = 'default';
  14 + protected $noNeedLogin = ['index', 'demo1'];
  15 + protected $noNeedRight = ['*'];
  16 +
  17 + public function index()
  18 + {
  19 + return $this->view->fetch();
  20 + }
  21 +
  22 + public function demo1()
  23 + {
  24 + return $this->view->fetch();
  25 + }
  26 +
  27 + public function demo2()
  28 + {
  29 + return $this->view->fetch();
  30 + }
  31 +
  32 +}
  1 +<?php
  2 +
  3 +namespace addons\example\controller;
  4 +
  5 +use think\addons\Controller;
  6 +
  7 +class Index extends Controller
  8 +{
  9 +
  10 + protected $layout = 'default';
  11 +
  12 + public function index()
  13 + {
  14 + return $this->view->fetch();
  15 + }
  16 +
  17 +}
  1 +name = example
  2 +title = 开发示例
  3 +intro = FastAdmin多个开发示例
  4 +author = FastAdmin
  5 +website = https://www.fastadmin.net
  6 +version = 1.1.3
  7 +state = 1
  8 +url = /addons/example
  9 +license = regular
  10 +licenseto = 15629
此 diff 太大无法显示。
  1 +<!-- Page Content -->
  2 + <div class="container">
  3 +
  4 + <!-- Page Heading/Breadcrumbs -->
  5 + <div class="row">
  6 + <div class="col-lg-12">
  7 + <h1 class="page-header">无需登录页面
  8 + <small>开发者示例</small>
  9 + </h1>
  10 + <ol class="breadcrumb">
  11 + <li><a href="{:addon_url('example/index/index')}">插件首页</a>
  12 + </li>
  13 + <li class="active">无需登录页面</li>
  14 + </ol>
  15 + </div>
  16 + </div>
  17 + <!-- /.row -->
  18 +
  19 + <!-- Content Row -->
  20 + <div class="row">
  21 + <div class="col-lg-12">
  22 + <p class="well">当前登录页面无需登录即可查看,当前请求的name值为:{$Request.param.name|htmlentities}</p>
  23 + {if $user}
  24 + <p class="well text-danger">但是如果你登录后可以浏览到这段隐藏的信息</p>
  25 + {/if}
  26 + </div>
  27 + </div>
  28 + <!-- /.row -->
  29 +
  30 + <hr>
  31 +
  32 + </div>
  33 + <!-- /.container -->
  1 +<!-- Page Content -->
  2 +<div class="container">
  3 +
  4 + <!-- Page Heading/Breadcrumbs -->
  5 + <div class="row">
  6 + <div class="col-lg-12">
  7 + <h1 class="page-header">需登录页面
  8 + <small>开发者示例</small>
  9 + </h1>
  10 + <ol class="breadcrumb">
  11 + <li><a href="{:addon_url('example/index/index')}">插件首页</a>
  12 + </li>
  13 + <li class="active">需登录页面</li>
  14 + </ol>
  15 + </div>
  16 + </div>
  17 + <!-- /.row -->
  18 +
  19 + <!-- Content Row -->
  20 + <div class="row">
  21 + <div class="col-lg-12">
  22 + <p class="well">当前登录页面需要登录后才可以查看,你可以退出后再访问此页面,会提醒登录,当前请求的name值为:{$Request.param.name|htmlentities}</p>
  23 + <p class="well">你好!{$user.nickname|htmlentities},<a href="{:url('index/user/logout')}">注销登录</a></p>
  24 + </div>
  25 + </div>
  26 + <!-- /.row -->
  27 +
  28 + <hr>
  29 +
  30 +</div>
  31 +<!-- /.container -->
  1 +<!-- Page Content -->
  2 + <div class="container">
  3 +
  4 + <!-- Page Heading/Breadcrumbs -->
  5 + <div class="row">
  6 + <div class="col-lg-12">
  7 + <h1 class="page-header">使用模板标签和变量
  8 + <small>开发者示例</small>
  9 + </h1>
  10 + <ol class="breadcrumb">
  11 + <li><a href="{:addon_url('example/index/index')}">插件首页</a>
  12 + </li>
  13 + <li class="active">使用模板标签和变量</li>
  14 + </ol>
  15 + </div>
  16 + </div>
  17 + <!-- /.row -->
  18 +
  19 + <!-- Content Row -->
  20 + <div class="row">
  21 + <div class="col-lg-12">
  22 + <p class="well">当前请求的name值为:{$Request.param.name|htmlentities}</p>
  23 + {literal}
  24 + <pre>
  25 +在插件视图中可以使用所有ThinkPHP5内支持的模板标签和变量,如
  26 +
  27 +{$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量
  28 +{$Think.session.user_id} // 输出$_SESSION['user_id']变量
  29 +{$Think.get.pageNumber} // 输出$_GET['pageNumber']变量
  30 +{$Think.cookie.name} // 输出$_COOKIE['name']变量
  31 +
  32 +// 调用Request对象的get方法 传入参数为id
  33 +{$Request.get.id}
  34 +// 调用Request对象的param方法 传入参数为name
  35 +{$Request.param.name}
  36 +// 调用Request对象的param方法 传入参数为user.nickname
  37 +{$Request.param.user.nickname}
  38 +// 调用Request对象的root方法
  39 +{$Request.root}
  40 +// 调用Request对象的root方法,并且传入参数true
  41 +{$Request.root.true}
  42 +// 调用Request对象的path方法
  43 +{$Request.path}
  44 +// 调用Request对象的module方法
  45 +{$Request.module}
  46 +// 调用Request对象的controller方法
  47 +{$Request.controller}
  48 +// 调用Request对象的action方法
  49 +{$Request.action}
  50 +// 调用Request对象的ext方法
  51 +{$Request.ext}
  52 +// 调用Request对象的host方法
  53 +{$Request.host}
  54 +// 调用Request对象的ip方法
  55 +{$Request.ip}
  56 +// 调用Request对象的header方法
  57 +{$Request.header.accept-encoding}
  58 + </pre>
  59 + {/literal}
  60 + </div>
  61 + </div>
  62 + <!-- /.row -->
  63 +
  64 + <hr>
  65 +
  66 + </div>
  67 + <!-- /.container -->
  1 +<!-- Header Carousel -->
  2 +<header id="myCarousel" class="carousel slide">
  3 + <!-- Indicators -->
  4 + <ol class="carousel-indicators">
  5 + <li data-target="#myCarousel" data-slide-to="0" class="active"></li>
  6 + </ol>
  7 +
  8 + <!-- Wrapper for slides -->
  9 + <div class="carousel-inner">
  10 + <div class="item active">
  11 + <a href="javascript:">
  12 + <div class="fill" style="background-image:url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzOTMiIGhlaWdodD0iMjI2Ij48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiBmaWxsPSJyZ2IoNjMsIDE0MywgODUpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjE0MTMzMzMzMzMzMzMzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAtMzcuODMzMzMzMzMzMzMzKSByb3RhdGUoMTgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMTQxMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDE4OS4xNjY2NjY2NjY2Nykgcm90YXRlKDE4MCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjA2MzMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjUuNTI5MjU1NTUzMDIzLCAtMzcuODMzMzMzMzMzMzMzKSByb3RhdGUoMCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjA2MzMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjUuNTI5MjU1NTUzMDIzLCAxODkuMTY2NjY2NjY2NjcpIHJvdGF0ZSgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDgwNjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMzEuMDU4NTExMTA2MDUsIC0zNy44MzMzMzMzMzMzMzMpIHJvdGF0ZSgxODAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4wODA2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEzMS4wNTg1MTExMDYwNSwgMTg5LjE2NjY2NjY2NjY3KSByb3RhdGUoMTgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDQ2IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTYuNTg3NzY2NjU5MDcsIC0zNy44MzMzMzMzMzMzMzMpIHJvdGF0ZSgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDQ2IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTYuNTg3NzY2NjU5MDcsIDE4OS4xNjY2NjY2NjY2Nykgcm90YXRlKDAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wODkzMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2Mi4xMTcwMjIyMTIwOSwgLTM3LjgzMzMzMzMzMzMzMykgcm90YXRlKDE4MCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjA4OTMzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjYyLjExNzAyMjIxMjA5LCAxODkuMTY2NjY2NjY2NjcpIHJvdGF0ZSgxODAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4xNDEzMzMzMzMzMzMzMyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzI3LjY0NjI3Nzc2NTExLCAtMzcuODMzMzMzMzMzMzMzKSByb3RhdGUoMCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjE0MTMzMzMzMzMzMzMzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMjcuNjQ2Mjc3NzY1MTEsIDE4OS4xNjY2NjY2NjY2Nykgcm90YXRlKDAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wMiIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMCkgcm90YXRlKDAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4wMjg2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDY1LjUyOTI1NTU1MzAyMywgMCkgcm90YXRlKDE4MCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjExNTMzMzMzMzMzMzMzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMzEuMDU4NTExMTA2MDUsIDApIHJvdGF0ZSgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDgwNjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTYuNTg3NzY2NjU5MDcsIDApIHJvdGF0ZSgxODAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4wODA2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2Mi4xMTcwMjIyMTIwOSwgMCkgcm90YXRlKDAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wMiIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMzI3LjY0NjI3Nzc2NTExLCAwKSByb3RhdGUoMTgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDgwNjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAzNy44MzMzMzMzMzMzMzMpIHJvdGF0ZSgxODAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wMiIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMpIHJvdGF0ZSgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDk4IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMzEuMDU4NTExMTA2MDUsIDM3LjgzMzMzMzMzMzMzMykgcm90YXRlKDE4MCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjE1IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTYuNTg3NzY2NjU5MDcsIDM3LjgzMzMzMzMzMzMzMykgcm90YXRlKDAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4wMjg2NjY2NjY2NjY2NjciIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDI2Mi4xMTcwMjIyMTIwOSwgMzcuODMzMzMzMzMzMzMzKSByb3RhdGUoMTgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDQ2IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMjcuNjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykgcm90YXRlKDAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wMzczMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIDc1LjY2NjY2NjY2NjY2Nykgcm90YXRlKDAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4wMiIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjUuNTI5MjU1NTUzMDIzLCA3NS42NjY2NjY2NjY2NjcpIHJvdGF0ZSgxODAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4xNSIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTMxLjA1ODUxMTEwNjA1LCA3NS42NjY2NjY2NjY2NjcpIHJvdGF0ZSgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5Ni41ODc3NjY2NTkwNywgNzUuNjY2NjY2NjY2NjY3KSByb3RhdGUoMTgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDk4IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNjIuMTE3MDIyMjEyMDksIDc1LjY2NjY2NjY2NjY2Nykgcm90YXRlKDAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiMyMjIiIGZpbGwtb3BhY2l0eT0iMC4wNjMzMzMzMzMzMzMzMzMiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMyNy42NDYyNzc3NjUxMSwgNzUuNjY2NjY2NjY2NjY3KSByb3RhdGUoMTgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMTI0IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAxMTMuNSkgcm90YXRlKDE4MCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjE1IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2NS41MjkyNTU1NTMwMjMsIDExMy41KSByb3RhdGUoMCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjEyNCIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTMxLjA1ODUxMTEwNjA1LCAxMTMuNSkgcm90YXRlKDE4MCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjEwNjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxOTYuNTg3NzY2NjU5MDcsIDExMy41KSByb3RhdGUoMCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjEyNCIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMjYyLjExNzAyMjIxMjA5LCAxMTMuNSkgcm90YXRlKDE4MCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjEzMjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzMjcuNjQ2Mjc3NzY1MTEsIDExMy41KSByb3RhdGUoMCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iI2RkZCIgZmlsbC1vcGFjaXR5PSIwLjEwNjY2NjY2NjY2NjY3IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLCAxNTEuMzMzMzMzMzMzMzMpIHJvdGF0ZSgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDYzMzMzMzMzMzMzMzMzIiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg2NS41MjkyNTU1NTMwMjMsIDE1MS4zMzMzMzMzMzMzMykgcm90YXRlKDE4MCwgMzIuNzY0NjI3Nzc2NTExLCAzNy44MzMzMzMzMzMzMzMpIi8+PHBvbHlsaW5lIHBvaW50cz0iMCwgMCwgNjUuNTI5MjU1NTUzMDIzLCAzNy44MzMzMzMzMzMzMzMsIDAsIDc1LjY2NjY2NjY2NjY2NywgMCwgMCIgZmlsbD0iIzIyMiIgZmlsbC1vcGFjaXR5PSIwLjA4MDY2NjY2NjY2NjY2NyIgc3Ryb2tlPSIjMDAwIiBzdHJva2Utb3BhY2l0eT0iMC4wMiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTMxLjA1ODUxMTEwNjA1LCAxNTEuMzMzMzMzMzMzMzMpIHJvdGF0ZSgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjZGRkIiBmaWxsLW9wYWNpdHk9IjAuMDIiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDE5Ni41ODc3NjY2NTkwNywgMTUxLjMzMzMzMzMzMzMzKSByb3RhdGUoMTgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48cG9seWxpbmUgcG9pbnRzPSIwLCAwLCA2NS41MjkyNTU1NTMwMjMsIDM3LjgzMzMzMzMzMzMzMywgMCwgNzUuNjY2NjY2NjY2NjY3LCAwLCAwIiBmaWxsPSIjMjIyIiBmaWxsLW9wYWNpdHk9IjAuMDk4IiBzdHJva2U9IiMwMDAiIHN0cm9rZS1vcGFjaXR5PSIwLjAyIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyNjIuMTE3MDIyMjEyMDksIDE1MS4zMzMzMzMzMzMzMykgcm90YXRlKDAsIDMyLjc2NDYyNzc3NjUxMSwgMzcuODMzMzMzMzMzMzMzKSIvPjxwb2x5bGluZSBwb2ludHM9IjAsIDAsIDY1LjUyOTI1NTU1MzAyMywgMzcuODMzMzMzMzMzMzMzLCAwLCA3NS42NjY2NjY2NjY2NjcsIDAsIDAiIGZpbGw9IiNkZGQiIGZpbGwtb3BhY2l0eT0iMC4xMjQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLW9wYWNpdHk9IjAuMDIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDMyNy42NDYyNzc3NjUxMSwgMTUxLjMzMzMzMzMzMzMzKSByb3RhdGUoMTgwLCAzMi43NjQ2Mjc3NzY1MTEsIDM3LjgzMzMzMzMzMzMzMykiLz48L3N2Zz4=');"></div>
  13 + <div class="carousel-body">
  14 + <div class="container">
  15 + <h1 class="display-1 text-white">开发示例</h1>
  16 + <h2 class="display-4 text-white">表格、登录相关示例</h2>
  17 + </div>
  18 + </div>
  19 + </a>
  20 + </div>
  21 + </div>
  22 +</header>
  23 +
  24 +<!-- Page Content -->
  25 +<div class="container">
  26 +
  27 + <!-- Marketing Icons Section -->
  28 + <div class="row">
  29 + <div class="col-lg-12">
  30 + <h2 class="page-header">
  31 + 基础模块
  32 + </h2>
  33 + </div>
  34 + <div class="col-md-4">
  35 + <div class="panel panel-default">
  36 + <div class="panel-heading">
  37 + <h4><i class="fa fa-fw fa-user"></i> 前台模块</h4>
  38 + </div>
  39 + <div class="panel-body">
  40 + <p>前台模块中包含基础的会员模块,前台模块中的会员账号和API模块中的会员账号是同一账号体系</p>
  41 + <a href="{:url('index/index/index')}" target="_blank" class="btn btn-primary">立即访问</a>
  42 + <a href="{:url('index/user/index')}" target="_blank" class="btn btn-default">会员中心</a>
  43 + </div>
  44 + </div>
  45 + </div>
  46 + <div class="col-md-4">
  47 + <div class="panel panel-default">
  48 + <div class="panel-heading">
  49 + <h4><i class="fa fa-fw fa-gift"></i> API模块</h4>
  50 + </div>
  51 + <div class="panel-body">
  52 + <p>API模块中包含基础的会员模块,初始化模块、短信发送模块、验证模块</p>
  53 + <a href="{:url('api/index/index')}" target="_blank" class="btn btn-primary">立即访问</a>
  54 + <a href="{:url('api/common/init')}?version=1.0.0" target="_blank" class="btn btn-default">初始化接口</a>
  55 + </div>
  56 + </div>
  57 + </div>
  58 + <div class="col-md-4">
  59 + <div class="panel panel-default">
  60 + <div class="panel-heading">
  61 + <h4><i class="fa fa-fw fa-compass"></i> API文档</h4>
  62 + </div>
  63 + <div class="panel-body">
  64 + <p>当写完API接口以后,可通过执行php think api一键生成我们所需要的API文档,并且可以直接在线测试</p>
  65 + <a href="{:url('/')}api.html" target="_blank" class="btn btn-primary">立即访问</a>
  66 + </div>
  67 + </div>
  68 + </div>
  69 + </div>
  70 + <div class="row">
  71 + <div class="col-lg-12">
  72 + <h2 class="page-header">
  73 + 功能示例
  74 + </h2>
  75 + </div>
  76 + <div class="col-md-4">
  77 + <div class="panel panel-default">
  78 + <div class="panel-heading">
  79 + <h4><i class="fa fa-fw fa-check"></i> 使用模板标签和变量</h4>
  80 + </div>
  81 + <div class="panel-body">
  82 + <a href="{:addon_url('example/demo/index',[':name'=>'s1'])}" class="btn btn-success">查看示例</a>
  83 + </div>
  84 + </div>
  85 + </div>
  86 + <div class="col-md-4">
  87 + <div class="panel panel-default">
  88 + <div class="panel-heading">
  89 + <h4><i class="fa fa-fw fa-gift"></i> 访问不需要登录的页面</h4>
  90 + </div>
  91 + <div class="panel-body">
  92 + <a href="{:addon_url('example/demo/demo1',[':name'=>'s2'])}" class="btn btn-success">立即访问</a>
  93 + </div>
  94 + </div>
  95 + </div>
  96 + <div class="col-md-4">
  97 + <div class="panel panel-default">
  98 + <div class="panel-heading">
  99 + <h4><i class="fa fa-fw fa-compass"></i> 访问需要登录的页面</h4>
  100 + </div>
  101 + <div class="panel-body">
  102 + <a href="{:addon_url('example/demo/demo2',[':name'=>'s3'])}" class="btn btn-success">立即访问</a>
  103 + </div>
  104 + </div>
  105 + </div>
  106 + </div>
  107 + <!-- /.row -->
  108 +
  109 + <hr>
  110 +
  111 +</div>
  1 +<!DOCTYPE html>
  2 +<html lang="en">
  3 +
  4 + <head>
  5 +
  6 + <meta charset="utf-8">
  7 + <meta http-equiv="X-UA-Compatible" content="IE=edge">
  8 + <meta name="viewport" content="width=device-width, initial-scale=1">
  9 + <meta name="description" content="">
  10 + <meta name="author" content="">
  11 +
  12 + <title>开发示例 - {$site.name|htmlentities}</title>
  13 +
  14 + <!-- Bootstrap Core CSS -->
  15 + <link href="__CDN__/assets/libs/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
  16 +
  17 + <!-- Custom CSS -->
  18 + <link href="__ADDON__/css/common.css" rel="stylesheet">
  19 +
  20 + <!-- Custom Fonts -->
  21 + <link href="__CDN__/assets/libs/font-awesome/css/font-awesome.min.css" rel="stylesheet">
  22 +
  23 + <!--[if lt IE 9]>
  24 + <script src="__CDN__/assets/js/html5shiv.js"></script>
  25 + <script src="__CDN__/assets/js/respond.min.js"></script>
  26 + <![endif]-->
  27 +
  28 + </head>
  29 +
  30 + <body>
  31 +
  32 + <!-- Navigation -->
  33 + <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
  34 + <div class="container">
  35 + <!-- Brand and toggle get grouped for better mobile display -->
  36 + <div class="navbar-header">
  37 + <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
  38 + <span class="sr-only">Toggle navigation</span>
  39 + <span class="icon-bar"></span>
  40 + <span class="icon-bar"></span>
  41 + <span class="icon-bar"></span>
  42 + </button>
  43 + <a class="navbar-brand" href="{:addon_url('example/index/index')}">{$site.name|htmlentities}</a>
  44 + </div>
  45 + <!-- Collect the nav links, forms, and other content for toggling -->
  46 + <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
  47 + <ul class="nav navbar-nav navbar-right">
  48 + <li>
  49 + <a href="{:addon_url('example/index/index')}">插件首页</a>
  50 + </li>
  51 + <li>
  52 + <a href="{:addon_url('example/demo/demo1', [':name'=>'s1'])}">无需登录页面</a>
  53 + </li>
  54 + <li>
  55 + <a href="{:addon_url('example/demo/demo2', [':name'=>'s2'])}">需登录页面</a>
  56 + </li>
  57 + {if $user}
  58 + <li class="dropdown">
  59 + <a href="#" class="dropdown-toggle" data-toggle="dropdown">欢迎你! {$user.nickname|htmlentities}<b class="caret"></b></a>
  60 + <ul class="dropdown-menu">
  61 + <li>
  62 + <a href="{:url('index/user/index')}">会员中心</a>
  63 + </li>
  64 + <li>
  65 + <a href="{:url('index/user/profile')}">个人资料</a>
  66 + </li>
  67 + <li>
  68 + <a href="{:url('index/user/logout')}">退出登录</a>
  69 + </li>
  70 + </ul>
  71 + </li>
  72 + {else /}
  73 + <li class="dropdown">
  74 + <a href="#" class="dropdown-toggle" data-toggle="dropdown">会员中心 <b class="caret"></b></a>
  75 + <ul class="dropdown-menu">
  76 + <li>
  77 + <a href="{:url('index/user/login')}">登录</a>
  78 + </li>
  79 + <li>
  80 + <a href="{:url('index/user/register')}">注册</a>
  81 + </li>
  82 + </ul>
  83 + </li>
  84 + {/if}
  85 + </ul>
  86 + </div>
  87 + <!-- /.navbar-collapse -->
  88 + </div>
  89 + <!-- /.container -->
  90 + </nav>
  91 +
  92 + {__CONTENT__}
  93 +
  94 + <div class="container">
  95 + <!-- Footer -->
  96 + <footer>
  97 + <div class="row">
  98 + <div class="col-lg-12">
  99 + <p>Copyright &copy; {$site.name|htmlentities} 2024</p>
  100 + </div>
  101 + </div>
  102 + </footer>
  103 +
  104 + </div>
  105 + <!-- /.container -->
  106 +
  107 + <!-- jQuery -->
  108 + <script src="__CDN__/assets/libs/jquery/dist/jquery.min.js"></script>
  109 +
  110 + <!-- Bootstrap Core JavaScript -->
  111 + <script src="__CDN__/assets/libs/bootstrap/dist/js/bootstrap.min.js"></script>
  112 +
  113 + <!-- Script to Activate the Carousel -->
  114 + <script>
  115 + $('.carousel').carousel({
  116 + interval: 5000 //changes the speed
  117 + })
  118 + </script>
  119 +
  120 + </body>
  121 +
  122 +</html>
@@ -4,6 +4,7 @@ namespace app\admin\controller; @@ -4,6 +4,7 @@ namespace app\admin\controller;
4 4
5 use app\common\controller\Backend; 5 use app\common\controller\Backend;
6 use think\Db; 6 use think\Db;
  7 +use think\exception\DbException;
7 use think\exception\PDOException; 8 use think\exception\PDOException;
8 use think\exception\ValidateException; 9 use think\exception\ValidateException;
9 10
@@ -119,7 +120,7 @@ class Order extends Backend @@ -119,7 +120,7 @@ class Order extends Backend
119 * @throws DbException 120 * @throws DbException
120 * @throws \think\Exception 121 * @throws \think\Exception
121 */ 122 */
122 - public function selectiondriver($ids = null) 123 + public function edit($ids = null)
123 { 124 {
124 $row = $this->model->get($ids); 125 $row = $this->model->get($ids);
125 if (!$row) { 126 if (!$row) {
@@ -130,7 +131,13 @@ class Order extends Backend @@ -130,7 +131,13 @@ class Order extends Backend
130 $this->error(__('You have no permission')); 131 $this->error(__('You have no permission'));
131 } 132 }
132 if (false === $this->request->isPost()) { 133 if (false === $this->request->isPost()) {
133 - $this->view->assign('row', $row); 134 + $car=Db::name("car")
  135 + ->alias("a")
  136 + ->join("driver b","a.driver_id=b.id")
  137 + ->where("a.route_id",$row['route_id'])
  138 + ->field("b.id,car_model,name,license_plate")
  139 + ->select();
  140 + $this->view->assign('row', $car);
134 return $this->view->fetch(); 141 return $this->view->fetch();
135 } 142 }
136 $params = $this->request->post('row/a'); 143 $params = $this->request->post('row/a');
@@ -147,6 +154,33 @@ class Order extends Backend @@ -147,6 +154,33 @@ class Order extends Backend
147 $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate; 154 $validate = is_bool($this->modelValidate) ? ($this->modelSceneValidate ? $name . '.edit' : $name) : $this->modelValidate;
148 $row->validateFailException()->validate($validate); 155 $row->validateFailException()->validate($validate);
149 } 156 }
  157 + $driver = Db::name("driver")->where("id", $ids)->find();
  158 + $car = Db::name("car")->where("driver_id", $driver['id'])->find();
  159 + $carmodel = Db::name("carmodel")->where("id", $car['carmodel_id'])->find();
  160 + $route = Db::name("route")->where("id", $car['route_id'])->find();
  161 +//判断总表
  162 + $time = strtotime(date("Y-m-d", time()));
  163 + $order_review = Db::name("order_review")
  164 + ->where("car_id", $car["id"])
  165 + ->where("route_id", $route['id'])
  166 + ->where("driver_id", $driver['id'])
  167 + ->where("createtime", ">", $time)
  168 + ->find();
  169 +
  170 + if (!$order_review) {
  171 + $order_review_id = Db::name("order_review")
  172 + ->insertGetId([
  173 + "car_id" => $car["id"],
  174 + "route_id" => $route['id'],
  175 + "driver_id" => $driver['id'],
  176 + "type" => 2,
  177 + "order_status" => 3,
  178 + "createtime" => time()
  179 + ]);
  180 + } else {
  181 + $order_review_id = $order_review['id'];
  182 + }
  183 + $params["order_review_id"]=$order_review_id;
150 $result = $row->allowField(true)->save($params); 184 $result = $row->allowField(true)->save($params);
151 Db::commit(); 185 Db::commit();
152 } catch (ValidateException|PDOException|Exception $e) { 186 } catch (ValidateException|PDOException|Exception $e) {
@@ -160,5 +194,4 @@ class Order extends Backend @@ -160,5 +194,4 @@ class Order extends Backend
160 } 194 }
161 195
162 196
163 -  
164 } 197 }
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 表格完整示例
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark 在使用Bootstrap-table中的常用方式,更多使用方式可查看:http://bootstrap-table.wenzhixin.net.cn/zh-cn/
  12 + */
  13 +class Bootstraptable extends Backend
  14 +{
  15 + /**
  16 + * @var \app\admin\model\AdminLog
  17 + */
  18 + protected $model = null;
  19 + /**
  20 + * 无需鉴权的方法(需登录)
  21 + * @var array
  22 + */
  23 + protected $noNeedRight = ['start', 'pause', 'change', 'detail', 'cxselect', 'searchlist', 'selectpage'];
  24 +
  25 + /**
  26 + * 快捷搜索的字段
  27 + * @var string
  28 + */
  29 + protected $searchFields = 'id,title,url';
  30 +
  31 + public function _initialize()
  32 + {
  33 + parent::_initialize();
  34 + $this->model = model('AdminLog');
  35 + }
  36 +
  37 + /**
  38 + * 查看
  39 + */
  40 + public function index()
  41 + {
  42 + if ($this->request->isAjax()) {
  43 + list($where, $sort, $order, $offset, $limit) = $this->buildparams(null);
  44 + $list = $this->model
  45 + ->where($where)
  46 + ->order($sort, $order)
  47 + ->limit($offset, $limit)
  48 + ->paginate($limit);
  49 + $result = array("total" => $list->total(), "rows" => $list->items(), "extend" => ['money' => mt_rand(100000, 999999), 'price' => 200]);
  50 +
  51 + return json($result);
  52 + }
  53 + return $this->view->fetch();
  54 + }
  55 +
  56 + /**
  57 + * 详情
  58 + */
  59 + public function detail($ids)
  60 + {
  61 + $row = $this->model->get(['id' => $ids]);
  62 + if (!$row) {
  63 + $this->error(__('No Results were found'));
  64 + }
  65 + if ($this->request->isAjax()) {
  66 + $this->success("Ajax请求成功", null, ['id' => $ids]);
  67 + }
  68 + $this->view->assign("row", $row->toArray());
  69 + return $this->view->fetch();
  70 + }
  71 +
  72 + /**
  73 + * 启用
  74 + */
  75 + public function start($ids = '')
  76 + {
  77 + $this->success("模拟启动成功");
  78 + }
  79 +
  80 + /**
  81 + * 暂停
  82 + */
  83 + public function pause($ids = '')
  84 + {
  85 + $this->success("模拟暂停成功");
  86 + }
  87 +
  88 + /**
  89 + * 切换
  90 + */
  91 + public function change($ids = '')
  92 + {
  93 + //你需要在此做具体的操作逻辑
  94 +
  95 + $this->success("模拟切换成功");
  96 + }
  97 +
  98 + /**
  99 + * 联动搜索
  100 + */
  101 + public function cxselect()
  102 + {
  103 + $type = $this->request->get('type');
  104 + $group_id = $this->request->get('group_id');
  105 + $list = null;
  106 + if ($group_id !== '') {
  107 + if ($type == 'group') {
  108 + $groupIds = $this->auth->getChildrenGroupIds(true);
  109 + $list = \app\admin\model\AuthGroup::where('id', 'in', $groupIds)->field('id as value, name')->select();
  110 + } else {
  111 + $adminIds = \app\admin\model\AuthGroupAccess::where('group_id', 'in', $group_id)->column('uid');
  112 + $list = \app\admin\model\Admin::where('id', 'in', $adminIds)->field('id as value, username AS name')->select();
  113 + }
  114 + }
  115 + $this->success('', null, $list);
  116 + }
  117 +
  118 + /**
  119 + * 搜索下拉列表
  120 + */
  121 + public function searchlist()
  122 + {
  123 + $result = $this->model->limit(10)->select();
  124 + $searchlist = [];
  125 + foreach ($result as $key => $value) {
  126 + $searchlist[] = ['id' => $value['url'], 'name' => $value['url']];
  127 + }
  128 + $data = ['searchlist' => $searchlist];
  129 + $this->success('', null, $data);
  130 + }
  131 +
  132 + public function selectpage()
  133 + {
  134 + $this->model = new \app\admin\model\AdminLog;
  135 + return parent::selectpage();
  136 + }
  137 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 彩色角标
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark 在JS端控制角标的显示与隐藏,请注意左侧菜单栏角标的数值变化
  12 + */
  13 +class Colorbadge extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 控制器间跳转
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark FastAdmin支持在控制器间跳转,点击后将切换到另外一个TAB中,无需刷新当前页面
  12 + */
  13 +class Controllerjump extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\admin\model\AdminLog;
  6 +use app\common\controller\Backend;
  7 +
  8 +/**
  9 + * 自定义表单示例
  10 + *
  11 + * @icon fa fa-table
  12 + * @remark FastAdmin支持在控制器间跳转,点击后将切换到另外一个TAB中,无需刷新当前页面
  13 + */
  14 +class Customform extends Backend
  15 +{
  16 + protected $model = null;
  17 +
  18 + public function _initialize()
  19 + {
  20 + parent::_initialize();
  21 + $this->model = model('AdminLog');
  22 + }
  23 +
  24 + public function index()
  25 + {
  26 + if ($this->request->isPost()) {
  27 + $this->success("提交成功", null, ['data' => json_encode($this->request->post("row/a"), JSON_UNESCAPED_UNICODE)]);
  28 + }
  29 + return $this->view->fetch();
  30 + }
  31 +
  32 + public function get_title_list()
  33 + {
  34 + $query = $this->request->get("query");
  35 + $suggestions = AdminLog::where('title', 'like', '%' . $query . '%')->limit(10)->column("title");
  36 + $result = [
  37 + 'query' => $query,
  38 + 'suggestions' => $suggestions
  39 + ];
  40 + return json($result);
  41 + }
  42 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 自定义搜索
  9 + *
  10 + * @icon fa fa-search
  11 + * @remark 自定义列表的搜索
  12 + */
  13 +class Customsearch extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + $ipList = $this->model->whereTime('createtime', '-37 days')->group("ip")->column("ip,ip as aa");
  22 + $this->view->assign("ipList", $ipList);
  23 + }
  24 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 多级联动
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark FastAdmin使用了jQuery-cxselect实现多级联动,更多文档请参考https://github.com/karsonzhang/cxSelect
  12 + */
  13 +class Cxselect extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + }
  21 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 统计图表示例
  9 + *
  10 + * @icon fa fa-charts
  11 + * @remark 展示在FastAdmin中使用Echarts展示丰富多彩的统计图表
  12 + */
  13 +class Echarts extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +
  23 + /**
  24 + * 查看
  25 + */
  26 + public function index()
  27 + {
  28 +
  29 + return $this->view->fetch();
  30 + }
  31 +
  32 + /**
  33 + * 详情
  34 + */
  35 + public function detail($ids)
  36 + {
  37 + $row = $this->model->get(['id' => $ids]);
  38 + if (!$row) {
  39 + $this->error(__('No Results were found'));
  40 + }
  41 + $this->view->assign("row", $row->toArray());
  42 + return $this->view->fetch();
  43 + }
  44 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 多表格示例
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark 当一个页面上存在多个Bootstrap-table时该如何控制按钮和表格
  12 + */
  13 +class Multitable extends Backend
  14 +{
  15 + protected $model = null;
  16 + protected $noNeedRight = ['table1', 'table2'];
  17 +
  18 + public function _initialize()
  19 + {
  20 + parent::_initialize();
  21 + }
  22 +
  23 + /**
  24 + * 查看
  25 + */
  26 + public function index()
  27 + {
  28 + $this->loadlang('general/attachment');
  29 + $this->loadlang('general/crontab');
  30 + return $this->view->fetch();
  31 + }
  32 +
  33 + public function table1()
  34 + {
  35 + $this->model = model('Attachment');
  36 + //设置过滤方法
  37 + $this->request->filter(['strip_tags']);
  38 + if ($this->request->isAjax()) {
  39 + //如果发送的来源是Selectpage,则转发到Selectpage
  40 + if ($this->request->request('keyField')) {
  41 + return $this->selectpage();
  42 + }
  43 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  44 + $total = $this->model
  45 + ->where($where)
  46 + ->field('id,filename,filesize,imagewidth,imageheight,mimetype')
  47 + ->order($sort, $order)
  48 + ->count();
  49 +
  50 + $list = $this->model
  51 + ->where($where)
  52 + ->field('id,filename,filesize,imagewidth,imageheight,mimetype')
  53 + ->order($sort, $order)
  54 + ->limit($offset, $limit)
  55 + ->select();
  56 +
  57 + $result = array("total" => $total, "rows" => $list);
  58 +
  59 + return json($result);
  60 + }
  61 + return $this->view->fetch('index');
  62 + }
  63 +
  64 + public function table2()
  65 + {
  66 + $this->model = model('AdminLog');
  67 + //设置过滤方法
  68 + $this->request->filter(['strip_tags']);
  69 + if ($this->request->isAjax()) {
  70 + //如果发送的来源是Selectpage,则转发到Selectpage
  71 + if ($this->request->request('keyField')) {
  72 + return $this->selectpage();
  73 + }
  74 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  75 + $total = $this->model
  76 + ->where($where)
  77 + ->order($sort, $order)
  78 + ->count();
  79 +
  80 + $list = $this->model
  81 + ->where($where)
  82 + ->order($sort, $order)
  83 + ->limit($offset, $limit)
  84 + ->select();
  85 +
  86 + $result = array("total" => $total, "rows" => $list);
  87 +
  88 + return json($result);
  89 + }
  90 + return $this->view->fetch('index');
  91 + }
  92 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 关联模型
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark 当使用到关联模型时需要重载index方法
  12 + */
  13 +class Relationmodel extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +
  23 + /**
  24 + * 查看
  25 + */
  26 + public function index()
  27 + {
  28 + $this->relationSearch = true;
  29 + $this->searchFields = "admin.username,id";
  30 + if ($this->request->isAjax()) {
  31 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  32 + $list = $this->model
  33 + ->with("admin")
  34 + ->where($where)
  35 + ->order($sort, $order)
  36 + ->paginate($limit);
  37 +
  38 + $result = array("total" => $list->total(), "rows" => $list->items());
  39 +
  40 + return json($result);
  41 + }
  42 + return $this->view->fetch();
  43 + }
  44 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 表格联动
  9 + * 点击左侧日志列表,右侧的表格数据会显示指定管理员的日志列表
  10 + * @icon fa fa-table
  11 + */
  12 +class Tablelink extends Backend
  13 +{
  14 + protected $model = null;
  15 + protected $noNeedRight = ['table1', 'table2'];
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +
  23 +
  24 + public function table1()
  25 + {
  26 + $this->model = model('Admin');
  27 + //设置过滤方法
  28 + $this->request->filter(['strip_tags']);
  29 + if ($this->request->isAjax()) {
  30 + //如果发送的来源是Selectpage,则转发到Selectpage
  31 + if ($this->request->request('keyField')) {
  32 + return $this->selectpage();
  33 + }
  34 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  35 + $total = $this->model
  36 + ->where($where)
  37 + ->field('id,username')
  38 + ->order($sort, $order)
  39 + ->count();
  40 +
  41 + $list = $this->model
  42 + ->where($where)
  43 + ->field('id,username')
  44 + ->order($sort, $order)
  45 + ->limit($offset, $limit)
  46 + ->select();
  47 +
  48 + $result = array("total" => $total, "rows" => $list);
  49 +
  50 + return json($result);
  51 + }
  52 + return $this->view->fetch('index');
  53 + }
  54 +
  55 + public function table2()
  56 + {
  57 + $this->model = model('AdminLog');
  58 + //设置过滤方法
  59 + $this->request->filter(['strip_tags']);
  60 + if ($this->request->isAjax()) {
  61 + //如果发送的来源是Selectpage,则转发到Selectpage
  62 + if ($this->request->request('keyField')) {
  63 + return $this->selectpage();
  64 + }
  65 + list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  66 + $total = $this->model
  67 + ->where($where)
  68 + ->order($sort, $order)
  69 + ->count();
  70 +
  71 + $list = $this->model
  72 + ->where($where)
  73 + ->order($sort, $order)
  74 + ->limit($offset, $limit)
  75 + ->select();
  76 +
  77 + $result = array("total" => $total, "rows" => $list);
  78 +
  79 + return json($result);
  80 + }
  81 + return $this->view->fetch('index');
  82 + }
  83 +}
  1 +<?php
  2 +
  3 +namespace app\admin\controller\example;
  4 +
  5 +use app\common\controller\Backend;
  6 +
  7 +/**
  8 + * 表格模板示例
  9 + *
  10 + * @icon fa fa-table
  11 + * @remark 可以通过使用表格模板将表格中的行渲染成一样的展现方式,基于此功能可以任意定制自己想要的展示列表
  12 + */
  13 +class Tabletemplate extends Backend
  14 +{
  15 + protected $model = null;
  16 +
  17 + public function _initialize()
  18 + {
  19 + parent::_initialize();
  20 + $this->model = model('AdminLog');
  21 + }
  22 +
  23 + /**
  24 + * 查看
  25 + */
  26 + public function index()
  27 + {
  28 + if ($this->request->isAjax()) {
  29 + list($where, $sort, $order, $offset, $limit) = $this->buildparams(null);
  30 + $total = $this->model
  31 + ->where($where)
  32 + ->order($sort, $order)
  33 + ->count();
  34 + $list = $this->model
  35 + ->where($where)
  36 + ->order($sort, $order)
  37 + ->limit($offset, $limit)
  38 + ->select();
  39 + $result = array("total" => $total, "rows" => $list);
  40 +
  41 + return json($result);
  42 + }
  43 + return $this->view->fetch();
  44 + }
  45 +
  46 + /**
  47 + * 详情
  48 + */
  49 + public function detail($ids)
  50 + {
  51 + $row = $this->model->get(['id' => $ids]);
  52 + if (!$row) {
  53 + $this->error(__('No Results were found'));
  54 + }
  55 + $this->view->assign("row", $row->toArray());
  56 + return $this->view->fetch();
  57 + }
  58 +}
  1 +<?php
  2 +
  3 +namespace app\admin\model;
  4 +
  5 +use think\Model;
  6 +
  7 +class Area extends Model
  8 +{
  9 +
  10 + // 开启自动写入时间戳字段
  11 + protected $autoWriteTimestamp = false;
  12 + // 定义时间戳字段名
  13 + protected $createTime = false;
  14 + protected $updateTime = false;
  15 +}
  1 +<table class="table table-striped">
  2 + <thead>
  3 + <tr>
  4 + <th>{:__('Title')}</th>
  5 + <th>{:__('Content')}</th>
  6 + </tr>
  7 + </thead>
  8 + <tbody>
  9 + {volist name="row" id="vo" }
  10 + <tr>
  11 + <td>{$key}</td>
  12 + <td style="word-break: break-all;">{$vo|htmlentities}</td>
  13 + </tr>
  14 + {/volist}
  15 + {if $Think.get.dialog}
  16 + <tr>
  17 + <td>回传数据</td>
  18 + <td>
  19 + <div class="input-group">
  20 + <input name="callback" class="form-control" value="test" />
  21 + <span class="input-group-btn"><a href="javascript:;" class="btn btn-success btn-callback" >回传数据</a></span>
  22 + </div>
  23 + </td>
  24 + </tr>
  25 + {/if}
  26 + </tbody>
  27 +</table>
  28 +<div class="hide layer-footer">
  29 + <label class="control-label col-xs-12 col-sm-2"></label>
  30 + <div class="col-xs-12 col-sm-8">
  31 + <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
  32 + </div>
  33 +</div>
  1 +<table class="table table-striped">
  2 + <tbody>
  3 + <tr><td>这里是编辑窗口</td></tr>
  4 + </tbody>
  5 +</table>
  6 +<div class="hide layer-footer">
  7 + <label class="control-label col-xs-12 col-sm-2"></label>
  8 + <div class="col-xs-12 col-sm-8">
  9 + <button type="reset" class="btn btn-primary btn-embossed btn-close" onclick="Layer.closeAll();">{:__('Close')}</button>
  10 + </div>
  11 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 +
  3 + <div class="panel-heading">
  4 + {:build_heading(null,FALSE)}
  5 + <ul class="nav nav-tabs nav-custom-condition">
  6 + <li class="active"><a href="#t-all" data-value="" data-toggle="tab">{:__('All')}</a></li>
  7 + <li class=""><a href="#t-1" data-value='1' data-toggle="tab">自定义搜索条件1</a></li>
  8 + <li class=""><a href="#t-2" data-value='2' data-toggle="tab">自定义搜索条件2</a></li>
  9 + </ul>
  10 + </div>
  11 +
  12 +
  13 + <div class="panel-body">
  14 + <div id="myTabContent" class="tab-content">
  15 + <div class="tab-pane fade active in" id="one">
  16 + <div class="widget-body no-padding">
  17 + <div id="toolbar" class="toolbar">
  18 + {:build_toolbar('refresh,delete')}
  19 + <a class="btn btn-info btn-disabled disabled btn-selected" href="javascript:;"><i class="fa fa-leaf"></i> 获取选中项</a>
  20 + <div class="dropdown btn-group">
  21 + <a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> <?= __('More') ?></a>
  22 + <ul class="dropdown-menu text-left" role="menu">
  23 + <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>
  24 + <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>
  25 + </ul>
  26 + </div>
  27 + <a class="btn btn-success btn-singlesearch" href="javascript:;"><i class="fa fa-user"></i> 自定义搜索</a>
  28 + <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>
  29 + <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>
  30 + <a href="javascript:;" class="btn btn-default" style="font-size:14px;color:dodgerblue;">
  31 + <span class="extend">
  32 + 金额:<span id="money">0</span>
  33 + 单价:<span id="price">0</span>
  34 + </span>
  35 + </a>
  36 + </div>
  37 + <table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%">
  38 +
  39 + </table>
  40 +
  41 + </div>
  42 + </div>
  43 +
  44 + </div>
  45 + </div>
  46 +</div>
  47 +<script id="categorytpl" type="text/html">
  48 + <div class="row">
  49 + <div class="col-xs-12">
  50 + <div class="form-inline" data-toggle="cxselect" data-selects="group,admin">
  51 + <select class="group form-control" name="group" data-url="example/bootstraptable/cxselect?type=group"></select>
  52 + <select class="admin form-control" name="admin_id" data-url="example/bootstraptable/cxselect?type=admin" data-query-name="group_id"></select>
  53 + <input type="hidden" class="operate" data-name="admin_id" value="=" />
  54 + </div>
  55 + </div>
  56 + </div>
  57 +</script>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar('refresh,delete')}
  10 + </div>
  11 + <table id="table" class="table table-striped table-bordered table-hover" width="100%">
  12 +
  13 + </table>
  14 +
  15 +
  16 + </div>
  17 + </div>
  18 +
  19 + </div>
  20 + </div>
  21 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar('refresh,delete')}
  10 + </div>
  11 + <table id="table" class="table table-striped table-bordered table-hover" width="100%">
  12 +
  13 + </table>
  14 +
  15 +
  16 + </div>
  17 + </div>
  18 +
  19 + </div>
  20 + </div>
  21 +</div>
  1 +<style>
  2 + .upload-image {
  3 + background: url('__CDN__/assets/addons/example/img/plus.png') no-repeat center center;
  4 + background-size: 30px 30px;
  5 + height: 30px;
  6 + width: 30px;
  7 + border: 1px solid #ccc;
  8 + }
  9 +
  10 + textarea.form-control {
  11 + background: #eee;
  12 + }
  13 +</style>
  14 +<div class="row">
  15 + <div class="col-md-6">
  16 + <div class="box box-success">
  17 + <div class="panel-heading">
  18 + {:__('自定义图片描述')}
  19 + </div>
  20 + <div class="panel-body">
  21 + <div class="alert alert-success-light">
  22 + <b>温馨提示</b><br>
  23 + 默认我们的多图是没有图片描述的,如果我们需要自定义描述,可以使用以下的自定义功能<br>
  24 + 特别注意的是图片的url和描述是分开储存的,也就是说图片一个字段,描述一个字段,你在前台使用时需要自己匹配映射关系<br>
  25 + <b>下面的演示textarea为了便于调试,设置为可见的,实际使用中应该添加个hidden的class进行隐藏</b>
  26 + </div>
  27 + <form id="first-form" role="form" data-toggle="validator" method="POST" action="">
  28 + <div class="form-group row">
  29 + <label class="control-label col-xs-12">{:__('一维数组示例')}:</label>
  30 + <div class="col-xs-12">
  31 + <div class="input-group">
  32 + <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">
  33 + <div class="input-group-addon no-border no-padding">
  34 + <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>
  35 + <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>
  36 + </div>
  37 + <span class="msg-box n-right" for="c-files"></span>
  38 + </div>
  39 +
  40 + <!--ul需要添加 data-template和data-name属性,并一一对应且唯一 -->
  41 + <ul class="row list-inline plupload-preview" id="p-files" data-template="introtpl" data-name="row[intro]"></ul>
  42 +
  43 + <!--请注意 ul和textarea间不能存在其它任何元素,实际开发中textarea应该添加个hidden进行隐藏-->
  44 + <textarea name="row[intro]" class="form-control" style="margin-top:5px;">["简洁响应式博客","CMS内容管理系统","在线投票系统"]</textarea>
  45 +
  46 + <!--这里自定义图片预览的模板 开始-->
  47 + <script type="text/html" id="introtpl">
  48 + <li class="col-xs-3">
  49 + <a href="<%=fullurl%>" data-url="<%=url%>" target="_blank" class="thumbnail">
  50 + <img src="<%=fullurl%>" class="img-responsive">
  51 + </a>
  52 + <input type="text" name="row[intro][<%=index%>]" class="form-control mb-1" placeholder="请输入文件描述" value="<%=value?value:''%>"/>
  53 + <a href="javascript:;" class="btn btn-danger btn-xs btn-trash"><i class="fa fa-trash"></i></a>
  54 + </li>
  55 + </script>
  56 + <!--这里自定义图片预览的模板 结束-->
  57 + </div>
  58 + </div>
  59 + <div class="form-group row">
  60 + <label class="control-label col-xs-12">{:__('二维数组示例')}:</label>
  61 + <div class="col-xs-12">
  62 + <div class="input-group">
  63 + <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">
  64 + <div class="input-group-addon no-border no-padding">
  65 + <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>
  66 + <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>
  67 + </div>
  68 + <span class="msg-box n-right" for="c-images"></span>
  69 + </div>
  70 +
  71 + <!--ul需要添加 data-template和data-name属性,并一一对应且唯一 -->
  72 + <ul class="row list-inline plupload-preview" id="p-images" data-template="desctpl" data-name="row[desc]"></ul>
  73 +
  74 + <!--请注意 ul和textarea间不能存在其它任何元素,实际开发中textarea应该添加个hidden进行隐藏-->
  75 + <textarea name="row[desc]" class="form-control" style="margin-top:5px;">[{"info":"开发者示例插件","size":"1M"},{"info":"又拍云储存整合","size":"2M"},{"info":"阿里OSS云储存","size":"1M"}]</textarea>
  76 +
  77 + <!--这里自定义图片预览的模板 开始-->
  78 + <script type="text/html" id="desctpl">
  79 + <li class="col-xs-3">
  80 + <a href="<%=fullurl%>" data-url="<%=url%>" target="_blank" class="thumbnail">
  81 + <img src="<%=fullurl%>" class="img-responsive">
  82 + </a>
  83 + <input type="text" name="row[desc][<%=index%>][info]" class="form-control mb-1" placeholder="请输入插件描述" value="<%=value?value['info']:''%>"/>
  84 + <input type="text" name="row[desc][<%=index%>][size]" class="form-control mb-1" placeholder="请输入插件大小" value="<%=value?value['size']:''%>"/>
  85 + <a href="javascript:;" class="btn btn-danger btn-xs btn-trash"><i class="fa fa-trash"></i></a>
  86 + </li>
  87 + </script>
  88 + <!--这里自定义图片预览的模板 结束-->
  89 + </div>
  90 + </div>
  91 + <div class="form-group row">
  92 + <label class="control-label col-xs-12"></label>
  93 + <div class="col-xs-12">
  94 + <button type="submit" class="btn btn-success btn-embossed">{:__('OK')}</button>
  95 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  96 + </div>
  97 + </div>
  98 +
  99 + </form>
  100 + </div>
  101 + </div>
  102 +
  103 + </div>
  104 + <div class="col-md-6">
  105 + <div class="box box-info">
  106 + <div class="panel-heading">
  107 + {:__('自定义Fieldlist示例')}
  108 + </div>
  109 + <div class="panel-body">
  110 + <div class="alert alert-danger-light">
  111 + <b>温馨提示</b><br>
  112 + 默认的fieldlist为键值形式,如果需要一维数组或二维数组,可使用下面的自定义模板来实现<br>
  113 + 默认追加的元素是没有进行事件绑定的,我们需要监听btn-append这个按钮的fa.event.appendfieldlist事件<br>
  114 + <b>下面的演示textarea为了便于调试,设置为可见的,实际使用中应该添加个hidden的class进行隐藏</b>
  115 + </div>
  116 + <form id="second-form" role="form" data-toggle="validator" method="POST" action="">
  117 + <div class="form-group row">
  118 + <label class="control-label col-xs-12">
  119 + {:__('Fieldlist一维示例')}:
  120 + <span style="font-weight: normal"><font color="red">只支持FastAdmin1.5.0+</font> {if version_compare($Think.config.fastadmin.version, '1.5.0')<0}<span class="label label-danger">你当前FastAdmin版本不支持</span>{/if}</span>
  121 + </label>
  122 + <div class="col-xs-12">
  123 + <dl class="list-unstyled fieldlist" data-template="singletpl" data-name="row[single]" id="single-table">
  124 + <dd>
  125 + <ins>{:__('标题')}</ins>
  126 + </dd>
  127 + <dd>
  128 + <ins><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></ins>
  129 + </dd>
  130 + </dl>
  131 +
  132 + <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
  133 + <textarea name="row[single]" class="form-control" cols="30" rows="5">["你好","世界"]</textarea>
  134 + <script id="singletpl" type="text/html">
  135 + <dd class="form-inline">
  136 + <ins><input type="text" name="<%=name%>[<%=index%>][value]" class="form-control" size="15" value="<%=row%>" placeholder="标题"/></ins>
  137 + <ins>
  138 + <!--下面的两个按钮务必保留-->
  139 + <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
  140 + <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
  141 + </ins>
  142 + </dd>
  143 + </script>
  144 + </div>
  145 + </div>
  146 + <div class="form-group row">
  147 + <label class="control-label col-xs-12">{:__('Fieldlist一维键值示例')}:</label>
  148 + <div class="col-xs-12">
  149 + <dl class="list-unstyled fieldlist" data-name="row[keyvalue]" id="keyvalue-table">
  150 + <dd>
  151 + <ins>{:__('标题')}</ins>
  152 + </dd>
  153 + <dd>
  154 + <ins><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></ins>
  155 + </dd>
  156 + </dl>
  157 +
  158 + <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
  159 + <textarea name="row[keyvalue]" class="form-control" cols="30" rows="5">{"2":"Hello", "1":"World"}</textarea>
  160 + </div>
  161 + </div>
  162 + <div class="form-group row">
  163 + <label class="control-label col-xs-12">{:__('Fieldlist二维数组示例')}:</label>
  164 + <div class="col-xs-12">
  165 + <table class="table fieldlist" data-template="basictpl" data-name="row[basic]" id="first-table">
  166 + <tr>
  167 + <td>{:__('标题')}</td>
  168 + <td>{:__('介绍')}</td>
  169 + <td>{:__('大小')}</td>
  170 + <td>{:__('状态')}</td>
  171 + <td width="100"></td>
  172 + </tr>
  173 + <tr>
  174 + <td colspan="5"><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></td>
  175 + </tr>
  176 + </table>
  177 +
  178 + <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
  179 + <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>
  180 + <script id="basictpl" type="text/html">
  181 + <tr class="form-inline">
  182 + <td><input type="text" name="<%=name%>[<%=index%>][title]" class="form-control" size="15" value="<%=row.title||'fast'%>" placeholder="标题"/></td>
  183 + <td><input type="text" name="<%=name%>[<%=index%>][intro]" class="form-control" size="15" value="<%=row.intro%>" placeholder="介绍"/></td>
  184 + <td><input type="text" name="<%=name%>[<%=index%>][size]" class="form-control" style="width:50px" value="<%=row.size%>" placeholder="大小"/></td>
  185 + <td>
  186 + <input type="hidden" name="<%=name%>[<%=index%>][state]" id="c-state-<%=index%>" class="form-control" style="width:50px" value="<%=row.state%>" placeholder="状态"/>
  187 + <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-state-<%=index%>" data-yes="1" data-no="0">
  188 + <i class="fa fa-toggle-on text-success <%if(row.state!=1){%>fa-flip-horizontal text-gray<%}%> fa-2x"></i>
  189 + </a>
  190 + </td>
  191 + <td>
  192 + <!--下面的两个按钮务必保留-->
  193 + <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
  194 + <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
  195 + </td>
  196 + </tr>
  197 + </script>
  198 + </div>
  199 + </div>
  200 + <div class="form-group row">
  201 + <label class="control-label col-xs-12">{:__('Fieldlist绑定事件示例')}:</label>
  202 + <div class="col-xs-12">
  203 + <table class="table fieldlist" data-template="eventtpl" data-name="row[event]" id="second-table">
  204 + <tr>
  205 + <td>{:__('管理员')}</td>
  206 + <td>{:__('图片')}</td>
  207 + <td>{:__('登录时间')}</td>
  208 + <td width="100"></td>
  209 + </tr>
  210 + <tr>
  211 + <td colspan="4"><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></td>
  212 + </tr>
  213 + </table>
  214 +
  215 + <!--请注意实际开发中textarea应该添加个hidden进行隐藏-->
  216 + <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>
  217 + <script id="eventtpl" type="text/html">
  218 + <tr class="form-inline">
  219 + <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>
  220 + <td>
  221 + <input type="hidden" name="<%=name%>[<%=index%>][image]" id="c-image-<%=index%>" value="<%=row.image%>">
  222 + <!--@formatter:off-->
  223 + <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>
  224 + <!--@formatter:on-->
  225 + </td>
  226 + <td><input type="text" name="<%=name%>[<%=index%>][time]" class="form-control datetimepicker" style="width:120px" value="<%=row.time%>" placeholder="时间"/></td>
  227 + <td>
  228 + <!--下面的两个按钮务必保留-->
  229 + <span class="btn btn-sm btn-danger btn-remove"><i class="fa fa-times"></i></span>
  230 + <span class="btn btn-sm btn-primary btn-dragsort"><i class="fa fa-arrows"></i></span>
  231 + </td>
  232 + </tr>
  233 + </script>
  234 + </div>
  235 + </div>
  236 + <div class="form-group row">
  237 + <label class="control-label col-xs-12"></label>
  238 + <div class="col-xs-12">
  239 + <button type="submit" class="btn btn-success btn-embossed">{:__('OK')}</button>
  240 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  241 + </div>
  242 + </div>
  243 +
  244 + </form>
  245 + </div>
  246 + </div>
  247 +
  248 + </div>
  249 + <div class="col-md-6">
  250 + <div class="box box-warning">
  251 + <div class="panel-heading">
  252 + 自动完成+标签输入示例,<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}
  253 + </div>
  254 + <div class="panel-body">
  255 + <div class="alert alert-danger-light">
  256 + <b>温馨提示</b><br>
  257 + </div>
  258 + <form id="third-form" role="form" data-toggle="validator" method="POST" action="">
  259 +
  260 + <div class="form-group row">
  261 + <label class="control-label col-xs-12">自动完成</label>
  262 + <div class="col-xs-12">
  263 + <input type="text" class="form-control" data-role="autocomplete" data-autocomplete-options='{"url":"example/customform/get_title_list", "minChars":1}'/>
  264 + </div>
  265 + </div>
  266 + <div class="form-group row">
  267 + <label class="control-label col-xs-12">标签输入 <span class="text-muted small">输入后<code>回车</code><code>,</code>确认</span></label>
  268 + <div class="col-xs-12">
  269 + <input type="text" class="form-control" data-role="tagsinput"/>
  270 + </div>
  271 + </div>
  272 + <div class="form-group row">
  273 + <label class="control-label col-xs-12">自动完成+标签输入</label>
  274 + <div class="col-xs-12">
  275 + <input type="text" class="form-control" data-role="tagsinput" data-tagsinput-options='{"minChars":1, "autocomplete":{"url":"example/customform/get_title_list"}}'/>
  276 + </div>
  277 + </div>
  278 + </form>
  279 + </div>
  280 + </div>
  281 + </div>
  282 + <div class="col-md-6">
  283 + <div class="box box-danger">
  284 + <div class="panel-heading">
  285 + 动态显示,<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}
  286 + </div>
  287 + <div class="panel-body">
  288 + <form id="fourth-form" role="form" data-toggle="validator" method="POST" action="">
  289 +
  290 + <div class="form-group row">
  291 + <label class="control-label col-xs-12">常规使用</label>
  292 + <div class="col-xs-12">
  293 + <input type="radio" name="row[type]" value="value1" checked/> 类型1
  294 + <input type="radio" name="row[type]" value="value2"/> 类型2
  295 + <div data-favisible="type=value1" class="p-3">显示内容1</div>
  296 + <div data-favisible="type=value2" class="p-3">显示内容2</div>
  297 + </div>
  298 + </div>
  299 + <hr>
  300 + <div class="form-group row">
  301 + <label class="control-label col-xs-12">使用开关组件</label>
  302 + <div class="col-xs-12">
  303 +
  304 + <input id="c-switch" name="row[switch]" type="hidden" value="0">
  305 + <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-switch" data-yes="1" data-no="0">
  306 + <i class="fa fa-toggle-on text-success fa-flip-horizontal text-gray fa-2x"></i>
  307 + </a>
  308 +
  309 + <div data-favisible="switch=1" class="p-3">显示内容隐藏的内容</div>
  310 + </div>
  311 + </div>
  312 + <hr>
  313 + <div class="form-group row">
  314 + <label class="control-label col-xs-12">组件嵌套</label>
  315 + <div class="col-xs-12">
  316 + <input type="radio" name="row[mode]" value="value1"/> 模式1
  317 + <input type="radio" name="row[mode]" value="value2"/> 模式2
  318 + <div data-favisible="mode=value1" class="p-3">
  319 + <h4>显示内容1</h4>
  320 + <input id="c-switch1" name="row[switch1]" type="hidden" value="0">
  321 + <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-switch1" data-yes="1" data-no="0">
  322 + <i class="fa fa-toggle-on text-success fa-flip-horizontal text-gray fa-2x"></i>
  323 + </a>
  324 +
  325 + <div data-favisible="switch1=1" class="p-3">显示内容隐藏的内容1</div>
  326 + </div>
  327 + <div data-favisible="mode=value2" class="p-3">
  328 + <h4>显示内容2</h4>
  329 + <input id="c-switch2" name="row[switch2]" type="hidden" value="0">
  330 + <a href="javascript:;" data-toggle="switcher" class="btn-switcher" data-input-id="c-switch2" data-yes="1" data-no="0">
  331 + <i class="fa fa-toggle-on text-success fa-flip-horizontal text-gray fa-2x"></i>
  332 + </a>
  333 +
  334 + <div data-favisible="switch2=1" class="p-3">显示内容隐藏的内容2</div>
  335 + </div>
  336 + </div>
  337 + </div>
  338 + <hr>
  339 + <div class="form-group row">
  340 + <label class="control-label col-xs-12">使用内容判断 <span class="text-muted small">只有输入指定的内容才显示</span></label>
  341 + <div class="col-xs-12">
  342 + <input type="text" class="form-control" name="row[title]" placeholder="请输入abc三个字母">
  343 + <div data-favisible="title=abc" class="p-3">显示内容隐藏的内容</div>
  344 + </div>
  345 + </div>
  346 + </form>
  347 + </div>
  348 + </div>
  349 + </div>
  350 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar('refresh')}
  10 + </div>
  11 + <table id="table" class="table table-striped table-bordered table-hover" width="100%">
  12 +
  13 + </table>
  14 +
  15 + </div>
  16 + </div>
  17 +
  18 + </div>
  19 + </div>
  20 +</div>
  21 +
  22 +<script id="customformtpl" type="text/html">
  23 + <!--form表单必须添加form-commsearch这个类-->
  24 + <form action="" class="form-commonsearch">
  25 + <div style="border-radius:2px;margin-bottom:10px;background:#f5f5f5;padding:15px 20px;">
  26 + <h4>自定义搜索表单</h4>
  27 + <hr>
  28 + <div class="row">
  29 + <div class="col-xs-12 col-sm-6 col-md-3">
  30 + <div class="form-group">
  31 + <label class="control-label">ID</label>
  32 + <!--显式的operate操作符-->
  33 + <div class="input-group">
  34 + <div class="input-group-btn">
  35 + <select class="form-control operate" data-name="id" style="width:60px;">
  36 + <option value="=" selected>等于</option>
  37 + <option value=">">大于</option>
  38 + <option value="<">小于</option>
  39 + </select>
  40 + </div>
  41 + <input class="form-control" type="text" name="id" placeholder="" value=""/>
  42 + </div>
  43 + </div>
  44 + </div>
  45 + <div class="col-xs-12 col-sm-6 col-md-3">
  46 + <div class="form-group">
  47 + <label class="control-label">标题</label>
  48 + <!--隐式的operate操作符,必须携带一个classoperate隐藏的文本框,且它的data-name="字段",值为操作符-->
  49 + <input class="operate" type="hidden" data-name="title" value="="/>
  50 + <div>
  51 + <input class="form-control" type="text" name="title" placeholder="请输入查找的标题" value=""/>
  52 + </div>
  53 + </div>
  54 + </div>
  55 + <div class="col-xs-12 col-sm-6 col-md-3">
  56 + <div class="form-group">
  57 + <label class="control-label">管理员ID</label>
  58 + <div class="row" data-toggle="cxselect" data-selects="group,admin">
  59 + <div class="col-xs-6">
  60 + <select class="group form-control" name="group"
  61 + data-url="example/bootstraptable/cxselect?type=group"></select>
  62 + </div>
  63 + <div class="col-xs-6">
  64 + <select class="admin form-control" name="admin_id"
  65 + data-url="example/bootstraptable/cxselect?type=admin"
  66 + data-query-name="group_id"></select>
  67 + </div>
  68 + <input type="hidden" class="operate" data-name="admin_id" value="="/>
  69 + </div>
  70 + </div>
  71 + </div>
  72 + <div class="col-xs-12 col-sm-6 col-md-3">
  73 + <div class="form-group">
  74 + <label class="control-label">用户名</label>
  75 + <input type="hidden" class="operate" data-name="username" value="="/>
  76 + <div>
  77 + <input id="c-category_id" data-source="auth/admin/index" data-primary-key="username"
  78 + data-field="username" class="form-control selectpage" name="username" type="text"
  79 + value="" style="display:block;">
  80 + </div>
  81 + </div>
  82 + </div>
  83 +
  84 + <div class="col-xs-12 col-sm-6 col-md-3" style="min-height:68px;">
  85 + <!--这里添加68px是为了避免刷新时出现元素错位闪屏-->
  86 + <div class="form-group">
  87 + <label class="control-label">IP</label>
  88 + <input type="hidden" class="operate" data-name="ip" value="in"/>
  89 + <div>
  90 + <!--select一个固定的高度-->
  91 + <!--@formatter:off-->
  92 + <select id="c-flag" class="form-control selectpicker" multiple name="ip" style="height:31px;">
  93 + {foreach name="ipList" item="vo"}
  94 + <option value="{$key}" {in name="key" value="" }selected{/in}>{$vo}</option>
  95 + {/foreach}
  96 + </select>
  97 + <!--@formatter:on-->
  98 + </div>
  99 + </div>
  100 + </div>
  101 + <div class="col-xs-12 col-sm-6 col-md-3">
  102 + <div class="form-group">
  103 + <label class="control-label">创建时间</label>
  104 + <input type="hidden" class="operate" data-name="createtime" value="RANGE"/>
  105 + <div>
  106 + <input type="text" class="form-control datetimerange" name="createtime" value=""/>
  107 + </div>
  108 + </div>
  109 + </div>
  110 + <div class="col-xs-12 col-sm-6 col-md-3">
  111 + <div class="form-group">
  112 + <label class="control-label"></label>
  113 + <div class="row">
  114 + <div class="col-xs-6">
  115 + <input type="submit" class="btn btn-success btn-block" value="提交"/>
  116 + </div>
  117 + <div class="col-xs-6">
  118 + <input type="reset" class="btn btn-primary btn-block" value="重置"/>
  119 + </div>
  120 + </div>
  121 + </div>
  122 + </div>
  123 + </div>
  124 + </div>
  125 + </form>
  126 +</script>
  1 +<style>#cxselect-example textarea{margin:10px 0;}</style>
  2 +<div class="panel panel-default panel-intro">
  3 + {:build_heading()}
  4 +
  5 + <div class="panel-body">
  6 + <div id="myTabContent" class="tab-content">
  7 + <div class="tab-pane fade active in" id="one">
  8 + <div class="widget-body no-padding" id="cxselect-example">
  9 + <form id="cxselectform" action="">
  10 + <div class="row">
  11 + <div class="col-md-6">
  12 +
  13 + <div class="panel panel-default">
  14 + <div class="panel-heading"><b>省市区联动</b>(通过AJAX读取数据)</div>
  15 + <div class="panel-body">
  16 + <div class="row">
  17 + <div class="col-xs-9">
  18 + <div class="form-inline" data-toggle="cxselect" data-selects="province,city,area">
  19 + <select class="province form-control" name="province" data-url="ajax/area"></select>
  20 + <select class="city form-control" name="city" data-url="ajax/area"></select>
  21 + <select class="area form-control" name="area" data-url="ajax/area"></select>
  22 + </div>
  23 + </div>
  24 + <div class="col-xs-3 text-right">
  25 + <h6><label class="label label-primary"><i class="fa fa-pencil"></i> 增加</label></h6>
  26 + </div>
  27 + <div class="col-xs-12">
  28 + <textarea class="form-control" rows="8">
  29 + </textarea>
  30 + </div>
  31 + </div>
  32 + <div class="row">
  33 + <div class="col-xs-9">
  34 + <div class="form-inline" data-toggle="cxselect" data-selects="province,city,area">
  35 + <select class="province form-control" name="province" data-url="ajax/area">
  36 + <option value="1964" selected>广东省</option>
  37 + </select>
  38 + <select class="city form-control" name="city" data-url="ajax/area">
  39 + <option value="1988" selected>深圳市</option>
  40 + </select>
  41 + <select class="area form-control" name="area" data-url="ajax/area">
  42 + <option value="1991" selected>南山区</option>
  43 + </select>
  44 + </div>
  45 + </div>
  46 + <div class="col-xs-3 text-right">
  47 + <h6><label class="label label-success"><i class="fa fa-edit"></i> 修改</label></h6>
  48 + </div>
  49 + <div class="col-xs-12">
  50 + <textarea class="form-control" rows="8">
  51 + </textarea>
  52 + </div>
  53 + </div>
  54 + </div>
  55 +
  56 + </div>
  57 + </div>
  58 + <div class="col-md-6">
  59 + <div class="panel panel-default">
  60 + <div class="panel-heading"><b>类别联动</b>(Ajax读取数据)</div>
  61 + <div class="panel-body">
  62 + <div class="row">
  63 + <div class="col-xs-9">
  64 + <div class="form-inline" data-toggle="cxselect" data-selects="first,second">
  65 + <select class="first form-control" name="first" data-url="ajax/category?type=page&pid=5"></select>
  66 + <select class="second form-control" name="second" data-url="ajax/category" data-query-name="pid"></select>
  67 + </div>
  68 + </div>
  69 + <div class="col-xs-3 text-right">
  70 + <h6><label class="label label-primary"><i class="fa fa-pencil"></i> 增加</label></h6>
  71 + </div>
  72 + <div class="col-xs-12">
  73 + <textarea class="form-control" rows="8">
  74 + </textarea>
  75 + </div>
  76 + </div>
  77 + <div class="row">
  78 + <div class="col-xs-9">
  79 + <div class="form-inline" data-toggle="cxselect" data-selects="first,second">
  80 + <select class="first form-control" name="first" data-url="ajax/category?type=page&pid=5">
  81 + <option value="6" selected>网站建站</option>
  82 + </select>
  83 + <select class="second form-control" name="second" data-url="ajax/category" data-query-name="pid">
  84 + <option value="9" selected>移动端</option>
  85 + </select>
  86 + </div>
  87 + </div>
  88 + <div class="col-xs-3 text-right">
  89 + <h6><label class="label label-success"><i class="fa fa-edit"></i> 修改</label></h6>
  90 + </div>
  91 + <div class="col-xs-12">
  92 + <textarea class="form-control" rows="8">
  93 + </textarea>
  94 + </div>
  95 + </div>
  96 +
  97 + </div>
  98 + </div>
  99 + </div>
  100 + <div class="col-md-6">
  101 + <div class="panel panel-default">
  102 + <div class="panel-heading"><b>省市区联动</b>(通过JSON渲染数据)</div>
  103 + <div class="panel-body">
  104 + <div class="row">
  105 + <div class="col-xs-9">
  106 + <!--由于在初始化中修改了默认值,所以这里需要修改-jsonSpace/jsonValue/jsonName的值-->
  107 + <div class="form-inline" data-toggle="cxselect" data-url="__CDN__/assets/libs/fastadmin-cxselect/js/cityData.min.json"
  108 + data-selects="province,city,area" data-json-space="" data-json-name="n" data-json-value="">
  109 + <select class="province form-control" name="province"></select>
  110 + <select class="city form-control" name="city"></select>
  111 + <select class="area form-control" name="area"></select>
  112 + </div>
  113 + </div>
  114 + <div class="col-xs-3 text-right">
  115 + <h6><label class="label label-primary"><i class="fa fa-pencil"></i> 增加</label></h6>
  116 + </div>
  117 + <div class="col-xs-12">
  118 + <textarea class="form-control" rows="8">
  119 + </textarea>
  120 + </div>
  121 + </div>
  122 + <div class="row">
  123 + <div class="col-xs-9">
  124 + <!--由于在初始化中修改了默认值,所以这里需要修改-jsonSpace/jsonValue/jsonName的值-->
  125 + <div class="form-inline" data-toggle="cxselect" data-url="__CDN__/assets/libs/fastadmin-cxselect/js/cityData.min.json"
  126 + data-selects="province,city,area" data-json-space="" data-json-name="n" data-json-value="">
  127 + <select class="province form-control" data-first-title="选择省">
  128 + <option value="">请选择</option>
  129 + <option value="浙江省" selected>浙江省</option>
  130 + </select>
  131 + <select class="city form-control" data-first-title="选择市">
  132 + <option value="">请选择</option>
  133 + <option value="杭州市" selected>杭州市</option>
  134 + </select>
  135 + <select class="area form-control" data-first-title="选择地区">
  136 + <option value="">请选择</option>
  137 + <option value="西湖区" selected>西湖区</option>
  138 + </select>
  139 + </div>
  140 + </div>
  141 + <div class="col-xs-3 text-right">
  142 + <h6><label class="label label-success"><i class="fa fa-edit"></i> 修改</label></h6>
  143 + </div>
  144 + <div class="col-xs-12">
  145 + <textarea class="form-control" rows="8">
  146 + </textarea>
  147 + </div>
  148 + </div>
  149 + </div>
  150 +
  151 + </div>
  152 + </div>
  153 + </div>
  154 + </form>
  155 + </div>
  156 + </div>
  157 +
  158 + </div>
  159 + </div>
  160 +</div>
  1 +<style>
  2 + .tab-content > .chart {
  3 + padding: 10px;
  4 + }
  5 +</style>
  6 +<div class="row">
  7 + <div class="col-lg-3 col-xs-6">
  8 + <!-- small box -->
  9 + <div class="small-box bg-aqua">
  10 + <div class="inner">
  11 + <h3>150</h3>
  12 +
  13 + <p>今日订单</p>
  14 + </div>
  15 + <div class="icon">
  16 + <i class="fa fa-shopping-cart"></i>
  17 + </div>
  18 + <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
  19 + </div>
  20 + </div>
  21 + <!-- ./col -->
  22 + <div class="col-lg-3 col-xs-6">
  23 + <!-- small box -->
  24 + <div class="small-box bg-green">
  25 + <div class="inner">
  26 + <h3>53<sup style="font-size: 20px">%</sup></h3>
  27 +
  28 + <p>同比增长率</p>
  29 + </div>
  30 + <div class="icon">
  31 + <i class="fa fa-area-chart"></i>
  32 + </div>
  33 + <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
  34 + </div>
  35 + </div>
  36 + <!-- ./col -->
  37 + <div class="col-lg-3 col-xs-6">
  38 + <!-- small box -->
  39 + <div class="small-box bg-yellow">
  40 + <div class="inner">
  41 + <h3>44</h3>
  42 +
  43 + <p>今日注册用户数</p>
  44 + </div>
  45 + <div class="icon">
  46 + <i class="fa fa-users"></i>
  47 + </div>
  48 + <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
  49 + </div>
  50 + </div>
  51 + <!-- ./col -->
  52 + <div class="col-lg-3 col-xs-6">
  53 + <!-- small box -->
  54 + <div class="small-box bg-red">
  55 + <div class="inner">
  56 + <h3>65</h3>
  57 +
  58 + <p>唯一访客用户</p>
  59 + </div>
  60 + <div class="icon">
  61 + <i class="fa fa-user"></i>
  62 + </div>
  63 + <a href="#" class="small-box-footer">更多 <i class="fa fa-arrow-circle-right"></i></a>
  64 + </div>
  65 + </div>
  66 + <!-- ./col -->
  67 +</div>
  68 +<!-- /.row -->
  69 +<!-- Main row -->
  70 +<div class="row" style="margin-bottom:5px;">
  71 + <!-- Left col -->
  72 + <section class="col-lg-7 connectedSortable">
  73 + <!-- Custom tabs (Charts with tabs)-->
  74 + <div class="nav-tabs-custom charts-custom">
  75 + <!-- Tabs within a box -->
  76 + <ul class="nav nav-tabs pull-right">
  77 + <li class="active"><a href="#line-chart" data-toggle="tab">折线图</a></li>
  78 + <li><a href="#area-chart" data-toggle="tab">区域图</a></li>
  79 + <li class="pull-left header"><i class="fa fa-inbox"></i> 销售趋势</li>
  80 + </ul>
  81 + <div class="tab-content no-padding">
  82 + <!-- Morris chart - Sales -->
  83 + <div class="chart tab-pane active" id="line-chart" style="position: relative; height: 300px;"></div>
  84 + <div class="chart tab-pane" id="area-chart" style="position: relative; height: 300px;"></div>
  85 + </div>
  86 + </div>
  87 + <div class="nav-tabs-custom charts-custom">
  88 + <!-- Tabs within a box -->
  89 + <ul class="nav nav-tabs pull-right">
  90 + <li class="active"><a href="#pie-chart" data-toggle="tab">饼图</a></li>
  91 + <li><a href="#bar-chart" data-toggle="tab">柱状图</a></li>
  92 + <li class="pull-left header"><i class="fa fa-inbox"></i> 访问记录</li>
  93 + </ul>
  94 + <div class="tab-content no-padding">
  95 + <!-- Morris chart - Sales -->
  96 + <div class="chart tab-pane active" id="pie-chart" style="position: relative; height: 300px;"></div>
  97 + <div class="chart tab-pane" id="bar-chart" style="position: relative; height: 300px;"></div>
  98 + </div>
  99 + </div>
  100 + <!-- /.nav-tabs-custom -->
  101 +
  102 + </section>
  103 + <!-- /.Left col -->
  104 + <section class="col-lg-5 connectedSortable">
  105 +
  106 + <!-- Map box -->
  107 + <div class="box box-solid bg-light-blue-gradient">
  108 + <div class="box-header">
  109 + <!-- tools box -->
  110 + <div class="pull-right box-tools">
  111 + </div>
  112 + <!-- /. tools -->
  113 +
  114 + <i class="fa fa-map-marker"></i>
  115 +
  116 + <h3 class="box-title">
  117 + 访客分布
  118 + </h3>
  119 + </div>
  120 + <div class="box-body">
  121 + <div id="simplebar-chart" style="height: 250px; width: 100%;"></div>
  122 + </div>
  123 + <!-- /.box-body-->
  124 + <div class="box-footer no-border">
  125 + <div class="row">
  126 + <div class="col-xs-12 text-center">
  127 + <div class="knob-label">统计最近一周访客的记录</div>
  128 + </div>
  129 + <!-- ./col -->
  130 + </div>
  131 + <!-- /.row -->
  132 + </div>
  133 + </div>
  134 + <!-- /.box -->
  135 +
  136 + <!-- solid sales graph -->
  137 + <div class="box box-solid bg-teal-gradient">
  138 + <div class="box-header">
  139 + <i class="fa fa-th"></i>
  140 +
  141 + <h3 class="box-title">订单趋势</h3>
  142 +
  143 + <div class="box-tools pull-right">
  144 + </div>
  145 + </div>
  146 + <div class="box-body border-radius-none">
  147 + <div class="chart" id="smoothline-chart" style="height: 250px;"></div>
  148 + </div>
  149 + <!-- /.box-body-->
  150 + <div class="box-footer no-border">
  151 + <div class="row">
  152 + <div class="col-xs-12 text-center">
  153 + <div class="knob-label">统计最近一周订单的趋势</div>
  154 + </div>
  155 + <!-- ./col -->
  156 + </div>
  157 + <!-- /.row -->
  158 + </div>
  159 + </div>
  160 + <!-- /.box -->
  161 +
  162 + </section>
  163 + <!-- right col -->
  164 +</div>
  165 +<!-- /.row (main row) -->
  1 +<div class="panel panel-default panel-intro">
  2 + <div class="panel-heading">
  3 + <div class="panel-lead"><em>多表格(Multitable)</em>用于展示在一个页面展示多个表格数据,并且每次切换时刷新</div>
  4 + <ul class="nav nav-tabs">
  5 + <li class="active"><a href="#first" data-toggle="tab">表格1</a></li>
  6 + <li><a href="#second" data-toggle="tab">表格2</a></li>
  7 + </ul>
  8 + </div>
  9 + <div class="panel-body">
  10 + <div id="myTabContent" class="tab-content">
  11 + <div class="tab-pane fade active in" id="first">
  12 + <div id="toolbar1" class="toolbar">
  13 + {:build_toolbar('refresh')}
  14 + </div>
  15 + <table id="table1" class="table table-striped table-bordered table-hover" width="100%">
  16 + </table>
  17 + </div>
  18 + <div class="tab-pane fade" id="second">
  19 + <div id="toolbar2" class="toolbar">
  20 + {:build_toolbar('refresh')}
  21 + </div>
  22 + <table id="table2" class="table table-striped table-bordered table-hover" width="100%">
  23 + </table>
  24 + </div>
  25 + </div>
  26 + </div>
  27 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar('refresh,delete')}
  10 + </div>
  11 + <table id="table" class="table table-striped table-bordered table-hover" width="100%">
  12 +
  13 + </table>
  14 +
  15 +
  16 + </div>
  17 + </div>
  18 +
  19 + </div>
  20 + </div>
  21 +</div>
  1 +<div class="row">
  2 + <div class="col-xs-12 col-sm-6 col-md-5 col-lg-4">
  3 + <div class="panel panel-default panel-intro">
  4 + <div class="panel-body">
  5 + <div id="1" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar1" class="toolbar">
  9 + {:build_toolbar('refresh')}
  10 + </div>
  11 + <table id="table1" class="table table-striped table-bordered table-hover" width="100%">
  12 +
  13 + </table>
  14 +
  15 +
  16 + </div>
  17 + </div>
  18 +
  19 + </div>
  20 + </div>
  21 + </div>
  22 + </div>
  23 + <div class="col-xs-12 col-sm-6 col-md-7 col-lg-8">
  24 + <div class="panel panel-default panel-intro">
  25 + <div class="panel-body">
  26 + <div id="myTabContent2" class="tab-content">
  27 + <div class="tab-pane fade active in" id="two">
  28 + <div class="widget-body no-padding">
  29 + <div id="toolbar2" class="toolbar">
  30 + {:build_toolbar('refresh')}
  31 + </div>
  32 + <table id="table2" class="table table-striped table-bordered table-hover" width="100%">
  33 +
  34 + </table>
  35 +
  36 +
  37 + </div>
  38 + </div>
  39 +
  40 + </div>
  41 + </div>
  42 + </div>
  43 + </div>
  44 +</div>
  1 +<div class="panel panel-default panel-intro">
  2 + {:build_heading()}
  3 +
  4 + <div class="panel-body">
  5 + <div id="myTabContent" class="tab-content">
  6 + <div class="tab-pane fade active in" id="one">
  7 + <div class="widget-body no-padding">
  8 + <div id="toolbar" class="toolbar">
  9 + {:build_toolbar('refresh,delete')}
  10 + <a class="btn btn-info btn-disabled disabled btn-selected" href="javascript:;"><i class="fa fa-leaf"></i> 获取选中项</a>
  11 + <a class="btn btn-success btn-toggle-view" href="javascript:;"><i class="fa fa-leaf"></i> 切换视图</a>
  12 + </div>
  13 + <table id="table" class="table table-striped table-hover" width="100%">
  14 +
  15 + </table>
  16 +
  17 + </div>
  18 + </div>
  19 +
  20 + </div>
  21 + </div>
  22 +</div>
  23 +<style type="text/css">
  24 + .example {
  25 + height:100%;position: relative;
  26 + }
  27 + .example > span {
  28 + position:absolute;left:15px;top:15px;
  29 + }
  30 +</style>
  31 +
  32 +<script id="itemtpl" type="text/html">
  33 + <!--
  34 + 如果启用了templateView,默认调用的是itemtpl这个模板,可以通过设置templateFormatter来修改
  35 + 在当前模板中可以使用三个变量(item:行数据,i:当前第几行,data:所有的行数据)
  36 + 此模板引擎使用的是art-templatenative,可参考官方文档
  37 + -->
  38 +
  39 + <div class="col-sm-4 col-md-3">
  40 + <!--下面四行是为了展示随机图片和标签,可移除-->
  41 + <% 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']; %>
  42 + <% var image = imagearr[item.id % 5]; %>
  43 + <% var labelarr = ['primary', 'success', 'info', 'danger', 'warning']; %>
  44 + <% var label = labelarr[item.id % 5]; %>
  45 + <div class="thumbnail example">
  46 + <span class="btn btn-<%=label%>">ID:<%=item.id%></span>
  47 + <img src="<%=image%>" style="width:100%;" alt="<%=item.title%>">
  48 + <div class="caption">
  49 + <h4><%=item.title?item.title:'无'%></h4>
  50 + <p class="text-muted">操作者IP:<%=item.ip%></p>
  51 + <p class="text-muted">操作时间:<%=Moment(item.createtime*1000).format("YYYY-MM-DD HH:mm:ss")%></p>
  52 + <p>
  53 + <!--详情的事件需要在JS中手动绑定-->
  54 + <a href="#" class="btn btn-primary btn-success btn-detail" data-id="<%=item.id%>"><i class="fa fa-camera"></i> 详情</a>
  55 +
  56 + <!--如果需要响应编辑或删除事件,可以给元素添加 btn-editbtn-del的类和data-id这个属性值-->
  57 + <a href="#" class="btn btn-primary btn-edit" data-id="<%=item.id%>"><i class="fa fa-pencil"></i> 编辑</a>
  58 + <a href="#" class="btn btn-danger btn-del" data-id="<%=item.id%>"><i class="fa fa-times"></i> 删除</a>
  59 + <span class="pull-right" style="margin-top:10px;">
  60 + <!--如果需要多选操作,请确保有下面的checkbox元素存在,可移除-->
  61 + <input name="checkbox" data-id="<%=item.id%>" type="checkbox" />
  62 + </span>
  63 + </p>
  64 + </div>
  65 + </div>
  66 + </div>
  67 +</script>
  1 +<table class="table table-striped">
  2 + <thead>
  3 + <tr>
  4 + <th>{:__('Title')}</th>
  5 + <th>{:__('Content')}</th>
  6 + </tr>
  7 + </thead>
  8 + <tbody>
  9 + {volist name="row" id="vo" }
  10 + <tr>
  11 + <td>{$key}</td>
  12 + <td style="word-break: break-all;">{$vo|htmlentities}</td>
  13 + </tr>
  14 + {/volist}
  15 + {if $Think.get.dialog}
  16 + <tr>
  17 + <td>回传数据</td>
  18 + <td>
  19 + <div class="input-group">
  20 + <input name="callback" class="form-control" value="test" />
  21 + <span class="input-group-btn"><a href="javascript:;" class="btn btn-success btn-callback" >回传数据</a></span>
  22 + </div>
  23 + </td>
  24 + </tr>
  25 + {/if}
  26 + </tbody>
  27 +</table>
  28 +<div class="form-group layer-footer">
  29 + <label class="control-label col-xs-12 col-sm-2"></label>
  30 + <div class="col-xs-12 col-sm-8">
  31 + <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
  32 + <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
  33 + </div>
  34 +</div>
1 <form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action=""> 1 <form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
2 2
  3 +
3 <div class="form-group"> 4 <div class="form-group">
4 - <label class="control-label col-xs-12 col-sm-2">{:__('Order_no')}:</label>  
5 - <div class="col-xs-12 col-sm-8">  
6 - <input id="c-order_no" class="form-control" name="row[order_no]" type="text" value="{$row.order_no|htmlentities}">  
7 - </div>  
8 - </div>  
9 - <div class="form-group">  
10 - <label class="control-label col-xs-12 col-sm-2">{:__('Price')}:</label>  
11 - <div class="col-xs-12 col-sm-8">  
12 - <input id="c-price" class="form-control" step="0.01" name="row[price]" type="number" value="{$row.price|htmlentities}">  
13 - </div>  
14 - </div>  
15 - <div class="form-group">  
16 - <label class="control-label col-xs-12 col-sm-2">{:__('Is_pay')}:</label> 5 + <label class="control-label col-xs-12 col-sm-2">选择司机:</label>
17 <div class="col-xs-12 col-sm-8"> 6 <div class="col-xs-12 col-sm-8">
18 -  
19 - <select id="c-is_pay" class="form-control selectpicker" name="row[is_pay]">  
20 - {foreach name="isPayList" item="vo"}  
21 - <option value="{$key}" {in name="key" value="$row.is_pay"}selected{/in}>{$vo}</option> 7 + <select id="c-intended_driver_id" class="form-control selectpicker" name="row[intended_driver_id]">
  8 + {foreach name="row" item="vo"}
  9 + <option value="{$vo.id}" {in name="key" value="$vo.id"}selected{/in}>{$vo.name}-{$vo.license_plate}</option>
22 {/foreach} 10 {/foreach}
23 </select> 11 </select>
24 12
25 </div> 13 </div>
26 </div> 14 </div>
27 - <div class="form-group">  
28 - <label class="control-label col-xs-12 col-sm-2">{:__('Car_id')}:</label>  
29 - <div class="col-xs-12 col-sm-8">  
30 - <input id="c-car_id" data-rule="required" data-source="car/index" class="form-control selectpage" name="row[car_id]" type="text" value="{$row.car_id|htmlentities}">  
31 - </div>  
32 - </div>  
33 - <div class="form-group">  
34 - <label class="control-label col-xs-12 col-sm-2">{:__('User_id')}:</label>  
35 - <div class="col-xs-12 col-sm-8">  
36 - <input id="c-user_id" data-rule="required" data-source="user/user/index" data-field="nickname" class="form-control selectpage" name="row[user_id]" type="text" value="{$row.user_id|htmlentities}">  
37 - </div>  
38 - </div>  
39 - <div class="form-group">  
40 - <label class="control-label col-xs-12 col-sm-2">{:__('User_name')}:</label>  
41 - <div class="col-xs-12 col-sm-8">  
42 - <input id="c-user_name" class="form-control" name="row[user_name]" type="text" value="{$row.user_name|htmlentities}">  
43 - </div>  
44 - </div>  
45 - <div class="form-group">  
46 - <label class="control-label col-xs-12 col-sm-2">{:__('Driver_id')}:</label>  
47 - <div class="col-xs-12 col-sm-8">  
48 - <input id="c-driver_id" data-rule="required" data-source="driver/index" class="form-control selectpage" name="row[driver_id]" type="text" value="{$row.driver_id|htmlentities}">  
49 - </div>  
50 - </div>  
51 - <div class="form-group">  
52 - <label class="control-label col-xs-12 col-sm-2">{:__('Driver_name')}:</label>  
53 - <div class="col-xs-12 col-sm-8">  
54 - <input id="c-driver_name" class="form-control" name="row[driver_name]" type="text" value="{$row.driver_name|htmlentities}">  
55 - </div>  
56 - </div>  
57 - <div class="form-group">  
58 - <label class="control-label col-xs-12 col-sm-2">{:__('Pay_time')}:</label>  
59 - <div class="col-xs-12 col-sm-8">  
60 - <input id="c-pay_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[pay_time]" type="text" value="{:$row.pay_time?datetime($row.pay_time):''}">  
61 - </div>  
62 - </div>  
63 - <div class="form-group">  
64 - <label class="control-label col-xs-12 col-sm-2">{:__('Refund_time')}:</label>  
65 - <div class="col-xs-12 col-sm-8">  
66 - <input id="c-refund_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[refund_time]" type="text" value="{:$row.refund_time?datetime($row.refund_time):''}">  
67 - </div>  
68 - </div>  
69 - <div class="form-group">  
70 - <label class="control-label col-xs-12 col-sm-2">{:__('Create_time')}:</label>  
71 - <div class="col-xs-12 col-sm-8">  
72 - <input id="c-create_time" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-use-current="true" name="row[create_time]" type="text" value="{:$row.create_time?datetime($row.create_time):''}">  
73 - </div>  
74 - </div> 15 +
75 <div class="form-group layer-footer"> 16 <div class="form-group layer-footer">
76 <label class="control-label col-xs-12 col-sm-2"></label> 17 <label class="control-label col-xs-12 col-sm-2"></label>
77 <div class="col-xs-12 col-sm-8"> 18 <div class="col-xs-12 col-sm-8">
1 <form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action=""> 1 <form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
2 2
  3 +
  4 + <div class="form-group">
  5 + <label class="control-label col-xs-12 col-sm-2">选择司机:</label>
  6 + <div class="col-xs-12 col-sm-8">
  7 + <select id="c-intended_driver_id" class="form-control selectpicker" name="row[intended_driver_id]">
  8 + {foreach name="row" item="vo"}
  9 + <option value="{$vo.id}" {in name="key" value="$vo.id"}selected{/in}>{$vo.name}-{$vo.license_plate}</option>
  10 + {/foreach}
  11 + </select>
  12 +
  13 + </div>
  14 + </div>
  15 +
3 <div class="form-group layer-footer"> 16 <div class="form-group layer-footer">
4 <label class="control-label col-xs-12 col-sm-2"></label> 17 <label class="control-label col-xs-12 col-sm-2"></label>
5 <div class="col-xs-12 col-sm-8"> 18 <div class="col-xs-12 col-sm-8">
6 - <button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>  
7 - <button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button> 19 + <button type="submit" class="btn btn-primary btn-embossed disabled">{:__('OK')}</button>
8 </div> 20 </div>
9 </div> 21 </div>
10 </form> 22 </form>
@@ -940,16 +940,17 @@ class Car extends Base @@ -940,16 +940,17 @@ class Car extends Base
940 $charter_num = $this->request->param("charter_num");//包车数量 940 $charter_num = $this->request->param("charter_num");//包车数量
941 $intended_driver_id = $this->request->param("intended_driver_id");//意向司机 941 $intended_driver_id = $this->request->param("intended_driver_id");//意向司机
942 $remarks = $this->request->param("remarks");//备注 942 $remarks = $this->request->param("remarks");//备注
943 - $carmodel = Db::name("carmodel")->where("id", $carmodel_id)->find();  
944 $specificaddress_id = $this->request->param("specificaddress_id");//区域id 943 $specificaddress_id = $this->request->param("specificaddress_id");//区域id
945 - $driver= Db::name("driver")->where("id", $intended_driver_id)->find();  
946 - $car= Db::name("car")->where("driver_id", $driver['id'])->find();  
947 $chartercar = Db::name("chartercar") 944 $chartercar = Db::name("chartercar")
948 ->where("specificaddress_id", $specificaddress_id) 945 ->where("specificaddress_id", $specificaddress_id)
949 ->where("carmodel_id", $carmodel_id) 946 ->where("carmodel_id", $carmodel_id)
950 ->find(); 947 ->find();
951 $price = 0; 948 $price = 0;
952 $price = bcmul($charter_num, $chartercar['price'], 2); 949 $price = bcmul($charter_num, $chartercar['price'], 2);
  950 + if ($intended_driver_id) {
  951 + $driver = Db::name("driver")->where("id", $intended_driver_id)->find();
  952 + $car = Db::name("car")->where("driver_id", $driver['id'])->find();
  953 + $carmodel = Db::name("carmodel")->where("id", $car['carmodel_id'])->find();
953 //判断总表 954 //判断总表
954 $time = strtotime(date("Y-m-d", time())); 955 $time = strtotime(date("Y-m-d", time()));
955 $order_review = Db::name("order_review") 956 $order_review = Db::name("order_review")
@@ -988,6 +989,23 @@ class Car extends Base @@ -988,6 +989,23 @@ class Car extends Base
988 "remarks" => $remarks, 989 "remarks" => $remarks,
989 "intended_driver_id" => $intended_driver_id, 990 "intended_driver_id" => $intended_driver_id,
990 ]; 991 ];
  992 + }else{
  993 + $data = [
  994 + "order_no" => getOrderSn(),
  995 + "price" => $price,
  996 + "reservation_time" => $reservation_time,
  997 + "is_pay" => 2,//未支付
  998 + "route_id" => $route_id,
  999 + "user_id" => $this->auth->id,
  1000 + "phone" => $phone,
  1001 + "create_time" => time(),
  1002 + "reservation_time" => time(),
  1003 + "type" => 2,
  1004 + "number" => $number,
  1005 + "remarks" => $remarks,
  1006 + "intended_driver_id" => $intended_driver_id,
  1007 + ];
  1008 + }
991 $res = Db::name("order")->insertGetId($data); 1009 $res = Db::name("order")->insertGetId($data);
992 $userinfo = Db::name('user') 1010 $userinfo = Db::name('user')
993 ->where(['id' => $this->auth->id]) 1011 ->where(['id' => $this->auth->id])
@@ -1155,7 +1173,7 @@ class Car extends Base @@ -1155,7 +1173,7 @@ class Car extends Base
1155 "is_qrcode" => $is_qrcode, 1173 "is_qrcode" => $is_qrcode,
1156 "specificaddress_id" => $specificaddress_id, 1174 "specificaddress_id" => $specificaddress_id,
1157 "reservation_time" => $reservation_time, 1175 "reservation_time" => $reservation_time,
1158 - "is_pay" => "2",//未支付 1176 + "is_pay" => 2,//未支付
1159 "route_id" => $route_id, 1177 "route_id" => $route_id,
1160 "user_id" => $this->auth->id, 1178 "user_id" => $this->auth->id,
1161 "phone" => $phone, 1179 "phone" => $phone,
@@ -1195,20 +1213,16 @@ class Car extends Base @@ -1195,20 +1213,16 @@ class Car extends Base
1195 { 1213 {
1196 $is_qrcode = $this->request->param("is_qrcode");//二维码下单:0=不是,1=是 1214 $is_qrcode = $this->request->param("is_qrcode");//二维码下单:0=不是,1=是
1197 $route_id = $this->request->param("route_id");//线路 1215 $route_id = $this->request->param("route_id");//线路
1198 - $number = $this->request->param("number");//乘车人数  
1199 $position = $this->request->param("position");//上车地址 1216 $position = $this->request->param("position");//上车地址
1200 $lat = $this->request->param("lat");//经度 1217 $lat = $this->request->param("lat");//经度
  1218 + $specificaddress_id = $this->request->param("specificaddress_id");//区域id
1201 $lng = $this->request->param("lng");//维度 1219 $lng = $this->request->param("lng");//维度
  1220 + $number = $this->request->param("number");//乘车人数
1202 $carmodel_id = $this->request->param("carmodel_id");//乘车人数 1221 $carmodel_id = $this->request->param("carmodel_id");//乘车人数
1203 $reservation_time = $this->request->param("reservation_time");//预约时间 1222 $reservation_time = $this->request->param("reservation_time");//预约时间
1204 $phone = $this->request->param("phone");//联系电话 1223 $phone = $this->request->param("phone");//联系电话
1205 - $specificaddress_id = $this->request->param("specificaddress_id");//区域id  
1206 $intended_driver_id = $this->request->param("intended_driver_id");//意向司机 1224 $intended_driver_id = $this->request->param("intended_driver_id");//意向司机
1207 $remarks = $this->request->param("remarks");//备注 1225 $remarks = $this->request->param("remarks");//备注
1208 - $driver = Db::name("driver")->where("id", $intended_driver_id)->find();  
1209 - $car = Db::name("car")->where("driver_id", $driver['id'])->find();  
1210 - $carmodel = Db::name("carmodel")->where("id", $carmodel_id)->find();  
1211 - $route = Db::name("route")->where("id", $car['route_id'])->find();  
1212 $price = 0; 1226 $price = 0;
1213 $specificaddress = Db::name("specificaddress")->where("id", $specificaddress_id)->find(); 1227 $specificaddress = Db::name("specificaddress")->where("id", $specificaddress_id)->find();
1214 if ($specificaddress) { 1228 if ($specificaddress) {
@@ -1216,6 +1230,12 @@ class Car extends Base @@ -1216,6 +1230,12 @@ class Car extends Base
1216 } else { 1230 } else {
1217 $this->error("价格计算错误"); 1231 $this->error("价格计算错误");
1218 } 1232 }
  1233 + if ($intended_driver_id){
  1234 + $driver = Db::name("driver")->where("id", $intended_driver_id)->find();
  1235 + $car = Db::name("car")->where("driver_id", $driver['id'])->find();
  1236 + $carmodel = Db::name("carmodel")->where("id", $car['carmodel_id'])->find();
  1237 + $route = Db::name("route")->where("id", $car['route_id'])->find();
  1238 +
1219 //判断总表 1239 //判断总表
1220 $time = strtotime(date("Y-m-d", time())); 1240 $time = strtotime(date("Y-m-d", time()));
1221 $order_review = Db::name("order_review") 1241 $order_review = Db::name("order_review")
@@ -1241,16 +1261,33 @@ class Car extends Base @@ -1241,16 +1261,33 @@ class Car extends Base
1241 $data = [ 1261 $data = [
1242 "order_no" => getOrderSn(), 1262 "order_no" => getOrderSn(),
1243 "price" => $price, 1263 "price" => $price,
  1264 + "driver_id" => $driver['id'],
  1265 + "is_qrcode" => $is_qrcode,
1244 "order_review_id" => $order_review_id, 1266 "order_review_id" => $order_review_id,
  1267 + "specificaddress_id" => $specificaddress_id,
  1268 + "reservation_time" => $reservation_time,
  1269 + "is_pay" => 1,//未支付
  1270 + "route_id" => $route_id,
  1271 + "user_id" => $this->auth->id,
  1272 + "phone" => $phone,
  1273 + "create_time" => time(),
  1274 + "reservation_time" => time(),
  1275 + "type" => 2,
  1276 + "number" => $number,
  1277 + "remarks" => $remarks,
  1278 + "intended_driver_id" => $intended_driver_id,
  1279 + ];
  1280 + }else{
  1281 + $data = [
  1282 + "order_no" => getOrderSn(),
  1283 + "price" => $price,
1245 "is_qrcode" => $is_qrcode, 1284 "is_qrcode" => $is_qrcode,
1246 "specificaddress_id" => $specificaddress_id, 1285 "specificaddress_id" => $specificaddress_id,
1247 "reservation_time" => $reservation_time, 1286 "reservation_time" => $reservation_time,
1248 "is_pay" => 1,//未支付 1287 "is_pay" => 1,//未支付
1249 "route_id" => $route_id, 1288 "route_id" => $route_id,
1250 - "driver_id" => $driver['id'],  
1251 "user_id" => $this->auth->id, 1289 "user_id" => $this->auth->id,
1252 "phone" => $phone, 1290 "phone" => $phone,
1253 - "pay_type" => "offlinepay",  
1254 "create_time" => time(), 1291 "create_time" => time(),
1255 "reservation_time" => time(), 1292 "reservation_time" => time(),
1256 "type" => 2, 1293 "type" => 2,
@@ -1258,6 +1295,7 @@ class Car extends Base @@ -1258,6 +1295,7 @@ class Car extends Base
1258 "remarks" => $remarks, 1295 "remarks" => $remarks,
1259 "intended_driver_id" => $intended_driver_id, 1296 "intended_driver_id" => $intended_driver_id,
1260 ]; 1297 ];
  1298 + }
1261 $res = Db::name("order")->insertGetId($data); 1299 $res = Db::name("order")->insertGetId($data);
1262 $this->success("请求成功", $res); 1300 $this->success("请求成功", $res);
1263 } 1301 }
@@ -30,6 +30,10 @@ return [ @@ -30,6 +30,10 @@ return [
30 ], 30 ],
31 ], 31 ],
32 'route' => [ 32 'route' => [
  33 + '/example$' => 'example/index/index',
  34 + '/example/d/[:name]' => 'example/demo/index',
  35 + '/example/d1/[:name]' => 'example/demo/demo1',
  36 + '/example/d2/[:name]' => 'example/demo/demo2',
33 '/qrcode$' => 'qrcode/index/index', 37 '/qrcode$' => 'qrcode/index/index',
34 '/qrcode/build$' => 'qrcode/index/build', 38 '/qrcode/build$' => 'qrcode/index/build',
35 ], 39 ],
  1 +html,
  2 +body {
  3 + height: 100%;
  4 +}
  5 +
  6 +body {
  7 + padding-top: 50px; /* Required padding for .navbar-fixed-top. Remove if using .navbar-static-top. Change if height of navigation changes. */
  8 + -webkit-font-smoothing: antialiased;
  9 + -moz-osx-font-smoothing: grayscale;
  10 + font-family: 'Source Sans Pro', 'Helvetica Neue', Helvetica, Arial, sans-serif;
  11 +}
  12 +
  13 +.img-addon {
  14 + margin-bottom: 10px;
  15 + width:100%;
  16 +}
  17 +
  18 +.img-hover:hover {
  19 + opacity: 0.8;
  20 +}
  21 +
  22 +.display-1 {
  23 + font-size:44px;
  24 +}
  25 +.display-4 {
  26 + font-size:24px;
  27 + line-height:32px;
  28 +}
  29 +
  30 +/* Home Page Carousel */
  31 +
  32 +header.carousel {
  33 + height: 50%;
  34 +}
  35 +
  36 +header.carousel .item,
  37 +header.carousel .item.active,
  38 +header.carousel .carousel-inner {
  39 + height: 100%;
  40 +}
  41 +
  42 +header.carousel .fill {
  43 + width: 100%;
  44 + height: 100%;
  45 +}
  46 +
  47 +/* 404 Page Styles */
  48 +
  49 +.error-404 {
  50 + font-size: 100px;
  51 +}
  52 +
  53 +/* Pricing Page Styles */
  54 +
  55 +.price {
  56 + display: block;
  57 + font-size: 50px;
  58 + line-height: 50px;
  59 +}
  60 +
  61 +.price sup {
  62 + top: -20px;
  63 + left: 2px;
  64 + font-size: 20px;
  65 +}
  66 +
  67 +.period {
  68 + display: block;
  69 + font-style: italic;
  70 +}
  71 +
  72 +/* Footer Styles */
  73 +
  74 +footer {
  75 + margin: 50px 0;
  76 +}
  77 +
  78 +/* Responsive Styles */
  79 +
  80 +@media(max-width:991px) {
  81 + .customer-img,
  82 + .img-related {
  83 + margin-bottom: 30px;
  84 + }
  85 +}
  86 +
  87 +@media(max-width:767px) {
  88 + .img-addon {
  89 + margin-bottom: 15px;
  90 + }
  91 +
  92 + header.carousel .carousel {
  93 + height: 70%;
  94 + }
  95 +}
  96 +.carousel-body {
  97 + position:absolute;
  98 + width: 100%;
  99 + top:25%;
  100 + text-align:center;
  101 + color:#fff;
  102 +}
  103 +
  104 +.addonlist a > p{
  105 + margin-bottom:15px;
  106 +}
  1 +/** @license
  2 + * RequireJS plugin for async dependency load like JSONP and Google Maps
  3 + * Author: Miller Medeiros
  4 + * Version: 0.1.2 (2014/02/24)
  5 + * Released under the MIT license
  6 + */
  7 +define(function(){
  8 +
  9 + var DEFAULT_PARAM_NAME = 'callback',
  10 + _uid = 0;
  11 +
  12 + function injectScript(src){
  13 + var s, t;
  14 + s = document.createElement('script'); s.type = 'text/javascript'; s.async = true; s.src = src;
  15 + t = document.getElementsByTagName('script')[0]; t.parentNode.insertBefore(s,t);
  16 + }
  17 +
  18 + function formatUrl(name, id){
  19 + var paramRegex = /!(.+)/,
  20 + url = name.replace(paramRegex, ''),
  21 + param = (paramRegex.test(name))? name.replace(/.+!/, '') : DEFAULT_PARAM_NAME;
  22 + url += (url.indexOf('?') < 0)? '?' : '&';
  23 + return url + param +'='+ id;
  24 + }
  25 +
  26 + function uid() {
  27 + _uid += 1;
  28 + return '__async_req_'+ _uid +'__';
  29 + }
  30 +
  31 + return{
  32 + load : function(name, req, onLoad, config){
  33 + if(config.isBuild){
  34 + onLoad(null); //avoid errors on the optimizer
  35 + }else{
  36 + var id = uid();
  37 + //create a global variable that stores onLoad so callback
  38 + //function can define new module after async load
  39 + window[id] = onLoad;
  40 + injectScript(formatUrl(req.toUrl(name), id));
  41 + }
  42 + }
  43 + };
  44 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function ($, undefined, Backend, Table, Form, Template) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + // 初始化表格参数配置
  6 + Table.api.init({
  7 + extend: {
  8 + index_url: 'example/bootstraptable/index',
  9 + add_url: '',
  10 + edit_url: 'example/bootstraptable/edit',
  11 + del_url: 'example/bootstraptable/del',
  12 + multi_url: '',
  13 + }
  14 + });
  15 +
  16 + var table = $("#table");
  17 +
  18 + //在普通搜索提交搜索前
  19 + table.on('common-search.bs.table', function (event, table, query) {
  20 + //这里可以获取到普通搜索表单中字段的查询条件
  21 + console.log(query);
  22 + });
  23 +
  24 + //在普通搜索渲染后
  25 + table.on('post-common-search.bs.table', function (event, table) {
  26 + var form = $("form", table.$commonsearch);
  27 + $("input[name='title']", form).addClass("selectpage").data("source", "example/bootstraptable/selectpage").data("primaryKey", "title").data("field", "title").data("orderBy", "id desc");
  28 + $("input[name='username']", form).addClass("selectpage").data("source", "auth/admin/index").data("primaryKey", "username").data("field", "username").data("orderBy", "id desc");
  29 + Form.events.cxselect(form);
  30 + Form.events.selectpage(form);
  31 + });
  32 +
  33 + //在表格内容渲染完成后回调的事件
  34 + table.on('post-body.bs.table', function (e, settings, json, xhr) {
  35 + console.log(e, settings, json, xhr);
  36 + });
  37 +
  38 + //当表格数据加载完成时
  39 + table.on('load-success.bs.table', function (e, data) {
  40 + //这里可以获取从服务端获取的JSON数据
  41 + console.log(data);
  42 + //这里我们手动设置底部的值
  43 + $("#money").text(data.extend.money);
  44 + $("#price").text(data.extend.price);
  45 + });
  46 +
  47 + // 初始化表格
  48 + // 这里使用的是Bootstrap-table插件渲染表格
  49 + // 相关文档:https://doc.fastadmin.net/doc/table.html
  50 + table.bootstrapTable({
  51 + //表格参数可以参考:https://doc.fastadmin.net/doc/190.html
  52 + url: $.fn.bootstrapTable.defaults.extend.index_url,
  53 + columns: [
  54 + [
  55 + //更多列参数可以参考:https://doc.fastadmin.net/doc/191.html
  56 + //该列为复选框字段,如果后台的返回state值将会默认选中
  57 + {field: 'state', checkbox: true,},
  58 + //sortable为是否排序,operate为搜索时的操作符,visible表示是否可见
  59 + {field: 'id', title: 'ID', sortable: true, operate: false},
  60 + //直接响应搜索
  61 + {field: 'username', title: __('管理员'), formatter: Table.api.formatter.search},
  62 + //模糊搜索
  63 + {field: 'title', title: __('Title'), operate: 'LIKE %...%', placeholder: '模糊搜索,*表示任意字符', width: '280px'},
  64 + //通过Ajax渲染searchList,也可以使用JSON数据
  65 + {
  66 + field: 'url',
  67 + title: __('Url'),
  68 + align: 'left',
  69 + searchList: $.getJSON('example/bootstraptable/searchlist?search=a&field=row[user_id]'),
  70 + formatter: Controller.api.formatter.url,
  71 + addClass: "selectpicker"
  72 + },
  73 + //点击IP时同时执行搜索此IP
  74 + {
  75 + field: 'ip',
  76 + title: __('IP'),
  77 + events: Controller.api.events.ip,
  78 + formatter: Controller.api.formatter.ip
  79 + },
  80 + //自定义栏位,custom是不存在的字段
  81 + {field: 'custom', title: __('切换'), operate: false, formatter: Controller.api.formatter.custom},
  82 + {
  83 + field: 'admin_id', title: __('联动搜索'), searchList: function (column) {
  84 + return Template('categorytpl', {});
  85 + }, formatter: function (value, row, index) {
  86 + return '无';
  87 + }, visible: false
  88 + },
  89 + //启用时间段搜索
  90 + {
  91 + field: 'createtime',
  92 + title: __('Update time'),
  93 + sortable: true,
  94 + formatter: Table.api.formatter.datetime,
  95 + operate: 'RANGE',
  96 + addclass: 'datetimerange'
  97 + },
  98 + //操作栏,默认有编辑、删除或排序按钮,可自定义配置buttons来扩展按钮
  99 + {
  100 + field: 'operate',
  101 + width: "150px",
  102 + title: __('Operate'),
  103 + table: table,
  104 + events: Table.api.events.operate,
  105 + buttons: [
  106 + {
  107 + name: 'click',
  108 + title: __('点击执行事件'),
  109 + classname: 'btn btn-xs btn-info btn-click',
  110 + icon: 'fa fa-leaf',
  111 + // dropdown: '更多',//如果包含dropdown,将会以下拉列表的形式展示
  112 + click: function (data) {
  113 + Layer.alert("点击按钮执行的事件");
  114 + }
  115 + },
  116 + {
  117 + name: 'detail',
  118 + title: __('弹出窗口打开'),
  119 + classname: 'btn btn-xs btn-primary btn-dialog',
  120 + icon: 'fa fa-list',
  121 + url: 'example/bootstraptable/detail',
  122 + callback: function (data) {
  123 + Layer.alert("接收到回传数据:" + JSON.stringify(data), {title: "回传数据"});
  124 + }
  125 + },
  126 + {
  127 + name: 'ajax',
  128 + title: __('发送Ajax'),
  129 + classname: 'btn btn-xs btn-success btn-magic btn-ajax',
  130 + icon: 'fa fa-magic',
  131 + confirm: '确认发送Ajax请求?',
  132 + url: 'example/bootstraptable/detail',
  133 + success: function (data, ret) {
  134 + Layer.alert(ret.msg + ",返回数据:" + JSON.stringify(data));
  135 + //如果需要阻止成功提示,则必须使用return false;
  136 + //return false;
  137 + },
  138 + error: function (data, ret) {
  139 + console.log(data, ret);
  140 + Layer.alert(ret.msg);
  141 + return false;
  142 + }
  143 + },
  144 + {
  145 + name: 'addtabs',
  146 + title: __('新选项卡中打开'),
  147 + classname: 'btn btn-xs btn-warning btn-addtabs',
  148 + icon: 'fa fa-folder-o',
  149 + url: 'example/bootstraptable/detail'
  150 + }
  151 + ],
  152 + formatter: Table.api.formatter.operate
  153 + },
  154 + ],
  155 + ],
  156 + //更多配置参数可参考:https://doc.fastadmin.net/doc/190.html
  157 + //亦可以参考require-table.js中defaults的配置
  158 + //快捷搜索,这里可在控制器定义快捷搜索的字段
  159 + search: true,
  160 + //启用普通表单搜索
  161 + commonSearch: true,
  162 + //显示导出按钮
  163 + showExport: true,
  164 + //启用跨页选择
  165 + maintainSelected: true,
  166 + //启用固定列
  167 + fixedColumns: true,
  168 + //固定左侧列数
  169 + fixedNumber: 3,
  170 + //固定右侧列数
  171 + fixedRightNumber: 1,
  172 + //导出类型
  173 + exportDataType: "all", //共有basic, all, selected三种值 basic当前页 all全部 selected仅选中
  174 + //导出下拉列表选项
  175 + exportTypes: ['json', 'xml', 'csv', 'txt', 'doc', 'excel'],
  176 + //可以控制是否默认显示搜索单表,false则隐藏,默认为false
  177 + searchFormVisible: true,
  178 + queryParams: function (params) {
  179 + //这里可以追加搜索条件
  180 + var filter = JSON.parse(params.filter);
  181 + var op = JSON.parse(params.op);
  182 + //这里可以动态赋值,比如从URL中获取admin_id的值,filter.admin_id=Fast.api.query('admin_id');
  183 + filter.admin_id = 1;
  184 + op.admin_id = "=";
  185 + params.filter = JSON.stringify(filter);
  186 + params.op = JSON.stringify(op);
  187 + return params;
  188 + },
  189 + });
  190 +
  191 + // 为表格绑定事件
  192 + Table.api.bindevent(table);
  193 +
  194 + // 监听下拉列表改变的事件
  195 + $(document).on('change', 'select[name=admin]', function () {
  196 + $("input[name='admin_id']").val($(this).val());
  197 + });
  198 +
  199 + //自定义Tab筛选条件
  200 + $('.panel-heading .nav-custom-condition a[data-toggle="tab"]', table.closest(".panel-intro")).on('shown.bs.tab', function (e) {
  201 + var value = $(this).data("value");
  202 + var options = table.bootstrapTable('getOptions');
  203 + var queryParams = options.queryParams;
  204 + options.pageNumber = 1;
  205 + options.queryParams = function (params) {
  206 + //这一行必须要存在,否则在点击下一页时会丢失搜索栏数据
  207 + params = queryParams(params);
  208 +
  209 + //如果希望追加搜索条件,可使用
  210 + var filter = params.filter ? JSON.parse(params.filter) : {};
  211 + var op = params.op ? JSON.parse(params.op) : {};
  212 + if (value) {
  213 + //这里可以自定义多个筛选条件
  214 + filter.admin_id = value;
  215 + op.admin_id = '=';
  216 + } else {
  217 + //选全部时要移除相应的条件
  218 + delete filter.admin_id;
  219 + delete op.admin_id;
  220 + }
  221 +
  222 + params.filter = JSON.stringify(filter);
  223 + params.op = JSON.stringify(op);
  224 +
  225 + //如果希望忽略搜索栏搜索条件,可使用
  226 + //params.filter = JSON.stringify(value?{admin_id: value}:{});
  227 + //params.op = JSON.stringify(value?{admin_id: '='}:{});
  228 + return params;
  229 + };
  230 +
  231 + table.trigger("uncheckbox");
  232 + table.bootstrapTable('refresh', {pageNumber: 1});
  233 + return false;
  234 + });
  235 +
  236 + // 指定搜索条件
  237 + $(document).on("click", ".btn-singlesearch", function () {
  238 + var options = table.bootstrapTable('getOptions');
  239 + var queryParams = options.queryParams;
  240 + options.pageNumber = 1;
  241 + options.queryParams = function (params) {
  242 + //这一行必须要存在,否则在点击下一页时会丢失搜索栏数据
  243 + params = queryParams(params);
  244 +
  245 + //如果希望追加搜索条件,可使用
  246 + var filter = params.filter ? JSON.parse(params.filter) : {};
  247 + var op = params.op ? JSON.parse(params.op) : {};
  248 + filter.url = 'login';
  249 + op.url = 'like';
  250 +
  251 + params.filter = JSON.stringify(filter);
  252 + params.op = JSON.stringify(op);
  253 +
  254 + //如果希望忽略搜索栏搜索条件,可使用
  255 + //params.filter = JSON.stringify({url: 'login'});
  256 + //params.op = JSON.stringify({url: 'like'});
  257 + return params;
  258 + };
  259 + table.bootstrapTable('refresh', {});
  260 + Toastr.info("当前执行的是自定义搜索,搜索URL中包含login的数据");
  261 + return false;
  262 + });
  263 +
  264 + // 获取选中项
  265 + $(document).on("click", ".btn-selected", function () {
  266 + Layer.alert(JSON.stringify(Table.api.selecteddata(table)));
  267 + });
  268 +
  269 + // 启动和暂停按钮
  270 + $(document).on("click", ".btn-start,.btn-pause", function () {
  271 + //在table外不可以使用添加.btn-change的方法
  272 + //只能自己调用Table.api.multi实现
  273 + //如果操作全部则ids可以置为空
  274 + var ids = Table.api.selectedids(table);
  275 + Table.api.multi("changestatus", ids.join(","), table, this);
  276 + });
  277 +
  278 + },
  279 + add: function () {
  280 + Controller.api.bindevent();
  281 + },
  282 + edit: function () {
  283 + Controller.api.bindevent();
  284 + },
  285 + detail: function () {
  286 + $(document).on('click', '.btn-callback', function () {
  287 + Fast.api.close($("input[name=callback]").val());
  288 + });
  289 + },
  290 + api: {
  291 + bindevent: function () {
  292 + Form.api.bindevent($("form[role=form]"));
  293 + },
  294 + formatter: {//渲染的方法
  295 + url: function (value, row, index) {
  296 + 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>';
  297 + },
  298 + ip: function (value, row, index) {
  299 + return '<a class="btn btn-xs btn-ip bg-success"><i class="fa fa-map-marker"></i> ' + value + '</a>';
  300 + },
  301 + custom: function (value, row, index) {
  302 + //添加上btn-change可以自定义请求的URL进行数据处理
  303 + 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>';
  304 + },
  305 + },
  306 + events: {//绑定事件的方法
  307 + ip: {
  308 + //格式为:方法名+空格+DOM元素
  309 + 'click .btn-ip': function (e, value, row, index) {
  310 + e.stopPropagation();
  311 + var container = $("#table").data("bootstrap.table").$container;
  312 + var options = $("#table").bootstrapTable('getOptions');
  313 + //这里我们手动将数据填充到表单然后提交
  314 + $("form.form-commonsearch [name='ip']", container).val(value);
  315 + $("form.form-commonsearch", container).trigger('submit');
  316 + Toastr.info("执行了自定义搜索操作");
  317 + }
  318 + },
  319 + }
  320 + }
  321 + };
  322 + return Controller;
  323 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + // 初始化表格参数配置
  6 + Table.api.init({
  7 + extend: {
  8 + index_url: 'example/colorbadge/index',
  9 + add_url: '',
  10 + edit_url: '',
  11 + del_url: 'example/colorbadge/del',
  12 + multi_url: '',
  13 + }
  14 + });
  15 +
  16 + var table = $("#table");
  17 +
  18 + // 初始化表格
  19 + table.bootstrapTable({
  20 + url: $.fn.bootstrapTable.defaults.extend.index_url,
  21 + columns: [
  22 + [
  23 + {field: 'state', checkbox: true, },
  24 + {field: 'id', title: 'ID'},
  25 + {field: 'title', title: __('Title')},
  26 + {field: 'ip', title: __('IP')},
  27 + {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  28 + {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  29 + ]
  30 + ],
  31 + onLoadSuccess: function (data) {
  32 + // 在表格第次加载成功后,刷新左侧菜单栏彩色小角标,支持一次渲染多个
  33 + // 如果需要在进入后台即显示左侧的彩色小角标,请使用服务端渲染方式,详情修改application/admin/controller/Index.php
  34 + Backend.api.sidebar({
  35 + 'example/colorbadge': data.total
  36 + });
  37 + Toastr.info("左侧角标已经刷新成功");
  38 + }
  39 + });
  40 +
  41 + // 为表格绑定事件
  42 + Table.api.bindevent(table);
  43 + },
  44 + add: function () {
  45 + Form.api.bindevent($("form[role=form]"));
  46 + },
  47 + edit: function () {
  48 + Form.api.bindevent($("form[role=form]"));
  49 + }
  50 + };
  51 + return Controller;
  52 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + // 初始化表格参数配置
  6 + Table.api.init({
  7 + extend: {
  8 + index_url: 'example/controllerjump/index',
  9 + add_url: '',
  10 + edit_url: '',
  11 + del_url: 'example/controllerjump/del',
  12 + multi_url: '',
  13 + }
  14 + });
  15 +
  16 + var table = $("#table");
  17 +
  18 + // 初始化表格
  19 + table.bootstrapTable({
  20 + url: $.fn.bootstrapTable.defaults.extend.index_url,
  21 + columns: [
  22 + [
  23 + {field: 'state', checkbox: true, },
  24 + {field: 'id', title: 'ID'},
  25 + {field: 'admin_id', title: __('Admin_id')},
  26 + {field: 'title', title: __('Title')},
  27 + {field: 'ip', title: __('IP'),formatter: Controller.api.formatter.ip},
  28 + {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  29 + {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  30 + ]
  31 + ]
  32 + });
  33 +
  34 + // 为表格绑定事件
  35 + Table.api.bindevent(table);
  36 + },
  37 + add: function () {
  38 + Form.api.bindevent($("form[role=form]"));
  39 + },
  40 + edit: function () {
  41 + Form.api.bindevent($("form[role=form]"));
  42 + },
  43 + api: {
  44 + formatter: {
  45 + ip: function (value, row, index) {
  46 + //这里手动构造URL
  47 + url = "example/bootstraptable?" + this.field + "=" + value;
  48 +
  49 + //方式一,直接返回class带有addtabsit的链接,这可以方便自定义显示内容
  50 + //return '<a href="' + url + '" class="label label-success addtabsit" title="' + __("Search %s", value) + '">' + __('Search %s', value) + '</a>';
  51 +
  52 + //方式二,直接调用Table.api.formatter.addtabs
  53 + this.url = url;
  54 + return Table.api.formatter.addtabs.call(this, value, row, index);
  55 + }
  56 + }
  57 + }
  58 + };
  59 + return Controller;
  60 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + Template.helper("Fast", Fast);
  6 +
  7 + //因为日期选择框不会触发change事件,导致无法刷新textarea,所以加上判断
  8 + $(document).on("dp.change", "#second-form .datetimepicker", function () {
  9 + $(this).parent().prev().find("input").trigger("change");
  10 + });
  11 + $(document).on("fa.event.appendfieldlist", "#first-table .btn-append", function (e, obj) {
  12 +
  13 + });
  14 + $(document).on("fa.event.appendfieldlist", "#second-table .btn-append", function (e, obj) {
  15 + //绑定动态下拉组件
  16 + Form.events.selectpage(obj);
  17 + //绑定日期组件
  18 + Form.events.datetimepicker(obj);
  19 + //绑定上传组件
  20 + Form.events.faupload(obj);
  21 +
  22 + //上传成功回调事件,变更按钮的背景
  23 + $(".upload-image", obj).data("upload-success", function (data) {
  24 + $(this).css("background-image", "url('" + Fast.api.cdnurl(data.url) + "')");
  25 + })
  26 + });
  27 + Form.api.bindevent($("form[role=form]"), function (data, ret) {
  28 + Layer.alert(data.data);
  29 + });
  30 + },
  31 + };
  32 + return Controller;
  33 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2 + var Controller = {
  3 + index: function () {
  4 + //
  5 + // 初始化表格参数配置
  6 + Table.api.init({
  7 + extend: {
  8 + index_url: 'example/customsearch/index',
  9 + add_url: 'example/customsearch/add',
  10 + edit_url: '',
  11 + del_url: 'example/customsearch/del',
  12 + multi_url: 'example/customsearch/multi',
  13 + table: '',
  14 + }
  15 + });
  16 +
  17 + var table = $("#table");
  18 +
  19 + // 初始化表格
  20 + table.bootstrapTable({
  21 + url: $.fn.bootstrapTable.defaults.extend.index_url,
  22 + pk: 'id',
  23 + sortName: 'id',
  24 + searchFormVisible: true,
  25 + searchFormTemplate: 'customformtpl',
  26 + columns: [
  27 + [
  28 + {checkbox: true},
  29 + {field: 'id', title: 'ID', operate: false},
  30 + {field: 'admin_id', title: __('Admin_id'), visible: false, operate: false},
  31 + {field: 'username', title: __('Username'), formatter: Table.api.formatter.search},
  32 + {field: 'title', title: __('Title')},
  33 + {field: 'url', title: __('Url'), align: 'left'},
  34 + {field: 'ip', title: __('IP')},
  35 + {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  36 + {
  37 + field: 'operate',
  38 + title: __('Operate'),
  39 + table: table,
  40 + events: Table.api.events.operate,
  41 + formatter: Table.api.formatter.operate
  42 + }
  43 + ]
  44 + ]
  45 + });
  46 +
  47 + // 为表格绑定事件
  48 + Table.api.bindevent(table);
  49 + },
  50 + add: function () {
  51 + Controller.api.bindevent();
  52 + },
  53 + edit: function () {
  54 + Controller.api.bindevent();
  55 + },
  56 + api: {
  57 + bindevent: function () {
  58 + Form.api.bindevent($("form[role=form]"));
  59 + }
  60 + }
  61 + };
  62 + return Controller;
  63 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + $("#cxselect-example .col-xs-12").each(function () {
  6 + $("textarea", this).val($(this).prev().prev().html().replace(/[ ]{2}/g, ''));
  7 + });
  8 +
  9 + //这里需要手动为Form绑定上元素事件
  10 + Form.api.bindevent($("form#cxselectform"));
  11 + }
  12 + };
  13 + return Controller;
  14 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template', 'echarts', 'echarts-theme'], function ($, undefined, Backend, Table, Form, Template, Echarts) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + //这句话在多选项卡统计表时必须存在,否则会导致影响的图表宽度不正确
  6 + $(document).on("click", ".charts-custom a[data-toggle=\"tab\"]", function () {
  7 + var that = this;
  8 + setTimeout(function () {
  9 + var id = $(that).attr("href");
  10 + var chart = Echarts.getInstanceByDom($(id)[0]);
  11 + chart.resize();
  12 + }, 0);
  13 + });
  14 +
  15 + // 基于准备好的dom,初始化echarts实例
  16 + var lineChart = Echarts.init(document.getElementById('line-chart'), 'walden');
  17 +
  18 + // 指定图表的配置项和数据
  19 + var option = {
  20 + xAxis: {
  21 + type: 'category',
  22 + data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  23 + },
  24 + yAxis: {
  25 + type: 'value'
  26 + },
  27 + series: [{
  28 + data: [49, 92, 61, 134, 90, 130, 120],
  29 + type: 'line'
  30 + }]
  31 + };
  32 +
  33 + // 使用刚指定的配置项和数据显示图表。
  34 + lineChart.setOption(option);
  35 + // 基于准备好的dom,初始化echarts实例
  36 + var areaChart = Echarts.init(document.getElementById('area-chart'), 'walden');
  37 +
  38 + // 指定图表的配置项和数据
  39 + var option = {
  40 + xAxis: {
  41 + type: 'category',
  42 + boundaryGap: false,
  43 + data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  44 + },
  45 + yAxis: {
  46 + type: 'value'
  47 + },
  48 + series: [{
  49 + data: [820, 932, 901, 934, 1290, 1330, 1320],
  50 + type: 'line',
  51 + areaStyle: {}
  52 + }]
  53 + };
  54 +
  55 + // 使用刚指定的配置项和数据显示图表。
  56 + areaChart.setOption(option);
  57 +
  58 + var pieChart = Echarts.init(document.getElementById('pie-chart'), 'walden');
  59 + var option = {
  60 + tooltip: {
  61 + trigger: 'item',
  62 + formatter: '{a} <br/>{b}: {c} ({d}%)'
  63 + },
  64 + legend: {
  65 + orient: 'vertical',
  66 + left: 10,
  67 + data: ['直接访问', '邮件营销', '联盟广告', '视频广告', '搜索引擎']
  68 + },
  69 + series: [
  70 + {
  71 + name: '访问来源',
  72 + type: 'pie',
  73 + radius: ['50%', '70%'],
  74 + avoidLabelOverlap: false,
  75 + label: {
  76 + normal: {
  77 + show: false,
  78 + position: 'center'
  79 + },
  80 + emphasis: {
  81 + show: true,
  82 + textStyle: {
  83 + fontSize: '30',
  84 + fontWeight: 'bold'
  85 + }
  86 + }
  87 + },
  88 + labelLine: {
  89 + normal: {
  90 + show: false
  91 + }
  92 + },
  93 + data: [
  94 + {value: 335, name: '直接访问'},
  95 + {value: 310, name: '邮件营销'},
  96 + {value: 234, name: '联盟广告'},
  97 + {value: 135, name: '视频广告'},
  98 + {value: 1548, name: '搜索引擎'}
  99 + ]
  100 + }
  101 + ]
  102 + };
  103 + // 使用刚指定的配置项和数据显示图表。
  104 + pieChart.setOption(option);
  105 +
  106 + var barChart = Echarts.init(document.getElementById('bar-chart'), 'walden');
  107 + option = {
  108 + legend: {},
  109 + tooltip: {},
  110 + dataset: {
  111 + source: [
  112 + ['产品销售', '2015', '2016', '2017'],
  113 + ['风扇', 43.3, 85.8, 93.7],
  114 + ['电视机', 83.1, 73.4, 55.1],
  115 + ['空调', 86.4, 65.2, 82.5],
  116 + ['冰箱', 72.4, 53.9, 39.1]
  117 + ]
  118 + },
  119 + xAxis: {type: 'category'},
  120 + yAxis: {},
  121 + // Declare several bar series, each will be mapped
  122 + // to a column of dataset.source by default.
  123 + series: [
  124 + {type: 'bar'},
  125 + {type: 'bar'},
  126 + {type: 'bar'}
  127 + ]
  128 + };
  129 + // 使用刚指定的配置项和数据显示图表。
  130 + barChart.setOption(option);
  131 +
  132 +
  133 + var barChart = Echarts.init(document.getElementById('simplebar-chart'));
  134 + option = {
  135 + xAxis: {
  136 + type: 'category',
  137 + axisLine: {
  138 + lineStyle: {
  139 + color: "#fff"
  140 + }
  141 + },
  142 + data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
  143 + },
  144 + yAxis: {
  145 + type: 'value',
  146 + axisLine: {
  147 + lineStyle: {
  148 + color: "#fff"
  149 + }
  150 + }
  151 + },
  152 + series: [{
  153 + data: [120, 200, 150, 80, 70, 110, 130],
  154 + type: 'bar',
  155 + itemStyle: {
  156 + color: "#fff",
  157 + opacity: 0.6
  158 + }
  159 + }]
  160 + };
  161 + // 使用刚指定的配置项和数据显示图表。
  162 + barChart.setOption(option);
  163 +
  164 + var barChart = Echarts.init(document.getElementById('smoothline-chart'));
  165 + option = {
  166 + textStyle: {
  167 + color: "#fff"
  168 + },
  169 + color: ['#fff'],
  170 + xAxis: {
  171 + type: 'category',
  172 + boundaryGap: false,
  173 + data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
  174 + axisLine: {
  175 + lineStyle: {
  176 + color: "#fff"
  177 + }
  178 + }
  179 + },
  180 + yAxis: {
  181 + type: 'value',
  182 + splitLine: {
  183 + show: false
  184 + },
  185 + axisLine: {
  186 + lineStyle: {
  187 + color: "#fff"
  188 + }
  189 + }
  190 + },
  191 + series: [{
  192 + data: [820, 932, 901, 934, 1290, 1330, 1320],
  193 + type: 'line',
  194 + smooth: true,
  195 + areaStyle: {
  196 + opacity: 0.4
  197 + }
  198 +
  199 + }]
  200 + };
  201 + // 使用刚指定的配置项和数据显示图表。
  202 + barChart.setOption(option);
  203 + }
  204 + };
  205 + return Controller;
  206 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + // 初始化表格参数配置
  6 + Table.api.init();
  7 +
  8 + //绑定事件
  9 + $('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
  10 + var panel = $($(this).attr("href"));
  11 + if (panel.length > 0) {
  12 + Controller.table[panel.attr("id")].call(this);
  13 + $(this).on('click', function (e) {
  14 + $($(this).attr("href")).find(".btn-refresh").trigger("click");
  15 + });
  16 + }
  17 + //移除绑定的事件
  18 + $(this).unbind('shown.bs.tab');
  19 + });
  20 +
  21 + //必须默认触发shown.bs.tab事件
  22 + $('ul.nav-tabs li.active a[data-toggle="tab"]').trigger("shown.bs.tab");
  23 + },
  24 + table: {
  25 + first: function () {
  26 + // 表格1
  27 + var table1 = $("#table1");
  28 + table1.bootstrapTable({
  29 + url: 'example/multitable/table1',
  30 + toolbar: '#toolbar1',
  31 + sortName: 'id',
  32 + search: false,
  33 + columns: [
  34 + [
  35 + {field: 'state', checkbox: true, },
  36 + {field: 'id', title: 'ID'},
  37 + {field: 'filename', title: __('Name')},
  38 + {field: 'imagewidth', title: __('Imagewidth')},
  39 + {field: 'imageheight', title: __('Imageheight')},
  40 + {field: 'mimetype', title: __('Mimetype')},
  41 + {field: 'operate', title: __('Operate'), table: table1, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  42 + ]
  43 + ]
  44 + });
  45 +
  46 + // 为表格1绑定事件
  47 + Table.api.bindevent(table1);
  48 + },
  49 + second: function () {
  50 + // 表格2
  51 + var table2 = $("#table2");
  52 + table2.bootstrapTable({
  53 + url: 'example/multitable/table2',
  54 + extend: {
  55 + index_url: '',
  56 + add_url: '',
  57 + edit_url: '',
  58 + del_url: '',
  59 + multi_url: '',
  60 + table: '',
  61 + },
  62 + toolbar: '#toolbar2',
  63 + sortName: 'id',
  64 + search: false,
  65 + columns: [
  66 + [
  67 + {field: 'id', title: 'ID'},
  68 + {field: 'title', title: __('Title')},
  69 + {field: 'url', title: __('Url'), align: 'left', formatter: Table.api.formatter.url},
  70 + {field: 'ip', title: __('ip')},
  71 + {field: 'createtime', title: __('Createtime'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  72 + ]
  73 + ]
  74 + });
  75 +
  76 + // 为表格2绑定事件
  77 + Table.api.bindevent(table2);
  78 + }
  79 + },
  80 + add: function () {
  81 + Controller.api.bindevent();
  82 + },
  83 + edit: function () {
  84 + Controller.api.bindevent();
  85 + },
  86 + api: {
  87 + bindevent: function () {
  88 + Form.api.bindevent($("form[role=form]"));
  89 + },
  90 + }
  91 + };
  92 + return Controller;
  93 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + // 初始化表格参数配置
  6 + Table.api.init({
  7 + extend: {
  8 + index_url: 'example/relationmodel/index',
  9 + add_url: '',
  10 + edit_url: '',
  11 + del_url: 'example/relationmodel/del',
  12 + multi_url: '',
  13 + }
  14 + });
  15 +
  16 + var table = $("#table");
  17 +
  18 + // 初始化表格
  19 + table.bootstrapTable({
  20 + url: $.fn.bootstrapTable.defaults.extend.index_url,
  21 + columns: [
  22 + [
  23 + {field: 'state', checkbox: true, },
  24 + {field: 'id', title: 'ID', operate: '='},
  25 + {field: 'title', title: __('Title'), operate: 'LIKE %...%', placeholder: '关键字,模糊搜索'},
  26 + {field: 'admin.avatar', title: __('Avatar'), operate: false, formatter: Table.api.formatter.image},
  27 + {field: 'admin.username', title: __('Username'), operate: 'FIND_IN_SET'},
  28 + {field: 'admin.nickname', title: __('Nickname'), operate: 'LIKE %...%', placeholder: '关键字,模糊搜索'},
  29 + {field: 'ip', title: __('IP'), operate: '='},
  30 + {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  31 + {field: 'admin.createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  32 + {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  33 + ]
  34 + ],
  35 + });
  36 +
  37 + // 为表格绑定事件
  38 + Table.api.bindevent(table);
  39 + },
  40 + add: function () {
  41 + Form.api.bindevent($("form[role=form]"));
  42 + },
  43 + edit: function () {
  44 + Form.api.bindevent($("form[role=form]"));
  45 + },
  46 + };
  47 + return Controller;
  48 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + // 初始化表格参数配置
  6 + Table.api.init();
  7 + this.table.first();
  8 + this.table.second();
  9 + },
  10 + table: {
  11 + first: function () {
  12 + // 表格1
  13 + var table1 = $("#table1");
  14 + table1.bootstrapTable({
  15 + url: 'example/tablelink/table1',
  16 + toolbar: '#toolbar1',
  17 + sortName: 'id',
  18 + search: false,
  19 + columns: [
  20 + [
  21 + // {field: 'state', checkbox: true,},
  22 + {field: 'id', title: 'ID'},
  23 + {field: 'username', title: __('Nickname')},
  24 + {
  25 + field: 'operate', title: __('Operate'), table: table1, events: Table.api.events.operate, buttons: [
  26 + {
  27 + name: 'log',
  28 + title: '日志列表',
  29 + text: '日志列表',
  30 + icon: 'fa fa-list',
  31 + classname: 'btn btn-primary btn-xs btn-click',
  32 + click: function (e, data) {
  33 + $("#myTabContent2 .form-commonsearch input[name='username']").val(data.username);
  34 + $("#myTabContent2 .btn-refresh").trigger("click");
  35 + }
  36 + }
  37 + ], formatter: Table.api.formatter.operate
  38 + }
  39 + ]
  40 + ]
  41 + });
  42 +
  43 + // 为表格1绑定事件
  44 + Table.api.bindevent(table1);
  45 + },
  46 + second: function () {
  47 + // 表格2
  48 + var table2 = $("#table2");
  49 + table2.bootstrapTable({
  50 + url: 'example/tablelink/table2',
  51 + extend: {
  52 + index_url: '',
  53 + add_url: '',
  54 + edit_url: '',
  55 + del_url: '',
  56 + multi_url: '',
  57 + table: '',
  58 + },
  59 + toolbar: '#toolbar2',
  60 + sortName: 'id',
  61 + search: false,
  62 + columns: [
  63 + [
  64 + {field: 'state', checkbox: true,},
  65 + {field: 'id', title: 'ID'},
  66 + {field: 'username', title: __('Nickname')},
  67 + {field: 'title', title: __('Title')},
  68 + {field: 'url', title: __('Url'), align: 'left', formatter: Table.api.formatter.url},
  69 + {field: 'ip', title: __('ip')},
  70 + {field: 'createtime', title: __('Createtime'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  71 + ]
  72 + ]
  73 + });
  74 +
  75 + // 为表格2绑定事件
  76 + Table.api.bindevent(table2);
  77 + }
  78 + },
  79 + };
  80 + return Controller;
  81 +});
  1 +define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function ($, undefined, Backend, Table, Form, Template) {
  2 +
  3 + var Controller = {
  4 + index: function () {
  5 + // 初始化表格参数配置
  6 + Table.api.init({
  7 + extend: {
  8 + index_url: 'example/tabletemplate/index',
  9 + add_url: '',
  10 + edit_url: '',
  11 + del_url: 'example/tabletemplate/del',
  12 + multi_url: '',
  13 + }
  14 + });
  15 +
  16 + var table = $("#table");
  17 +
  18 + Template.helper("Moment", Moment);
  19 +
  20 + // 初始化表格
  21 + table.bootstrapTable({
  22 + url: $.fn.bootstrapTable.defaults.extend.index_url,
  23 + templateView: true,
  24 + columns: [
  25 + [
  26 + {field: 'state', checkbox: true, },
  27 + {field: 'id', title: 'ID', operate: false},
  28 + //直接响应搜索
  29 + {field: 'username', title: __('Username'), formatter: Table.api.formatter.search},
  30 + //模糊搜索
  31 + {field: 'title', title: __('Title'), operate: 'LIKE %...%', placeholder: '模糊搜索,*表示任意字符', style: 'width:200px'},
  32 + //通过Ajax渲染searchList
  33 + {field: 'url', title: __('Url'), align: 'left', formatter: Controller.api.formatter.url},
  34 + //点击IP时同时执行搜索此IP,同时普通搜索使用下拉列表的形式
  35 + {field: 'ip', title: __('IP'), searchList: ['127.0.0.1', '127.0.0.2'], events: Controller.api.events.ip, formatter: Controller.api.formatter.ip},
  36 + //browser是一个不存在的字段
  37 + //通过formatter来渲染数据,同时为它添加上事件
  38 + {field: 'browser', title: __('Browser'), operate: false, events: Controller.api.events.browser, formatter: Controller.api.formatter.browser},
  39 + //启用时间段搜索
  40 + {field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass: 'datetimerange', sortable: true},
  41 + {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}
  42 + ],
  43 + ],
  44 + //禁用默认搜索
  45 + search: false,
  46 + //启用普通表单搜索
  47 + commonSearch: false,
  48 + //可以控制是否默认显示搜索单表,false则隐藏,默认为false
  49 + searchFormVisible: false,
  50 + //分页大小
  51 + pageSize: 12
  52 + });
  53 +
  54 + // 为表格绑定事件
  55 + Table.api.bindevent(table);
  56 +
  57 + //指定搜索条件
  58 + $(document).on("click", ".btn-toggle-view", function () {
  59 + var options = table.bootstrapTable('getOptions');
  60 + table.bootstrapTable('refreshOptions', {templateView: !options.templateView});
  61 + });
  62 +
  63 + //点击详情
  64 + $(document).on("click", ".btn-detail[data-id]", function () {
  65 + Backend.api.open('example/bootstraptable/detail/ids/' + $(this).data('id'), __('Detail'));
  66 + });
  67 +
  68 + //获取选中项
  69 + $(document).on("click", ".btn-selected", function () {
  70 + //在templateView的模式下不能调用table.bootstrapTable('getSelections')来获取选中的ID,只能通过下面的Table.api.selectedids来获取
  71 + Layer.alert(JSON.stringify(Table.api.selectedids(table)));
  72 + });
  73 + },
  74 + add: function () {
  75 + Controller.api.bindevent();
  76 + },
  77 + edit: function () {
  78 + Controller.api.bindevent();
  79 + },
  80 + api: {
  81 + bindevent: function () {
  82 + Form.api.bindevent($("form[role=form]"));
  83 + },
  84 + formatter: {
  85 + url: function (value, row, index) {
  86 + 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>';
  87 + },
  88 + ip: function (value, row, index) {
  89 + return '<a class="btn btn-xs btn-ip bg-success"><i class="fa fa-map-marker"></i> ' + value + '</a>';
  90 + },
  91 + browser: function (value, row, index) {
  92 + //这里我们直接使用row的数据
  93 + return '<a class="btn btn-xs btn-browser">' + row.useragent.split(" ")[0] + '</a>';
  94 + }
  95 + },
  96 + events: {
  97 + ip: {
  98 + 'click .btn-ip': function (e, value, row, index) {
  99 + var options = $("#table").bootstrapTable('getOptions');
  100 + //这里我们手动将数据填充到表单然后提交
  101 + $("#commonSearchContent_" + options.idTable + " form [name='ip']").val(value);
  102 + $("#commonSearchContent_" + options.idTable + " form").trigger('submit');
  103 + Toastr.info("执行了自定义搜索操作");
  104 + }
  105 + },
  106 + browser: {
  107 + 'click .btn-browser': function (e, value, row, index) {
  108 + Layer.alert("该行数据为: <code>" + JSON.stringify(row) + "</code>");
  109 + }
  110 + }
  111 + }
  112 + }
  113 + };
  114 + return Controller;
  115 +});
@@ -90,7 +90,18 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function @@ -90,7 +90,18 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
90 title: __('Operate'), 90 title: __('Operate'),
91 table: table, 91 table: table,
92 events: Table.api.events.operate, 92 events: Table.api.events.operate,
93 - formatter: Table.api.formatter.operate, 93 + formatter: function(value,row,index){
  94 + var that = $.extend({},this);
  95 + var table = $(that.table).clone(true);
  96 + //隐藏编辑按钮
  97 + if(row.type>1){
  98 + if(row.intended_driver_id>0){
  99 + $(table).data("operate-edit",null);
  100 + }
  101 + }
  102 + that.table = table;
  103 + return Table.api.formatter.operate.call(that,value,row,index);
  104 + },
94 buttons: [ 105 buttons: [
95 { 106 {
96 name: 'ajax', 107 name: 'ajax',
@@ -104,16 +115,26 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function @@ -104,16 +115,26 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'template'], function
104 url: 'order/refund?id={id}', 115 url: 'order/refund?id={id}',
105 116
106 }, 117 },
107 - {  
108 - name: 'selectiondriver',  
109 - text:"选择司机",  
110 - title: "选择司机",  
111 - extend:'data-area=["94%","94%"]',  
112 - classname: 'btn btn-xs btn-primary btn-dialog',  
113 - icon: 'fa fa-recipt',  
114 - url: 'order/selectiondriver?id={id}',  
115 -  
116 - } 118 + // {
  119 + // name: 'selectiondriver',
  120 + // title: __('选择司机'),
  121 + // classname: 'btn btn-xs btn-primary btn-dialog',
  122 + // icon: 'fa fa-list',
  123 + // url: 'order/selectiondriver?id={id}',
  124 + // callback: function (data) {
  125 + // Layer.alert("接收到回传数据:" + JSON.stringify(data), {title: "回传数据"});
  126 + // }
  127 + // },
  128 + // {
  129 + // name: 'selectiondriver',
  130 + // text:"选择司机",
  131 + // title: "选择司机",
  132 + // extend:'data-area=["94%","94%"]',
  133 + // classname: 'btn btn-xs btn-primary btn-dialog',
  134 + // icon: 'fa fa-recipt',
  135 + // url: 'order/selectiondriver?id={id}',
  136 + //
  137 + // }
117 ] 138 ]
118 }] 139 }]
119 ] 140 ]