作者 Karson

新增表格自定义搜索的示例

新增微信菜单编辑在未配置事件时的错误提示
新增renderer的meta
修复模板示例显示时间的BUG
修复多级联动在不选中值时的BUG
修复测试邮件收件人错误的BUG
修复表格筛选按钮禁用时不能选中首列的BUG
修复summernote使用源码模式下的BUG
修复安装时下载链接错误的BUG
修复前端require-frontend.js中的配置问题
... ... @@ -437,16 +437,20 @@ class Ajax extends Backend
$type = $this->request->get('type');
$pid = $this->request->get('pid');
$where = ['status' => 'normal'];
if ($type)
{
$where['type'] = $type;
}
if ($pid)
$categorylist = null;
if ($pid !== '')
{
$where['pid'] = $pid;
}
if ($type)
{
$where['type'] = $type;
}
if ($pid)
{
$where['pid'] = $pid;
}
$categorylist = Db::name('category')->where($where)->field('id as value,name')->order('weigh desc,id desc')->select();
$categorylist = Db::name('category')->where($where)->field('id as value,name')->order('weigh desc,id desc')->select();
}
$this->code = 1;
$this->data = $categorylist;
return;
... ... @@ -460,17 +464,24 @@ class Ajax extends Backend
$province = $this->request->get('province');
$city = $this->request->get('city');
$where = ['pid' => 0, 'level' => 1];
if ($province)
$provincelist = null;
if ($province !== '')
{
$where['pid'] = $province;
$where['level'] = 2;
}
if ($city)
{
$where['pid'] = $city;
$where['level'] = 3;
if ($province)
{
$where['pid'] = $province;
$where['level'] = 2;
}
if ($city !== '')
{
if ($city)
{
$where['pid'] = $city;
$where['level'] = 3;
}
$provincelist = Db::name('area')->where($where)->field('id as value,name')->select();
}
}
$provincelist = Db::name('area')->where($where)->field('id as value,name')->select();
$this->code = 1;
$this->data = $provincelist;
return;
... ...
... ... @@ -24,15 +24,16 @@ class Category extends Backend
$this->model = model('Category');
$tree = Tree::instance();
$tree->init(CategoryModel::getCategoryArray(), 'pid');
$tree->init($this->model->order('weigh desc,id desc')->select(), 'pid');
$this->categorylist = $tree->getTreeList($tree->getTreeArray(0), 'name');
$categorydata = [0 => __('None')];
foreach ($this->categorylist as $k => $v)
{
$categorydata[$v['id']] = $v['name'];
}
$this->view->assign("typelist", CategoryModel::getTypeList());
$this->view->assign("parentlist", $categorydata);
$this->view->assign("flagList", $this->model->getFlagList());
$this->view->assign("typeList", CategoryModel::getTypeList());
$this->view->assign("parentList", $categorydata);
}
/**
... ...
... ... @@ -3,7 +3,6 @@
namespace app\admin\controller\wechat;
use app\common\controller\Backend;
use app\common\model\Configvalue;
use app\common\model\WechatResponse;
use EasyWeChat\Foundation\Application;
use think\Config;
... ... @@ -64,19 +63,47 @@ class Menu extends Backend
try
{
$ret = $app->menu->add(json_decode($this->wechatcfg->value, TRUE));
if ($ret->errcode == 0)
$hasError = false;
$menu = json_decode($this->wechatcfg->value, TRUE);
foreach ($menu as $k => $v)
{
$this->code = 1;
if (isset($v['sub_button']))
{
foreach ($v['sub_button'] as $m => $n)
{
if (isset($n['key']) && !$n['key'])
{
$hasError = true;
break 2;
}
}
}
else if (isset($v['key']) && !$v['key'])
{
$hasError = true;
break;
}
}
if (!$hasError)
{
$ret = $app->menu->add($menu);
if ($ret->errcode == 0)
{
$this->code = 1;
}
else
{
$this->msg = $ret->errmsg;
}
}
else
{
$this->content = $ret->errmsg;
$this->msg = __('Invalid parameters');
}
}
catch (Exception $e)
{
$this->content = $e->getMessage();
$this->msg = $e->getMessage();
}
return;
}
... ...
<?php
return [
'Diyname' => '自定义别名',
'Keywords' => '关键字',
'Description' => '描述',
'keywords' => '关键字',
'Pid' => '父ID',
'Type' => '栏目类型',
'Image' => '图片',
'Keywords' => '关键字',
'Description' => '描述',
'Diyname' => '自定义名称',
'Createtime' => '创建时间',
'Updatetime' => '更新时间',
'Weigh' => '权重',
'Status' => '状态'
];
... ...
<?php
namespace app\admin\validate;
use think\Validate;
class Category extends Validate
{
/**
* 验证规则
*/
protected $rule = [
];
/**
* 提示消息
*/
protected $message = [
];
/**
* 验证场景
*/
protected $scene = [
'add' => [],
'edit' => [],
];
}
... ...
<form id="add-form" role="form" data-toggle="validator" method="POST" action="">
<div class="row">
<div class="col-xs-12 col-sm-6">
<div class="form-group">
<label for="type" class="control-label">{:__('Type')}:</label>
{:build_select('row[type]', $typelist, [], ['id'=>'c-type','class'=>'form-control selectpicker','data-rule'=>'required'])}
</div>
<div class="form-group">
<label for="title" class="control-label">{:__('Name')}:</label>
<input type="text" class="form-control" id="name" name="row[name]" value="" data-rule="required" />
</div>
<div class="form-group">
<label for="nickname" class="control-label">{:__('Nickname')}:</label>
<input type="text" class="form-control" id="nickname" name="row[nickname]" value="" data-rule="required" />
</div>
<div class="form-group">
<label for="keywords" class="control-label">{:__('Keywords')}:</label>
<input type="text" class="form-control" id="keywords" name="row[keywords]" value="" />
</div>
<div class="form-group">
<label for="description" class="control-label">{:__('Description')}:</label>
<textarea name="row[description]" id="description" class="form-control" cols="30" rows="3"></textarea>
</div>
<div class="row">
<div class="col-sm-4">
<div class="form-group form-inline">
<label for="weigh" class="control-label">{:__('Weigh')}:</label>
<input type="text" class="form-control" id="weigh" name="row[weigh]" value="0" data-rule="required" size="3" />
</div>
</div>
</div>
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
<div class="form-group">
<label for="c-type" class="control-label col-xs-12 col-sm-2">{:__('Type')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-type" data-rule="required" class="form-control selectpicker" name="row[type]">
{foreach name="typeList" item="vo"}
<option value="{$key}" {in name="key" value=""}selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
<div class="col-xs-12 col-sm-6">
</div>
<div class="form-group">
<label for="c-pid" class="control-label col-xs-12 col-sm-2">{:__('Pid')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-flag" data-rule="required" class="form-control selectpicker" name="row[pid]">
{foreach name="parentList" item="vo"}
<option value="{$key}" {in name="key" value=""}selected{/in}>{$vo}</option>
{/foreach}
</select>
<div class="form-group">
<label for="pid" class="control-label">{:__('Parent')}:</label>
{:build_select('row[pid]', $parentlist, null, ['id'=>'c-pid','class'=>'form-control selectpicker','data-rule'=>'required'])}
</div>
<div class="form-group">
<label for="c-flag" class="control-label">{:__('Flag')}:</label>
{:build_select('row[flag]', ['recommend'=>__('Recommend'), 'index'=>__('Index'), 'hot'=>__('Hot')], null, ['id'=>'c-flag','class'=>'form-control selectpicker','data-rule'=>'required'])}
</div>
<div class="form-group">
<label for="content" class="control-label">{:__('Status')}:</label>
<div>
{:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')])}
</div>
</div>
</div>
<div class="form-group">
<label for="c-name" class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text" value="">
</div>
</div>
<div class="form-group">
<label for="c-nickname" class="control-label col-xs-12 col-sm-2">{:__('Nickname')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-nickname" data-rule="required" class="form-control" name="row[nickname]" type="text" value="">
</div>
</div>
<div class="form-group">
<label for="c-flag" class="control-label col-xs-12 col-sm-2">{:__('Flag')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-flag" class="form-control selectpicker" multiple="" name="row[flag][]">
{foreach name="flagList" item="vo"}
<option value="{$key}" {in name="key" value=""}selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label for="c-image" class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="form-inline">
<input id="c-image" class="form-control" size="50" name="row[image]" type="text" value="">
<span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/*" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
<ul class="row list-inline plupload-preview" id="p-image"></ul>
</div>
</div>
</div>
<div class="form-group hidden layer-footer">
<div class="form-group">
<label for="c-keywords" class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-keywords" class="form-control" name="row[keywords]" type="text" value="">
</div>
</div>
<div class="form-group">
<label for="c-description" class="control-label col-xs-12 col-sm-2">{:__('Description')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-description" class="form-control" name="row[description]"></textarea>
</div>
</div>
<div class="form-group">
<label for="c-weigh" class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-weigh" class="form-control" name="row[weigh]" type="number" value="0">
</div>
</div>
<div class="form-group">
<label for="c-status" class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
<div class="col-xs-12 col-sm-8">
{:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')])}
</div>
</div>
<div class="form-group layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
... ...
<form id="add-form" role="form" data-toggle="validator" method="POST" action="">
<div class="row">
<div class="col-xs-12 col-sm-6">
<div class="form-group">
<label for="type" class="control-label">{:__('Type')}:</label>
{:build_select('row[type]', $typelist, $row['type'], ['id'=>'c-type','class'=>'form-control selectpicker','data-rule'=>'required'])}
</div>
<div class="form-group">
<label for="title" class="control-label">{:__('Name')}:</label>
<input type="text" class="form-control" id="name" name="row[name]" value="{$row.name}" data-rule="required" />
</div>
<div class="form-group">
<label for="nickname" class="control-label">{:__('Nickname')}:</label>
<input type="text" class="form-control" id="nickname" name="row[nickname]" value="{$row.nickname}" data-rule="required" />
</div>
<div class="form-group">
<label for="keywords" class="control-label">{:__('Keywords')}:</label>
<input type="text" class="form-control" id="keywords" name="row[keywords]" value="{$row.keywords}" />
</div>
<div class="form-group">
<label for="description" class="control-label">{:__('Description')}:</label>
<textarea name="row[description]" id="description" class="form-control" cols="30" rows="3">{$row.description}</textarea>
</div>
<div class="row">
<div class="col-sm-4">
<div class="form-group form-inline">
<label for="weigh" class="control-label">{:__('Weigh')}:</label>
<input type="text" class="form-control" id="weigh" name="row[weigh]" value="{$row.weigh}" data-rule="required" size="3" />
</div>
</div>
</div>
<form id="edit-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="">
<div class="form-group">
<label for="c-type" class="control-label col-xs-12 col-sm-2">{:__('Type')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-type" data-rule="required" class="form-control selectpicker" name="row[type]">
{foreach name="typeList" item="vo"}
<option value="{$key}" {in name="key" value="$row.type"}selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
<div class="col-xs-12 col-sm-6">
</div>
<div class="form-group">
<label for="c-pid" class="control-label col-xs-12 col-sm-2">{:__('Pid')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-flag" data-rule="required" class="form-control selectpicker" name="row[pid]">
{foreach name="parentList" item="vo"}
<option value="{$key}" {in name="key" value="$row.pid"}selected{/in}>{$vo}</option>
{/foreach}
</select>
<div class="form-group">
<label for="pid" class="control-label">{:__('Parent')}:</label>
{:build_select('row[pid]', $parentlist, $row['pid'], ['id'=>'c-pid','class'=>'form-control selectpicker','data-rule'=>'required'])}
</div>
<div class="form-group">
<label for="c-flag" class="control-label">{:__('Flag')}:</label>
{:build_select('row[flag]', ['recommend'=>__('Recommend'), 'index'=>__('Index'), 'hot'=>__('Hot')], $row['flag'], ['id'=>'c-flag','class'=>'form-control selectpicker','data-rule'=>'required'])}
</div>
<div class="form-group">
<label for="content" class="control-label">{:__('Status')}:</label>
<div>
{:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')], $row['status'])}
</div>
</div>
</div>
<div class="form-group">
<label for="c-name" class="control-label col-xs-12 col-sm-2">{:__('Name')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-name" data-rule="required" class="form-control" name="row[name]" type="text" value="{$row.name}">
</div>
</div>
<div class="form-group">
<label for="c-nickname" class="control-label col-xs-12 col-sm-2">{:__('Nickname')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-nickname" data-rule="required" class="form-control" name="row[nickname]" type="text" value="{$row.nickname}">
</div>
</div>
<div class="form-group">
<label for="c-flag" class="control-label col-xs-12 col-sm-2">{:__('Flag')}:</label>
<div class="col-xs-12 col-sm-8">
<select id="c-flag" class="form-control selectpicker" multiple="" name="row[flag][]">
{foreach name="flagList" item="vo"}
<option value="{$key}" {in name="key" value="$row.flag"}selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label for="c-image" class="control-label col-xs-12 col-sm-2">{:__('Image')}:</label>
<div class="col-xs-12 col-sm-8">
<div class="form-inline">
<input id="c-image" class="form-control" size="50" name="row[image]" type="text" value="{$row.image}">
<span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-mimetype="image/*" data-multiple="false" data-preview-id="p-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
<span><button type="button" id="fachoose-image" class="btn btn-primary fachoose" data-input-id="c-image" data-mimetype="image/*" data-multiple="false"><i class="fa fa-list"></i> {:__('Choose')}</button></span>
<ul class="row list-inline plupload-preview" id="p-image"></ul>
</div>
</div>
</div>
<div class="form-group hidden layer-footer">
<div class="form-group">
<label for="c-keywords" class="control-label col-xs-12 col-sm-2">{:__('Keywords')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-keywords" class="form-control" name="row[keywords]" type="text" value="{$row.keywords}">
</div>
</div>
<div class="form-group">
<label for="c-description" class="control-label col-xs-12 col-sm-2">{:__('Description')}:</label>
<div class="col-xs-12 col-sm-8">
<textarea id="c-description" class="form-control" name="row[description]">{$row.description}</textarea>
</div>
</div>
<div class="form-group">
<label for="c-weigh" class="control-label col-xs-12 col-sm-2">{:__('Weigh')}:</label>
<div class="col-xs-12 col-sm-8">
<input id="c-weigh" class="form-control" name="row[weigh]" type="number" value="{$row.weigh}">
</div>
</div>
<div class="form-group">
<label for="c-status" class="control-label col-xs-12 col-sm-2">{:__('Status')}:</label>
<div class="col-xs-12 col-sm-8">
{:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')], $row['status'])}
</div>
</div>
<div class="form-group layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-success btn-embossed disabled">{:__('OK')}</button>
... ...
<meta charset="utf-8">
<title>{$title|default=''}</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="renderer" content="webkit">
<link rel="shortcut icon" href="__CDN__/assets/img/favicon.ico" />
<!-- Loading Bootstrap -->
... ...
... ... @@ -8,7 +8,6 @@
<div id="toolbar" class="toolbar">
{:build_toolbar('refresh,delete')}
<a class="btn btn-info btn-disabled disabled btn-selected" href="javascript:;"><i class="fa fa-leaf"></i> 获取选中项</a>
<a class="btn btn-success btn-singlesearch" href="javascript:;"><i class="fa fa-leaf"></i> 单独设置搜索条件</a>
<div class="dropdown btn-group">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> <?= __('More') ?></a>
<ul class="dropdown-menu text-left" role="menu">
... ... @@ -16,6 +15,7 @@
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
</ul>
</div>
<a class="btn btn-success btn-singlesearch" href="javascript:;"><i class="fa fa-user"></i> 自定义搜索</a>
<a class="btn btn-success btn-change btn-start" data-params="action=start" data-url="example/bootstraptable/change" href="javascript:;"><i class="fa fa-play"></i> 启动</a>
<a class="btn btn-danger btn-change btn-pause" data-params="action=pause" data-url="example/bootstraptable/change" href="javascript:;"><i class="fa fa-pause"></i> 暂停</a>
</div>
... ...
... ... @@ -48,7 +48,7 @@
<div class="caption">
<h4><%=item.title?item.title:'无'%></h4>
<p class="text-muted">操作者IP:<%=item.ip%></p>
<p class="text-muted">操作时间:<%=Moment(item.createtime).format("YYYY-MM-DD HH:mm:ss")%></p>
<p class="text-muted">操作时间:<%=Moment(item.createtime*1000).format("YYYY-MM-DD HH:mm:ss")%></p>
<p>
<!--详情的事件需要在JS中手动绑定-->
<a href="#" class="btn btn-primary btn-success btn-detail" data-id="<%=item.id%>"><i class="fa fa-camera"></i> 详情</a>
... ...
... ... @@ -177,7 +177,7 @@ class Email
$headers .= "Content-type: text/html; charset=" . $this->options['charset'] . "\r\n";
$headers .= "To: {$this->options['to_name']} <{$this->options['to']}>\r\n"; //收件人
$headers .= "From: {$this->options['from_name']} <{$this->options['from']}>\r\n"; //发件人
$result = mail($this->options['mail_to'], $this->options['subject'], $this->options['body'], $headers);
$result = mail($this->options['to'], $this->options['subject'], $this->options['body'], $headers);
$this->setError($result ? '' : error_get_last()['message']);
break;
default:
... ...
... ... @@ -15,8 +15,11 @@ class Category Extends Model
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
// 定义字段类型
protected $type = [
// 追加属性
protected $append = [
'type_text',
'flag_text',
];
/**
... ... @@ -29,6 +32,26 @@ class Category Extends Model
return $typelist;
}
public function getTypeTextAttr($value, $data)
{
$value = $value ? $value : $data['type'];
$list = $this->getTypeList();
return isset($list[$value]) ? $list[$value] : '';
}
public function getFlagList()
{
return ['hot' => __('Hot'), 'index' => __('Index'), 'recommend' => __('Recommend')];
}
public function getFlagTextAttr($value, $data)
{
$value = $value ? $value : $data['flag'];
$valueArr = explode(',', $value);
$list = $this->getFlagList();
return implode(',', array_intersect_key($list, array_flip($valueArr)));
}
/**
* 读取分类列表
* @param string $type 指定类型
... ... @@ -37,8 +60,7 @@ class Category Extends Model
*/
public static function getCategoryArray($type = NULL, $status = NULL)
{
$list = collection(self::where(function($query) use($type, $status)
{
$list = collection(self::where(function($query) use($type, $status) {
if (!is_null($type))
{
$query->where('type', '=', $type);
... ...
... ... @@ -5,6 +5,7 @@
<title>FastAdmin</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="基于ThinkPHP5和Bootstrap的极速后台开发框架">
<meta name="renderer" content="webkit">
<link rel="shortcut icon" href="__CDN__/assets/img/favicon.ico" />
<!-- Loading Bootstrap -->
<link href="__CDN__/assets/css/frontend{$Think.config.app_debug?'':'.min'}.css?v={$Think.config.site.version}" rel="stylesheet">
... ...
... ... @@ -4,6 +4,7 @@
<title>会员中心</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="renderer" content="webkit" />
<link href="__CDN__/assets/css/bootstrap.min.css" rel="stylesheet" />
<link href="__CDN__/assets/css/fastadmin.min.css" rel="stylesheet" />
<link href="__CDN__/assets/libs/font-awesome/css/font-awesome.min.css" rel="stylesheet" />
... ...
... ... @@ -409,9 +409,11 @@ table.table-template {
.fixed-table-container {
border: none!important;
}
.note-editor .note-editing-area .note-editable {
display: block !important;
/*修复nice-validator和summernote的编辑框冲突*/
.nice-validator .note-editor .note-editing-area .note-editable {
display: inherit;
}
/*预览区域*/
.plupload-preview {
padding: 10px;
margin-bottom: 0;
... ...
define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefined, Backend, Form, Table) {
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {
var Controller = {
index: function () {
... ... @@ -10,7 +10,7 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
edit_url: 'category/edit',
del_url: 'category/del',
multi_url: 'category/multi',
table: 'category'
table: 'category',
}
});
... ... @@ -19,28 +19,25 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
// 初始化表格
table.bootstrapTable({
url: $.fn.bootstrapTable.defaults.extend.index_url,
pk: 'id',
sortName: 'weigh',
columns: [
[
{field: 'state', checkbox: true, },
{field: 'id', title: 'ID'},
{field: 'name', title: __('Name'), align: 'left'},
{field: 'nickname', title: __('Nickname')},
{field: 'id', title: __('Id')},
{field: 'type', title: __('Type')},
{field: 'flag', title: __('Flag'), formatter: Table.api.formatter.flag},
{field: 'name', title: __('Name'), align:'left'},
{field: 'nickname', title: __('Nickname')},
{field: 'flag_text', title: __('Flag'), operate:false, formatter: Table.api.formatter.label},
{field: 'image', title: __('Image'), formatter: Table.api.formatter.image},
{field: 'weigh', title: __('Weigh')},
{field: 'status', title: __('Status'), formatter: Table.api.formatter.status},
{field: 'operate', title: __('Operate'), events: Table.api.events.operate, formatter: Table.api.formatter.operate}
]
],
pagination: false,
search: false,
commonSearch: false,
]
});
// 为表格绑定事件
Table.api.bindevent(table);
},
add: function () {
Controller.api.bindevent();
... ... @@ -53,7 +50,6 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
Form.api.bindevent($("form[role=form]"));
}
}
};
return Controller;
});
\ No newline at end of file
... ...
... ... @@ -30,7 +30,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
//模糊搜索
{field: 'title', title: __('Title'), operate: 'LIKE %...%', placeholder: '模糊搜索,*表示任意字符', style: 'width:200px'},
//通过Ajax渲染searchList,也可以使用JSON数据
{field: 'url', title: __('Url'), align: 'left', defaultValue: 3, searchList: $.getJSON('ajax/typeahead?search=a&field=row[user_id]'), formatter: Controller.api.formatter.url},
{field: 'url', title: __('Url'), align: 'left', searchList: $.getJSON('ajax/typeahead?search=a&field=row[user_id]'), formatter: Controller.api.formatter.url},
//点击IP时同时执行搜索此IP,同时普通搜索使用下拉列表的形式
{field: 'ip', title: __('IP'), searchList: ['127.0.0.1', '127.0.0.2'], events: Controller.api.events.ip, formatter: Controller.api.formatter.ip},
//自定义栏位
... ... @@ -41,7 +41,9 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
//启用时间段搜索
{field: 'createtime', title: __('Create time'), formatter: Table.api.formatter.datetime, operate: 'BETWEEN', type: 'datetime', addclass: 'datetimepicker', data: 'data-date-format="YYYY-MM-DD HH:mm:ss"'},
//我们向操作栏额外添加上一个详情按钮,并保留已有的编辑和删除控制,同时为这个按钮添加上点击事件
{field: 'operate', title: __('Operate'), events: Controller.api.events.operate, formatter: Controller.api.formatter.operate}
{field: 'operate', title: __('Operate'), events: Controller.api.events.operate, formatter: function (value, row, index) {
return Table.api.formatter.operate.call(this, value, row, index, table);
}}
],
],
//禁用默认搜索
... ... @@ -51,10 +53,10 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
//可以控制是否默认显示搜索单表,false则隐藏,默认为false
searchFormVisible: true
});
//在表格内容渲染完成后回调的事件
table.on('post-body.bs.table', function (e, settings, json, xhr) {
});
// 为表格绑定事件
... ... @@ -62,14 +64,29 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
//指定搜索条件
$(document).on("click", ".btn-singlesearch", function () {
table.bootstrapTable('refresh', {query: {filter: JSON.stringify({url: '/admin/index/login.html'}), op: JSON.stringify({url: '='})}});
var options = table.bootstrapTable('getOptions');
options.pageNumber = 1;
options.queryParams = function (params) {
return {
search: params.search,
sort: params.sort,
order: params.order,
filter: JSON.stringify({admin_id: 1}),
op: JSON.stringify({admin_id: '='}),
offset: params.offset,
limit: params.limit,
};
};
table.bootstrapTable('refresh', {});
Toastr.info("当前执行的是自定义搜索");
return false;
});
//获取选中项
$(document).on("click", ".btn-selected", function () {
Layer.alert(JSON.stringify(table.bootstrapTable('getSelections')));
});
//启动和暂停按钮
$(document).on("click", ".btn-start,.btn-pause", function () {
//在table外不可以使用添加.btn-change的方法
... ... @@ -116,10 +133,12 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
//格式为:方法名+空格+DOM元素
'click .btn-ip': function (e, value, row, index) {
e.stopPropagation();
console.log();
var container = $("#table").data("bootstrap.table").$container;
var options = $("#table").bootstrapTable('getOptions');
//这里我们手动将数据填充到表单然后提交
$("#commonSearchContent_" + options.idTable + " form [name='ip']").val(value);
$("#commonSearchContent_" + options.idTable + " form").trigger('submit');
$("form.form-commonsearch [name='ip']", container).val(value);
$("form.form-commonsearch", container).trigger('submit');
Toastr.info("执行了自定义搜索操作");
}
},
... ...
... ... @@ -254,7 +254,6 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'sortable'], function
});
$(document).on('click', "#menuSyn", function () {
$.post("wechat/menu/sync", {}, function (ret) {
var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
if (ret.code == 1) {
Backend.api.toastr.success('菜单同步更新成功,生效时间看微信官网说明,或者你重新关注微信号!');
... ...
... ... @@ -7800,31 +7800,33 @@ define('table',['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap
$(Table.config.refreshbtn, toolbar).find(".fa").removeClass("fa-spin");
$(Table.config.disabledbtn, toolbar).toggleClass('disabled', true);
// 挺拽选择,需要重新绑定事件
require(['drag', 'drop'], function () {
$(Table.config.firsttd, table).drag("start", function (ev, dd) {
return $('<div class="selection" />').css('opacity', .65).appendTo(document.body);
}).drag(function (ev, dd) {
$(dd.proxy).css({
top: Math.min(ev.pageY, dd.startY),
left: Math.min(ev.pageX, dd.startX),
height: Math.abs(ev.pageY - dd.startY),
width: Math.abs(ev.pageX - dd.startX)
if ($(Table.config.firsttd, table).find("input[type='checkbox'][data-index]").size() > 0) {
// 挺拽选择,需要重新绑定事件
require(['drag', 'drop'], function () {
$(Table.config.firsttd, table).drag("start", function (ev, dd) {
return $('<div class="selection" />').css('opacity', .65).appendTo(document.body);
}).drag(function (ev, dd) {
$(dd.proxy).css({
top: Math.min(ev.pageY, dd.startY),
left: Math.min(ev.pageX, dd.startX),
height: Math.abs(ev.pageY - dd.startY),
width: Math.abs(ev.pageX - dd.startX)
});
}).drag("end", function (ev, dd) {
$(dd.proxy).remove();
});
$(Table.config.firsttd, table).drop("start", function () {
Table.api.toggleattr(this);
}).drop(function () {
Table.api.toggleattr(this);
}).drop("end", function () {
Table.api.toggleattr(this);
});
$.drop({
multi: true
});
}).drag("end", function (ev, dd) {
$(dd.proxy).remove();
});
$(Table.config.firsttd, table).drop("start", function () {
Table.api.toggleattr(this);
}).drop(function () {
Table.api.toggleattr(this);
}).drop("end", function () {
Table.api.toggleattr(this);
});
$.drop({
multi: true
});
});
}
});
// 处理选中筛选框后按钮的状态统一变更
... ... @@ -12049,6 +12051,9 @@ define("addtabs", function(){});
if ($(elem.combo_input).attr('placeholder'))
$(elem.combo_input).attr('placeholder_bak', $(elem.combo_input).attr('placeholder'));
}
if ($(elem.container).parent().hasClass("input-group")) {
$(elem.container).height($(elem.container).parent().height());
}
this.elem = elem;
},
... ... @@ -12104,16 +12109,30 @@ define("addtabs", function(){});
data = null;
self._afterInit(self, data);
} else {
var _paramsFunc = self.option.params;
var _params = {};
//原始参数
var _orgParams = {
db_table: self.option.db_table,
field: self.option.field,
order_by: self.option.order_by,
pkey_name: self.option.primary_key,
pkey_value: self.option.init_record
};
if (_paramsFunc) {
var result = $.isFunction(_paramsFunc) ? _paramsFunc() : _paramsFunc;
if (result && $.isPlainObject(result)) {
_params = $.extend({}, _orgParams, result);
} else {
_params = _orgParams;
}
} else {
_params = _orgParams;
}
$.ajax({
dataType: 'json',
url: self.option.source,
data: {
db_table: self.option.db_table,
field: self.option.field,
order_by: self.option.order_by,
pkey_name: self.option.primary_key,
pkey_value: self.option.init_record
},
data: _params,
success: function (json) {
if (typeof json.list !== 'undefined' && $.isArray(json.list)) {
self._afterInit(self, json.list);
... ... @@ -13562,3 +13581,4 @@ define("addtabs", function(){});
});
return SelectPage;
}));
... ...
... ... @@ -12,12 +12,14 @@ require.config({
'form': 'require-form',
'table': 'require-table',
'upload': 'require-upload',
'validator': 'require-validator',
'drag': 'jquery.drag.min',
'drop': 'jquery.drop.min',
'echarts': 'echarts.min',
'echarts-theme': 'echarts-theme',
'adminlte': 'adminlte',
'bootstrap-table-commonsearch': 'bootstrap-table-commonsearch',
'bootstrap-table-template': 'bootstrap-table-template',
//
// 以下的包从bower的libs目录加载
'jquery': '../libs/jquery/dist/jquery.min',
... ... @@ -39,19 +41,25 @@ require.config({
'slimscroll': '../libs/jquery-slimscroll/jquery.slimscroll',
'crontab': '../libs/jqcron/src/jqCron.cn',
'summernote': '../libs/summernote/dist/lang/summernote-zh-CN.min',
'validator': '../libs/nice-validator/dist/jquery.validator.js?local=zh-CN',
'validator-core': '../libs/nice-validator/dist/jquery.validator',
'validator-lang': '../libs/nice-validator/dist/local/zh-CN',
'plupload': '../libs/plupload/js/plupload.min',
'toastr': '../libs/toastr/toastr',
'jstree': '../libs/jstree/dist/jstree.min',
'layer': '../libs/layer/src/layer',
'cookie': '../libs/jquery.cookie/jquery.cookie',
'cxselect': '../libs/jquery-cxselect/js/jquery.cxselect',
'template': '../libs/art-template/dist/template-native',
'selectpage': '../libs/selectpage/selectpage',
},
// shim依赖配置
shim: {
'bootstrap': ['jquery'],
'bootstrap-table': {
deps: ['bootstrap', 'css!../libs/bootstrap-table/dist/bootstrap-table.min.css'],
deps: [
'bootstrap',
// 'css!../libs/bootstrap-table/dist/bootstrap-table.min.css'
],
exports: '$.fn.bootstrapTable'
},
'bootstrap-table-lang': {
... ... @@ -74,6 +82,10 @@ require.config({
deps: ['bootstrap-table'],
exports: '$.fn.bootstrapTable.defaults'
},
'bootstrap-table-template': {
deps: ['bootstrap-table', 'template'],
exports: '$.fn.bootstrapTable.defaults'
},
'tableexport': {
deps: ['jquery'],
exports: '$.fn.extend'
... ... @@ -92,21 +104,21 @@ require.config({
'bootstrap-switch': ['jquery'],
'bootstrap-dialog': ['css!../libs/bootstrap3-dialog/dist/css/bootstrap-dialog.min.css'],
'bootstrap-datetimepicker': [
'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
'moment/locale/zh-cn',
// 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
],
'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ],
'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'],
// 'toastr': ['css!../libs/toastr/toastr.min.css'],
'jstree': ['css!../libs/jstree/dist/themes/default/style.css', ],
'plupload': {
deps: [
'../libs/plupload/js/moxie.min'
],
deps: ['../libs/plupload/js/moxie.min'],
exports: "plupload"
},
// 'layer': ['css!../libs/layer/build/skin/default/layer.css'],
// 'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'],
'validator-lang': ['validator-core'],
// 'selectpage': ['css!../libs/selectpage/selectpage.css'],
},
baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径
map: {
... ...
... ... @@ -26,12 +26,14 @@ require.config({
'form': 'require-form',
'table': 'require-table',
'upload': 'require-upload',
'validator': 'require-validator',
'drag': 'jquery.drag.min',
'drop': 'jquery.drop.min',
'echarts': 'echarts.min',
'echarts-theme': 'echarts-theme',
'adminlte': 'adminlte',
'bootstrap-table-commonsearch': 'bootstrap-table-commonsearch',
'bootstrap-table-template': 'bootstrap-table-template',
//
// 以下的包从bower的libs目录加载
'jquery': '../libs/jquery/dist/jquery.min',
... ... @@ -53,19 +55,25 @@ require.config({
'slimscroll': '../libs/jquery-slimscroll/jquery.slimscroll',
'crontab': '../libs/jqcron/src/jqCron.cn',
'summernote': '../libs/summernote/dist/lang/summernote-zh-CN.min',
'validator': '../libs/nice-validator/dist/jquery.validator.js?local=zh-CN',
'validator-core': '../libs/nice-validator/dist/jquery.validator',
'validator-lang': '../libs/nice-validator/dist/local/zh-CN',
'plupload': '../libs/plupload/js/plupload.min',
'toastr': '../libs/toastr/toastr',
'jstree': '../libs/jstree/dist/jstree.min',
'layer': '../libs/layer/src/layer',
'cookie': '../libs/jquery.cookie/jquery.cookie',
'cxselect': '../libs/jquery-cxselect/js/jquery.cxselect',
'template': '../libs/art-template/dist/template-native',
'selectpage': '../libs/selectpage/selectpage',
},
// shim依赖配置
shim: {
'bootstrap': ['jquery'],
'bootstrap-table': {
deps: ['bootstrap', 'css!../libs/bootstrap-table/dist/bootstrap-table.min.css'],
deps: [
'bootstrap',
// 'css!../libs/bootstrap-table/dist/bootstrap-table.min.css'
],
exports: '$.fn.bootstrapTable'
},
'bootstrap-table-lang': {
... ... @@ -88,6 +96,10 @@ require.config({
deps: ['bootstrap-table'],
exports: '$.fn.bootstrapTable.defaults'
},
'bootstrap-table-template': {
deps: ['bootstrap-table', 'template'],
exports: '$.fn.bootstrapTable.defaults'
},
'tableexport': {
deps: ['jquery'],
exports: '$.fn.extend'
... ... @@ -106,21 +118,21 @@ require.config({
'bootstrap-switch': ['jquery'],
'bootstrap-dialog': ['css!../libs/bootstrap3-dialog/dist/css/bootstrap-dialog.min.css'],
'bootstrap-datetimepicker': [
'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
'moment/locale/zh-cn',
// 'css!../libs/eonasdan-bootstrap-datetimepicker/build/css/bootstrap-datetimepicker.min.css',
],
'bootstrap-select': ['css!../libs/bootstrap-select/dist/css/bootstrap-select.min.css', ],
'summernote': ['../libs/summernote/dist/summernote.min', 'css!../libs/summernote/dist/summernote.css'],
// 'toastr': ['css!../libs/toastr/toastr.min.css'],
'jstree': ['css!../libs/jstree/dist/themes/default/style.css', ],
'plupload': {
deps: [
'../libs/plupload/js/moxie.min'
],
deps: ['../libs/plupload/js/moxie.min'],
exports: "plupload"
},
// 'layer': ['css!../libs/layer/build/skin/default/layer.css'],
// 'validator-core': ['css!../libs/nice-validator/dist/jquery.validator.css'],
'validator-lang': ['validator-core'],
// 'selectpage': ['css!../libs/selectpage/selectpage.css'],
},
baseUrl: requirejs.s.contexts._.config.config.site.cdnurl + '/assets/js/', //资源基础路径
map: {
... ...
... ... @@ -113,31 +113,33 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table',
$(Table.config.refreshbtn, toolbar).find(".fa").removeClass("fa-spin");
$(Table.config.disabledbtn, toolbar).toggleClass('disabled', true);
// 挺拽选择,需要重新绑定事件
require(['drag', 'drop'], function () {
$(Table.config.firsttd, table).drag("start", function (ev, dd) {
return $('<div class="selection" />').css('opacity', .65).appendTo(document.body);
}).drag(function (ev, dd) {
$(dd.proxy).css({
top: Math.min(ev.pageY, dd.startY),
left: Math.min(ev.pageX, dd.startX),
height: Math.abs(ev.pageY - dd.startY),
width: Math.abs(ev.pageX - dd.startX)
if ($(Table.config.firsttd, table).find("input[type='checkbox'][data-index]").size() > 0) {
// 挺拽选择,需要重新绑定事件
require(['drag', 'drop'], function () {
$(Table.config.firsttd, table).drag("start", function (ev, dd) {
return $('<div class="selection" />').css('opacity', .65).appendTo(document.body);
}).drag(function (ev, dd) {
$(dd.proxy).css({
top: Math.min(ev.pageY, dd.startY),
left: Math.min(ev.pageX, dd.startX),
height: Math.abs(ev.pageY - dd.startY),
width: Math.abs(ev.pageX - dd.startX)
});
}).drag("end", function (ev, dd) {
$(dd.proxy).remove();
});
$(Table.config.firsttd, table).drop("start", function () {
Table.api.toggleattr(this);
}).drop(function () {
Table.api.toggleattr(this);
}).drop("end", function () {
Table.api.toggleattr(this);
});
$.drop({
multi: true
});
}).drag("end", function (ev, dd) {
$(dd.proxy).remove();
});
$(Table.config.firsttd, table).drop("start", function () {
Table.api.toggleattr(this);
}).drop(function () {
Table.api.toggleattr(this);
}).drop("end", function () {
Table.api.toggleattr(this);
});
$.drop({
multi: true
});
});
}
});
// 处理选中筛选框后按钮的状态统一变更
... ...
... ... @@ -438,10 +438,12 @@ table.table-template{
border:none!important;
}
.note-editor .note-editing-area .note-editable{
display: block !important;
/*修复nice-validator和summernote的编辑框冲突*/
.nice-validator .note-editor .note-editing-area .note-editable{
display:inherit;
}
/*预览区域*/
.plupload-preview {
padding:10px;
margin-bottom:0;
... ...
... ... @@ -20,7 +20,7 @@ $sitename = "FastAdmin";
$link = array(
'qqun' => "https://jq.qq.com/?_wv=1027&amp;k=487PNBb",
'osc' => 'https://git.oschina.net/karson/fastadmin',
'osc' => 'https://git.oschina.net/karson/fastadmin/attach_files',
'home' => 'http://www.fastadmin.net?ref=install',
'forum' => 'http://forum.fastadmin.net?ref=install',
'doc' => 'http://doc.fastadmin.net?ref=install',
... ...