mirror of https://gitee.com/karson/fastadmin.git
添加多图上传预览和选择
新增bootstrap-table的主键功能,可传入pk设定表的主键 修复管理员权限不刷新的BUG 修复提示未登录时,在登录后不跳转之前页面的BUG 修复在移动版部分按钮在视图的布局 修复头像不显示的BUG 修改UC默认关闭 修复plupload方法重复绑定事件的BUG 修复部分样式的显示错误 修复登录Token错误的BUGpull/323483/MERGE
parent
bde9120b36
commit
d878aeee2e
|
|
@ -31,7 +31,7 @@ class Crud extends Command
|
||||||
{
|
{
|
||||||
$adminPath = dirname(__DIR__) . DS;
|
$adminPath = dirname(__DIR__) . DS;
|
||||||
//表名
|
//表名
|
||||||
$table = $input->getOption('table') ? : '';
|
$table = $input->getOption('table') ?: '';
|
||||||
//自定义控制器
|
//自定义控制器
|
||||||
$controller = $input->getOption('controller');
|
$controller = $input->getOption('controller');
|
||||||
//自定义模型
|
//自定义模型
|
||||||
|
|
@ -96,6 +96,7 @@ class Crud extends Command
|
||||||
|
|
||||||
//从数据库中获取表字段信息
|
//从数据库中获取表字段信息
|
||||||
$columnList = Db::query("SELECT * FROM `information_schema`.`columns` WHERE TABLE_SCHEMA = ? AND table_name = ? ORDER BY ORDINAL_POSITION", [$dbname, $tableName]);
|
$columnList = Db::query("SELECT * FROM `information_schema`.`columns` WHERE TABLE_SCHEMA = ? AND table_name = ? ORDER BY ORDINAL_POSITION", [$dbname, $tableName]);
|
||||||
|
|
||||||
$fields = [];
|
$fields = [];
|
||||||
foreach ($columnList as $k => $v)
|
foreach ($columnList as $k => $v)
|
||||||
{
|
{
|
||||||
|
|
@ -109,6 +110,20 @@ class Crud extends Command
|
||||||
$field = 'id';
|
$field = 'id';
|
||||||
$order = 'id';
|
$order = 'id';
|
||||||
$priDefined = FALSE;
|
$priDefined = FALSE;
|
||||||
|
$prikey = '';
|
||||||
|
foreach ($columnList as $k => $v)
|
||||||
|
{
|
||||||
|
if ($v['COLUMN_KEY'] == 'PRI')
|
||||||
|
{
|
||||||
|
$prikey = $v['COLUMN_NAME'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$prikey)
|
||||||
|
{
|
||||||
|
throw new Exception('Primary key not found!');
|
||||||
|
}
|
||||||
|
$order = $prikey;
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
@ -161,7 +176,7 @@ class Crud extends Command
|
||||||
if ($v['DATA_TYPE'] == 'set')
|
if ($v['DATA_TYPE'] == 'set')
|
||||||
{
|
{
|
||||||
$attrArr['multiple'] = '';
|
$attrArr['multiple'] = '';
|
||||||
$fieldName.="[]";
|
$fieldName .= "[]";
|
||||||
}
|
}
|
||||||
$attrStr = $this->getArrayString($attrArr);
|
$attrStr = $this->getArrayString($attrArr);
|
||||||
$itemArr = $this->getLangArray($itemArr, FALSE);
|
$itemArr = $this->getLangArray($itemArr, FALSE);
|
||||||
|
|
@ -209,7 +224,7 @@ class Crud extends Command
|
||||||
}
|
}
|
||||||
else if ($inputType == 'checkbox')
|
else if ($inputType == 'checkbox')
|
||||||
{
|
{
|
||||||
$fieldName.="[]";
|
$fieldName .= "[]";
|
||||||
$itemArr = $this->getLangArray($itemArr, FALSE);
|
$itemArr = $this->getLangArray($itemArr, FALSE);
|
||||||
$itemString = $this->getArrayString($itemArr);
|
$itemString = $this->getArrayString($itemArr);
|
||||||
$formAddElement = "{:build_checkboxs('{$fieldName}', [{$itemString}], '{$defaultValue}')}";
|
$formAddElement = "{:build_checkboxs('{$fieldName}', [{$itemString}], '{$defaultValue}')}";
|
||||||
|
|
@ -252,7 +267,7 @@ class Crud extends Command
|
||||||
$step = array_intersect($cssClassArr, ['typeahead', 'tagsinput']) ? 0 : $step;
|
$step = array_intersect($cssClassArr, ['typeahead', 'tagsinput']) ? 0 : $step;
|
||||||
$attrArr['class'] = implode(' ', $cssClassArr);
|
$attrArr['class'] = implode(' ', $cssClassArr);
|
||||||
|
|
||||||
$isUpload = substr($field, -4) == 'file' || substr($field, -5) == 'image' || substr($field, -6) == 'avatar' ? TRUE : FALSE;
|
$isUpload = in_array(substr($field, -4), ['file']) || in_array(substr($field, -5), ['files', 'image']) || in_array(substr($field, -6), ['images', 'avatar']) || in_array(substr($field, -7), ['avatars']) ? TRUE : FALSE;
|
||||||
//如果是步长则加上步长
|
//如果是步长则加上步长
|
||||||
if ($step)
|
if ($step)
|
||||||
{
|
{
|
||||||
|
|
@ -327,6 +342,7 @@ class Crud extends Command
|
||||||
'modelName' => $modelName,
|
'modelName' => $modelName,
|
||||||
'tableComment' => $tableComment,
|
'tableComment' => $tableComment,
|
||||||
'iconName' => $iconName,
|
'iconName' => $iconName,
|
||||||
|
'pk' => $prikey,
|
||||||
'order' => $order,
|
'order' => $order,
|
||||||
'table' => $table,
|
'table' => $table,
|
||||||
'tableName' => $tableName,
|
'tableName' => $tableName,
|
||||||
|
|
@ -531,11 +547,16 @@ EOD;
|
||||||
*/
|
*/
|
||||||
protected function getImageUpload($field, $content)
|
protected function getImageUpload($field, $content)
|
||||||
{
|
{
|
||||||
$filter = substr($field, -4) == 'avatar' || substr($field, -5) == 'image' ? 'data-mimetype="image/*"' : "";
|
$filter = substr($field, -4) == 'avatar' || substr($field, -5) == 'image' || substr($field, -6) == 'images' ? ' data-mimetype="image/*"' : "";
|
||||||
|
$multiple = substr($field, -1) == 's' ? ' data-multiple="true"' : ' data-multiple="false"';
|
||||||
|
$preview = $filter ? ' data-preview-id="p-' . $field . '"' : '';
|
||||||
|
$previewcontainer = $preview ? '<ul class="row list-inline plupload-preview" id="p-' . $field . '"></ul>' : '';
|
||||||
return <<<EOD
|
return <<<EOD
|
||||||
<div class="form-inline">
|
<div class="form-inline">
|
||||||
{$content}
|
{$content}
|
||||||
<span><button id="plupload-{$field}" class="btn btn-danger plupload" data-input-id="c-{$field}"{$filter}><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
<span><button type="button" id="plupload-{$field}" class="btn btn-danger plupload" data-input-id="c-{$field}"{$filter}{$multiple}{$preview}><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
||||||
|
<span><button type="button" id="fachoose-{$field}" class="btn btn-primary fachoose" data-input-id="c-{$field}"{$filter}{$multiple}><i class="fa fa-list"></i> {:__('Choose')}</button></span>
|
||||||
|
{$previewcontainer}
|
||||||
</div>
|
</div>
|
||||||
EOD;
|
EOD;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
|
||||||
// 初始化表格
|
// 初始化表格
|
||||||
table.bootstrapTable({
|
table.bootstrapTable({
|
||||||
url: $.fn.bootstrapTable.defaults.extend.index_url,
|
url: $.fn.bootstrapTable.defaults.extend.index_url,
|
||||||
|
pk: '{%pk%}',
|
||||||
sortName: '{%order%}',
|
sortName: '{%order%}',
|
||||||
columns: [
|
columns: [
|
||||||
[
|
[
|
||||||
|
|
|
||||||
|
|
@ -70,18 +70,18 @@ class Index extends Backend
|
||||||
$result = $validate->check($data);
|
$result = $validate->check($data);
|
||||||
if (!$result)
|
if (!$result)
|
||||||
{
|
{
|
||||||
$this->error($validate->getError());
|
$this->error($validate->getError(), $url, ['token' => $this->request->token()]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
$result = $this->auth->login($username, $password, $keeplogin ? 86400 : 0);
|
$result = $this->auth->login($username, $password, $keeplogin ? 86400 : 0);
|
||||||
if ($result === true)
|
if ($result === true)
|
||||||
{
|
{
|
||||||
$this->success(__('Login successful'), $url);
|
$this->success(__('Login successful'), $url, ['url' => $url]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$this->error(__('Username or password is incorrect'), $url);
|
$this->error(__('Username or password is incorrect'), $url, ['token' => $this->request->token()]);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,32 @@ class Attachment extends Backend
|
||||||
}
|
}
|
||||||
return $this->view->fetch();
|
return $this->view->fetch();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选择附件
|
||||||
|
*/
|
||||||
|
public function select()
|
||||||
|
{
|
||||||
|
if ($this->request->isAjax())
|
||||||
|
{
|
||||||
|
list($where, $sort, $order, $offset, $limit) = $this->buildparams();
|
||||||
|
$total = $this->model
|
||||||
|
->where($where)
|
||||||
|
->order($sort, $order)
|
||||||
|
->count();
|
||||||
|
|
||||||
|
$list = $this->model
|
||||||
|
->where($where)
|
||||||
|
->order($sort, $order)
|
||||||
|
->limit($offset, $limit)
|
||||||
|
->select();
|
||||||
|
|
||||||
|
$result = array("total" => $total, "rows" => $list);
|
||||||
|
|
||||||
|
return json($result);
|
||||||
|
}
|
||||||
|
return $this->view->fetch();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 添加
|
* 添加
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
|
|
||||||
namespace app\admin\library\traits;
|
namespace app\admin\library\traits;
|
||||||
|
|
||||||
|
|
||||||
trait Backend
|
trait Backend
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
@ -61,7 +60,7 @@ trait Backend
|
||||||
*/
|
*/
|
||||||
public function edit($ids = NULL)
|
public function edit($ids = NULL)
|
||||||
{
|
{
|
||||||
$row = $this->model->get(['id' => $ids]);
|
$row = $this->model->get($ids);
|
||||||
if (!$row)
|
if (!$row)
|
||||||
$this->error(__('No Results were found'));
|
$this->error(__('No Results were found'));
|
||||||
if ($this->request->isPost())
|
if ($this->request->isPost())
|
||||||
|
|
@ -93,7 +92,7 @@ trait Backend
|
||||||
$this->code = -1;
|
$this->code = -1;
|
||||||
if ($ids)
|
if ($ids)
|
||||||
{
|
{
|
||||||
$count = $this->model->where('id', 'in', $ids)->delete();
|
$count = $this->model->destroy($ids);
|
||||||
if ($count)
|
if ($count)
|
||||||
{
|
{
|
||||||
$this->code = 1;
|
$this->code = 1;
|
||||||
|
|
@ -118,7 +117,7 @@ trait Backend
|
||||||
$values = array_intersect_key($values, array_flip(array('status')));
|
$values = array_intersect_key($values, array_flip(array('status')));
|
||||||
if ($values)
|
if ($values)
|
||||||
{
|
{
|
||||||
$count = $this->model->where('id', 'in', $ids)->update($values);
|
$count = $this->model->where($this->model->getPk(), 'in', $ids)->update($values);
|
||||||
if ($count)
|
if ($count)
|
||||||
{
|
{
|
||||||
$this->code = 1;
|
$this->code = 1;
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>
|
<li class="hidden-xs">
|
||||||
<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-language"></i></a>
|
<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-language"></i></a>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li class="{$config['language']=='zh-cn'?'active':''}">
|
<li class="{$config['language']=='zh-cn'?'active':''}">
|
||||||
|
|
@ -76,7 +76,7 @@
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>
|
<li class="hidden-xs">
|
||||||
<a href="#" data-toggle="fullscreen"><i class="fa fa-arrows-alt"></i></a>
|
<a href="#" data-toggle="fullscreen"><i class="fa fa-arrows-alt"></i></a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
<div class="panel panel-default panel-intro">
|
||||||
|
{:build_heading()}
|
||||||
|
|
||||||
|
<div class="panel-body">
|
||||||
|
<div id="myTabContent" class="tab-content">
|
||||||
|
<div class="tab-pane fade active in" id="one">
|
||||||
|
<div class="widget-body no-padding">
|
||||||
|
<div id="toolbar" class="toolbar">
|
||||||
|
{:build_toolbar('refresh')}
|
||||||
|
{if request()->get('multiple') == 'true'}
|
||||||
|
<a class="btn btn-danger btn-choose-multi"><i class="fa fa-check"></i> {:__('Choose')}</a>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
|
<table id="table" class="table table-bordered table-hover" width="100%">
|
||||||
|
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
@ -41,7 +41,7 @@
|
||||||
<div class="box-body box-profile">
|
<div class="box-body box-profile">
|
||||||
|
|
||||||
<div class="profile-avatar-container">
|
<div class="profile-avatar-container">
|
||||||
<img class="profile-user-img img-responsive img-circle plupload" src="{$admin.avatar}" alt="">
|
<img class="profile-user-img img-responsive img-circle plupload" src="__CDN__{$admin.avatar}" alt="">
|
||||||
<div class="profile-avatar-text img-circle">{:__('Click to edit')}</div>
|
<div class="profile-avatar-text img-circle">{:__('Click to edit')}</div>
|
||||||
<button id="plupload-avatar" class="plupload" data-input-id="c-avatar" data-after-upload="changeavatar"><i class="fa fa-upload"></i> {:__('Upload')}</button>
|
<button id="plupload-avatar" class="plupload" data-input-id="c-avatar" data-after-upload="changeavatar"><i class="fa fa-upload"></i> {:__('Upload')}</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,8 @@
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
<div class="form-inline">
|
<div class="form-inline">
|
||||||
<input id="c-image" class="form-control" size="50" name="row[image]" type="text" value="">
|
<input id="c-image" class="form-control" size="50" name="row[image]" type="text" value="">
|
||||||
<span><button id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
<span><button id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image" data-preview-id="plupload-preview-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
||||||
|
<ul class="row list-inline plupload-preview" id="plupload-preview-image"></ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,9 @@
|
||||||
<div class="col-xs-12 col-sm-8">
|
<div class="col-xs-12 col-sm-8">
|
||||||
<div class="form-inline">
|
<div class="form-inline">
|
||||||
<input id="c-image" class="form-control" size="50" name="row[image]" type="text" value="{$row.image}">
|
<input id="c-image" class="form-control" size="50" name="row[image]" type="text" value="{$row.image}">
|
||||||
<span><button id="plupload-image" class="btn btn-danger plupload" data-input-id="c-image"><i class="fa fa-upload"></i> {:__('Upload')}</button></span>
|
<span><button type="button" id="plupload-image" class="btn btn-danger plupload" data-multiple="false" data-input-id="c-image" 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-multiple="false" data-input-id="c-image"><i class="fa fa-list-ul"></i> {:__('Choose')}</button></span>
|
||||||
|
<ul class="row list-inline plupload-preview" id="p-image"></ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -93,19 +93,22 @@ class Backend extends Controller
|
||||||
|
|
||||||
// 设置当前请求的URI
|
// 设置当前请求的URI
|
||||||
$this->auth->setRequestUri($path);
|
$this->auth->setRequestUri($path);
|
||||||
|
|
||||||
// 检测是否需要验证登录
|
// 检测是否需要验证登录
|
||||||
if (!$this->auth->match($this->noNeedLogin))
|
if (!$this->auth->match($this->noNeedLogin))
|
||||||
{
|
{
|
||||||
//检测是否登录
|
//检测是否登录
|
||||||
if (!$this->auth->isLogin())
|
if (!$this->auth->isLogin())
|
||||||
{
|
{
|
||||||
$this->error(__('Please login first'), url('index/login', ['url' => $this->request->url()]));
|
$url = Session::get('referer');
|
||||||
|
$url = $url ? $url : $this->request->url();
|
||||||
|
$this->error(__('Please login first'), url('index/login', ['url' => $url]));
|
||||||
}
|
}
|
||||||
// 判断是否需要验证权限
|
// 判断是否需要验证权限
|
||||||
if (!$this->auth->match($this->noNeedRight))
|
if (!$this->auth->match($this->noNeedRight))
|
||||||
{
|
{
|
||||||
// 判断控制器和方法判断是否有对应权限
|
// 判断控制器和方法判断是否有对应权限
|
||||||
|
$path = $this->request->path();
|
||||||
|
$path = substr($path, 0, 1) == '/' ? $path : '/' . $path;
|
||||||
if (!$this->auth->check($path))
|
if (!$this->auth->check($path))
|
||||||
{
|
{
|
||||||
$this->error(__('You have no permission'), NULL);
|
$this->error(__('You have no permission'), NULL);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
//UC配置
|
//UC配置
|
||||||
// Ucenter配置配置
|
// Ucenter配置配置
|
||||||
define('UC_STATUS', TRUE); //是否开启Ucenter同步
|
define('UC_STATUS', false); //是否开启Ucenter同步
|
||||||
|
|
||||||
define('UC_CONNECT', 'mysql');
|
define('UC_CONNECT', 'mysql');
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
"bootstrap3-dialog": "bootstrap-dialog#^1.35.3",
|
"bootstrap3-dialog": "bootstrap-dialog#^1.35.3",
|
||||||
"require-css": "^0.1.8",
|
"require-css": "^0.1.8",
|
||||||
"less": "^2.7.1",
|
"less": "^2.7.1",
|
||||||
"tableExport.jquery.plugin": "^1.6.4",
|
"tableExport.jquery.plugin": "^1.9.0",
|
||||||
"jquery-slimscroll": "slimscroll#^1.3.8",
|
"jquery-slimscroll": "slimscroll#^1.3.8",
|
||||||
"jquery.cookie": "^1.4.1",
|
"jquery.cookie": "^1.4.1",
|
||||||
"Sortable": "^1.5.0",
|
"Sortable": "^1.5.0",
|
||||||
|
|
|
||||||
|
|
@ -209,7 +209,7 @@ class Auth
|
||||||
$_rulelist[$uid] = [];
|
$_rulelist[$uid] = [];
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
// 筛选条件
|
// 筛选条件
|
||||||
$where = [
|
$where = [
|
||||||
'status' => 'normal'
|
'status' => 'normal'
|
||||||
|
|
@ -220,9 +220,13 @@ class Auth
|
||||||
}
|
}
|
||||||
//读取用户组所有权限规则
|
//读取用户组所有权限规则
|
||||||
$this->rules = Db::name($this->config['auth_rule'])->where($where)->field('id,pid,condition,icon,name,title,ismenu')->select();
|
$this->rules = Db::name($this->config['auth_rule'])->where($where)->field('id,pid,condition,icon,name,title,ismenu')->select();
|
||||||
|
|
||||||
//循环规则,判断结果。
|
//循环规则,判断结果。
|
||||||
$rulelist = []; //
|
$rulelist = []; //
|
||||||
|
if (in_array('*', $ids))
|
||||||
|
{
|
||||||
|
$rulelist[] = "*";
|
||||||
|
}
|
||||||
foreach ($this->rules as $rule)
|
foreach ($this->rules as $rule)
|
||||||
{
|
{
|
||||||
//超级管理员无需验证condition
|
//超级管理员无需验证condition
|
||||||
|
|
|
||||||
|
|
@ -106,8 +106,9 @@ body {
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
.user-panel > .image img {
|
.user-panel > .image img {
|
||||||
width: 45px;
|
width: 100%;
|
||||||
height: 45px;
|
max-width: 45px;
|
||||||
|
max-height: 45px;
|
||||||
}
|
}
|
||||||
/*panel扩展描述样式*/
|
/*panel扩展描述样式*/
|
||||||
.panel-intro {
|
.panel-intro {
|
||||||
|
|
@ -329,6 +330,26 @@ body {
|
||||||
.note-editor .note-editing-area .note-editable {
|
.note-editor .note-editing-area .note-editable {
|
||||||
display: block !important;
|
display: block !important;
|
||||||
}
|
}
|
||||||
|
.plupload-preview {
|
||||||
|
padding: 10px;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
.plupload-preview li {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.plupload-preview .thumbnail {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.plupload-preview a {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.plupload-preview a:first-child {
|
||||||
|
height: 90px;
|
||||||
|
}
|
||||||
|
.plupload-preview a img {
|
||||||
|
height: 80px;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
.pjax-loader-bar .progress {
|
.pjax-loader-bar .progress {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
|
@ -526,6 +547,9 @@ body {
|
||||||
.nav-addtabs {
|
.nav-addtabs {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
.fixed-table-toolbar .columns-right.btn-group {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*平板样式*/
|
/*平板样式*/
|
||||||
/*# sourceMappingURL=backend.css.map */
|
/*# sourceMappingURL=backend.css.map */
|
||||||
|
|
@ -42,6 +42,63 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
|
||||||
Table.api.bindevent(table);
|
Table.api.bindevent(table);
|
||||||
|
|
||||||
},
|
},
|
||||||
|
select: function () {
|
||||||
|
// 初始化表格参数配置
|
||||||
|
Table.api.init({
|
||||||
|
extend: {
|
||||||
|
index_url: 'general/attachment/select',
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var table = $("#table");
|
||||||
|
|
||||||
|
// 初始化表格
|
||||||
|
table.bootstrapTable({
|
||||||
|
url: $.fn.bootstrapTable.defaults.extend.index_url,
|
||||||
|
sortName: 'id',
|
||||||
|
columns: [
|
||||||
|
[
|
||||||
|
{field: 'state', checkbox: true, },
|
||||||
|
{field: 'id', title: __('Id')},
|
||||||
|
{field: 'url', title: __('Preview'), formatter: Controller.api.formatter.thumb},
|
||||||
|
{field: 'imagewidth', title: __('Imagewidth')},
|
||||||
|
{field: 'imageheight', title: __('Imageheight')},
|
||||||
|
{field: 'mimetype', title: __('Mimetype'), operate: 'LIKE %...%',
|
||||||
|
process: function (value, arg) {
|
||||||
|
return value.replace(/\*/g, '%');
|
||||||
|
}},
|
||||||
|
{field: 'createtime', title: __('Createtime'), formatter: Table.api.formatter.datetime},
|
||||||
|
{field: 'operate', title: __('Operate'), events: {
|
||||||
|
'click .btn-chooseone': function (e, value, row, index) {
|
||||||
|
var callback = Backend.api.query('callback');
|
||||||
|
var id = Backend.api.query('element_id');
|
||||||
|
var multiple = Backend.api.query('multiple');
|
||||||
|
multiple = multiple == 'true' ? true : false;
|
||||||
|
if (id && callback) {
|
||||||
|
parent.window[callback](id, {url: row.url}, multiple);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}, formatter: function () {
|
||||||
|
return '<a href="javascript:;" class="btn btn-danger btn-chooseone btn-xs"><i class="fa fa-check"></i> ' + __('Choose') + '</a>';
|
||||||
|
}}
|
||||||
|
]
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
// 选中多个
|
||||||
|
$(document).on("click", ".btn-choose-multi", function () {
|
||||||
|
var callback = Backend.api.query('callback');
|
||||||
|
var id = Backend.api.query('element_id');
|
||||||
|
var urlArr = new Array();
|
||||||
|
$.each(table.bootstrapTable("getAllSelections"), function (i, j) {
|
||||||
|
urlArr.push(j.url);
|
||||||
|
});
|
||||||
|
parent.window[callback](id, {url: urlArr.join(",")}, true);
|
||||||
|
});
|
||||||
|
|
||||||
|
// 为表格绑定事件
|
||||||
|
Table.api.bindevent(table);
|
||||||
|
},
|
||||||
add: function () {
|
add: function () {
|
||||||
Controller.api.bindevent();
|
Controller.api.bindevent();
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,7 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form'], functi
|
||||||
if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
|
if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
|
||||||
$(".tab-addtabs").addClass("ios-iframe-fix");
|
$(".tab-addtabs").addClass("ios-iframe-fix");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config.referer) {
|
if (Config.referer) {
|
||||||
//刷新页面后跳到到刷新前的页面
|
//刷新页面后跳到到刷新前的页面
|
||||||
Backend.api.addtabs(Config.referer);
|
Backend.api.addtabs(Config.referer);
|
||||||
|
|
@ -322,8 +322,8 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form'], functi
|
||||||
$(window).resize();
|
$(window).resize();
|
||||||
},
|
},
|
||||||
login: function () {
|
login: function () {
|
||||||
Form.api.bindevent($("#login-form"), null, function () {
|
Form.api.bindevent($("#login-form"), null, function (data) {
|
||||||
location.href = Backend.api.fixurl("index/index");
|
location.href = Backend.api.fixurl(data.url);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -51,6 +51,9 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'upload', 'validator'], func
|
||||||
}
|
}
|
||||||
Toastr.success(msg ? msg : __('Operation completed'));
|
Toastr.success(msg ? msg : __('Operation completed'));
|
||||||
} else {
|
} else {
|
||||||
|
if (typeof data.token !== 'undefined') {
|
||||||
|
$("input[name='__token__']").val(data.token);
|
||||||
|
}
|
||||||
Toastr.error(msg ? msg : __('Operation failed'));
|
Toastr.error(msg ? msg : __('Operation failed'));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -230,6 +233,33 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'upload', 'validator'], func
|
||||||
if ($(".plupload", form).size() > 0) {
|
if ($(".plupload", form).size() > 0) {
|
||||||
Upload.api.plupload();
|
Upload.api.plupload();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//绑定fachoose选择附件事件
|
||||||
|
if ($(".fachoose", form).size() > 0) {
|
||||||
|
$(document).on('click', ".fachoose", function () {
|
||||||
|
var multiple = $(this).data("multiple") ? $(this).data("multiple") : false;
|
||||||
|
var mimetype = $(this).data("mimetype") ? $(this).data("mimetype") : '';
|
||||||
|
Backend.api.open("general/attachment/select?callback=refreshchoose&element_id=" + $(this).attr("id") + "&multiple=" + multiple + "&mimetype="+mimetype, __('Choose'));
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
|
||||||
|
//刷新选择的元素
|
||||||
|
window.refreshchoose = function (id, data, multiple) {
|
||||||
|
var input_id = $("#" + id).data("input-id");
|
||||||
|
if (multiple) {
|
||||||
|
var urlArr = [];
|
||||||
|
var inputObj = $("#" + input_id);
|
||||||
|
if (inputObj.val() != "") {
|
||||||
|
urlArr.push(inputObj.val());
|
||||||
|
}
|
||||||
|
urlArr.push(data.url);
|
||||||
|
inputObj.val(urlArr.join(",")).trigger("change");
|
||||||
|
} else {
|
||||||
|
$("#" + input_id).val(data.url).trigger("change");
|
||||||
|
}
|
||||||
|
layer.closeAll();
|
||||||
|
};
|
||||||
|
}
|
||||||
},
|
},
|
||||||
custom: {}
|
custom: {}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -24,6 +24,7 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table',
|
||||||
locale: 'zh-CN',
|
locale: 'zh-CN',
|
||||||
showToggle: true,
|
showToggle: true,
|
||||||
showColumns: true,
|
showColumns: true,
|
||||||
|
pk: 'id',
|
||||||
sortName: 'id',
|
sortName: 'id',
|
||||||
sortOrder: 'desc',
|
sortOrder: 'desc',
|
||||||
paginationFirstText: __("First"),
|
paginationFirstText: __("First"),
|
||||||
|
|
@ -110,6 +111,7 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table',
|
||||||
//当内容渲染完成后
|
//当内容渲染完成后
|
||||||
table.on('post-body.bs.table', function (e, settings, json, xhr) {
|
table.on('post-body.bs.table', function (e, settings, json, xhr) {
|
||||||
$(Table.config.refreshbtn, toolbar).find(".fa").removeClass("fa-spin");
|
$(Table.config.refreshbtn, toolbar).find(".fa").removeClass("fa-spin");
|
||||||
|
$(Table.config.disabledbtn, toolbar).toggleClass('disabled', true);
|
||||||
|
|
||||||
// 挺拽选择,需要重新绑定事件
|
// 挺拽选择,需要重新绑定事件
|
||||||
require(['drag', 'drop'], function () {
|
require(['drag', 'drop'], function () {
|
||||||
|
|
@ -187,24 +189,25 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table',
|
||||||
dragEnd: function () {
|
dragEnd: function () {
|
||||||
var data = table.bootstrapTable('getData');
|
var data = table.bootstrapTable('getData');
|
||||||
var current = data[parseInt($(this).data("index"))];
|
var current = data[parseInt($(this).data("index"))];
|
||||||
|
var options = table.bootstrapTable('getOptions');
|
||||||
//改变的值和改变的ID集合
|
//改变的值和改变的ID集合
|
||||||
var ids = $.map($("tbody tr:visible", table), function (tr) {
|
var ids = $.map($("tbody tr:visible", table), function (tr) {
|
||||||
return data[parseInt($(tr).data("index"))].id;
|
return data[parseInt($(tr).data("index"))][options.pk];
|
||||||
});
|
});
|
||||||
var changeid = current.id;
|
var changeid = current[options.pk];
|
||||||
var pid = typeof current.pid != 'undefined' ? current.pid : '';
|
var pid = typeof current.pid != 'undefined' ? current.pid : '';
|
||||||
var options = {
|
var params = {
|
||||||
url: table.bootstrapTable('getOptions').extend.dragsort_url,
|
url: table.bootstrapTable('getOptions').extend.dragsort_url,
|
||||||
data: {
|
data: {
|
||||||
ids: ids.join(','),
|
ids: ids.join(','),
|
||||||
changeid: changeid,
|
changeid: changeid,
|
||||||
pid: pid,
|
pid: pid,
|
||||||
field: Table.config.dragsortfield,
|
field: Table.config.dragsortfield,
|
||||||
orderway: table.bootstrapTable('getOptions').sortOrder,
|
orderway: options.sortOrder,
|
||||||
table: table.bootstrapTable('getOptions').extend.table
|
table: options.extend.table
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Backend.api.ajax(options, function (data) {
|
Backend.api.ajax(params, function (data) {
|
||||||
Toastr.success(__('Operation completed'));
|
Toastr.success(__('Operation completed'));
|
||||||
table.bootstrapTable('refresh');
|
table.bootstrapTable('refresh');
|
||||||
});
|
});
|
||||||
|
|
@ -233,7 +236,7 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table',
|
||||||
operate: {
|
operate: {
|
||||||
'click .btn-editone': function (e, value, row, index) {
|
'click .btn-editone': function (e, value, row, index) {
|
||||||
var options = $(this).closest('table').bootstrapTable('getOptions');
|
var options = $(this).closest('table').bootstrapTable('getOptions');
|
||||||
Backend.api.open(options.extend.edit_url + "/ids/" + row.id, __('Edit'));
|
Backend.api.open(options.extend.edit_url + "/ids/" + row[options.pk], __('Edit'));
|
||||||
},
|
},
|
||||||
'click .btn-delone': function (e, value, row, index) {
|
'click .btn-delone': function (e, value, row, index) {
|
||||||
var that = this;
|
var that = this;
|
||||||
|
|
@ -250,7 +253,8 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table',
|
||||||
{icon: 3, title: __('Warning'), offset: [top, left], shadeClose: true},
|
{icon: 3, title: __('Warning'), offset: [top, left], shadeClose: true},
|
||||||
function () {
|
function () {
|
||||||
var table = $(that).closest('table');
|
var table = $(that).closest('table');
|
||||||
Table.api.multi("del", row.id, table, that);
|
var options = table.bootstrapTable('getOptions');
|
||||||
|
Table.api.multi("del", row[options.pk], table, that);
|
||||||
Backend.api.layer.close(index);
|
Backend.api.layer.close(index);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
@ -341,8 +345,9 @@ define(['jquery', 'bootstrap', 'backend', 'toastr', 'moment', 'bootstrap-table',
|
||||||
},
|
},
|
||||||
// 获取选中的条目ID集合
|
// 获取选中的条目ID集合
|
||||||
selectedids: function (table) {
|
selectedids: function (table) {
|
||||||
|
var options = table.bootstrapTable('getOptions');
|
||||||
return $.map(table.bootstrapTable('getSelections'), function (row) {
|
return $.map(table.bootstrapTable('getSelections'), function (row) {
|
||||||
return row.id
|
return row[options.pk];
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
// 切换复选框状态
|
// 切换复选框状态
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,17 @@
|
||||||
define(['jquery', 'bootstrap', 'backend', 'plupload'], function ($, undefined, Backend, Plupload) {
|
define(['jquery', 'bootstrap', 'backend', 'plupload', 'dragsort', 'template'], function ($, undefined, Backend, Plupload, Dragsort, Template) {
|
||||||
var Upload = {
|
var Upload = {
|
||||||
list: {},
|
list: {},
|
||||||
config: {
|
config: {
|
||||||
container: document.body,
|
container: document.body,
|
||||||
classname: '.plupload',
|
classname: '.plupload:not([initialized])',
|
||||||
|
previewtpl: '<li class="col-xs-3"><a href="<%=fullurl%>" data-url="<%=url%>" target="_blank" class="thumbnail"><img src="<%=fullurl%>" class="img-responsive"></a><a href="javascript:;" class="btn btn-danger btn-xs btn-trash"><i class="fa fa-trash"></i></a></li>',
|
||||||
},
|
},
|
||||||
api: {
|
api: {
|
||||||
//Plupload上传
|
//Plupload上传
|
||||||
plupload: function (element, onAfterUpload) {
|
plupload: function (element, onAfterUpload) {
|
||||||
element = typeof element == 'undefined' ? Upload.config.classname : element;
|
element = typeof element == 'undefined' ? Upload.config.classname : element;
|
||||||
$(element, Upload.config.container).each(function () {
|
$(element, Upload.config.container).each(function () {
|
||||||
|
$(this).attr("initialized", true);
|
||||||
var that = this;
|
var that = this;
|
||||||
var id = $(this).prop("id");
|
var id = $(this).prop("id");
|
||||||
var url = $(this).data("url");
|
var url = $(this).data("url");
|
||||||
|
|
@ -20,14 +22,18 @@ define(['jquery', 'bootstrap', 'backend', 'plupload'], function ($, undefined, B
|
||||||
//上传URL
|
//上传URL
|
||||||
url = url ? url : Config.upload.uploadurl;
|
url = url ? url : Config.upload.uploadurl;
|
||||||
url = Backend.api.fixurl(url);
|
url = Backend.api.fixurl(url);
|
||||||
|
//填充ID
|
||||||
|
var input_id = $(that).data("input-id") ? $(that).data("input-id") : "";
|
||||||
|
//预览ID
|
||||||
|
var preview_id = $(that).data("preview-id") ? $(that).data("preview-id") : "";
|
||||||
//最大可上传
|
//最大可上传
|
||||||
maxsize = maxsize ? maxsize : Config.upload.maxsize;
|
maxsize = typeof maxsize !== "undefined" ? maxsize : Config.upload.maxsize;
|
||||||
//文件类型
|
//文件类型
|
||||||
mimetype = mimetype ? mimetype : Config.upload.mimetype;
|
mimetype = typeof mimetype !== "undefined" ? mimetype : Config.upload.mimetype;
|
||||||
//请求的表单参数
|
//请求的表单参数
|
||||||
multipart = multipart ? multipart : Config.upload.multipart;
|
multipart = typeof multipart !== "undefined" ? multipart : Config.upload.multipart;
|
||||||
//是否支持批量上传
|
//是否支持批量上传
|
||||||
multiple = multiple ? multiple : Config.upload.multiple;
|
multiple = typeof multiple !== "undefined" ? multiple : Config.upload.multiple;
|
||||||
//生成Plupload实例
|
//生成Plupload实例
|
||||||
Upload.list[id] = new Plupload.Uploader({
|
Upload.list[id] = new Plupload.Uploader({
|
||||||
runtimes: 'html5,flash,silverlight,html4',
|
runtimes: 'html5,flash,silverlight,html4',
|
||||||
|
|
@ -63,6 +69,7 @@ define(['jquery', 'bootstrap', 'backend', 'plupload'], function ($, undefined, B
|
||||||
$(that).prop("disabled", true).html("<i class='fa fa-upload'></i> 上传" + file.percent + "%");
|
$(that).prop("disabled", true).html("<i class='fa fa-upload'></i> 上传" + file.percent + "%");
|
||||||
},
|
},
|
||||||
FileUploaded: function (up, file, info) {
|
FileUploaded: function (up, file, info) {
|
||||||
|
var options = this.getOption();
|
||||||
//还原按钮文字及状态
|
//还原按钮文字及状态
|
||||||
$(that).prop("disabled", false).html($(that).data("bakup-html"));
|
$(that).prop("disabled", false).html($(that).data("bakup-html"));
|
||||||
//这里可以改成其它的表现形式
|
//这里可以改成其它的表现形式
|
||||||
|
|
@ -76,9 +83,14 @@ define(['jquery', 'bootstrap', 'backend', 'plupload'], function ($, undefined, B
|
||||||
var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
|
var data = ret.hasOwnProperty("data") && ret.data != "" ? ret.data : null;
|
||||||
var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
|
var msg = ret.hasOwnProperty("msg") && ret.msg != "" ? ret.msg : "";
|
||||||
if (ret.code === 1) {
|
if (ret.code === 1) {
|
||||||
//$("input[data-plupload-id='" + id + "-text']").val(data.url);
|
if (input_id) {
|
||||||
if ($(that).data("input-id")) {
|
var urlArr = [];
|
||||||
$("input#" + $(that).data("input-id")).val(data.url);
|
var inputObj = $("#" + input_id);
|
||||||
|
if (options.multi_selection && inputObj.val() != "") {
|
||||||
|
urlArr.push(inputObj.val());
|
||||||
|
}
|
||||||
|
urlArr.push(data.url);
|
||||||
|
inputObj.val(urlArr.join(",")).trigger("change");
|
||||||
}
|
}
|
||||||
var afterUpload = $("#" + id).data("after-upload");
|
var afterUpload = $("#" + id).data("after-upload");
|
||||||
if (afterUpload && typeof Upload.api.custom[afterUpload] == 'function') {
|
if (afterUpload && typeof Upload.api.custom[afterUpload] == 'function') {
|
||||||
|
|
@ -102,6 +114,49 @@ define(['jquery', 'bootstrap', 'backend', 'plupload'], function ($, undefined, B
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
//拖动排序
|
||||||
|
if (preview_id && multiple) {
|
||||||
|
$("#" + preview_id).dragsort({
|
||||||
|
dragSelector: "li",
|
||||||
|
dragEnd: function () {
|
||||||
|
$("#" + preview_id).trigger("fa.preview.change");
|
||||||
|
},
|
||||||
|
placeHolderTemplate: '<li class="col-xs-3"></li>'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (preview_id && input_id) {
|
||||||
|
$(document.body).on("keyup change", "#" + input_id, function () {
|
||||||
|
var inputStr = $("#" + input_id).val();
|
||||||
|
var inputArr = inputStr.split(/\,/);
|
||||||
|
$("#" + preview_id).empty();
|
||||||
|
$.each(inputArr, function (i, j) {
|
||||||
|
if (!j) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var html = Template.render(Upload.config.previewtpl, {url: j, fullurl: Config.upload.cdnurl + j});
|
||||||
|
$("#" + preview_id).append(html);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
$("#" + input_id).trigger("keyup");
|
||||||
|
}
|
||||||
|
if (preview_id) {
|
||||||
|
// 监听事件
|
||||||
|
$(document.body).on("fa.preview.change", "#" + preview_id, function () {
|
||||||
|
var urlArr = new Array();
|
||||||
|
$("#" + preview_id + " [data-url]").each(function (i, j) {
|
||||||
|
urlArr.push($(this).data("url"));
|
||||||
|
});
|
||||||
|
if (input_id) {
|
||||||
|
$("#" + input_id).val(urlArr.join(","));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//移除按钮事件
|
||||||
|
$(document.body).on("click", "#" + preview_id + " .btn-trash", function () {
|
||||||
|
$(this).closest("li").remove();
|
||||||
|
$("#" + preview_id).trigger("fa.preview.change");
|
||||||
|
});
|
||||||
|
}
|
||||||
Upload.list[id].init();
|
Upload.list[id].init();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -140,8 +140,9 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-panel > .image img{
|
.user-panel > .image img{
|
||||||
width:45px;
|
width:100%;
|
||||||
height:45px;
|
max-width:45px;
|
||||||
|
max-height:45px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*panel扩展描述样式*/
|
/*panel扩展描述样式*/
|
||||||
|
|
@ -364,6 +365,27 @@ body {
|
||||||
display: block !important;
|
display: block !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.plupload-preview {
|
||||||
|
padding:10px;
|
||||||
|
margin-bottom:0;
|
||||||
|
li {
|
||||||
|
margin-bottom:10px;
|
||||||
|
}
|
||||||
|
.thumbnail {
|
||||||
|
margin-bottom:10px;
|
||||||
|
}
|
||||||
|
a{
|
||||||
|
display:block;
|
||||||
|
&:first-child{
|
||||||
|
height:90px;
|
||||||
|
}
|
||||||
|
img{
|
||||||
|
height:80px;
|
||||||
|
object-fit: cover;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.pjax-loader-bar .progress {
|
.pjax-loader-bar .progress {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
|
@ -567,6 +589,11 @@ body {
|
||||||
.nav-addtabs {
|
.nav-addtabs {
|
||||||
display:none;
|
display:none;
|
||||||
}
|
}
|
||||||
|
.fixed-table-toolbar {
|
||||||
|
.columns-right.btn-group{
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*平板样式*/
|
/*平板样式*/
|
||||||
@media (max-width: @screen-tablet) {
|
@media (max-width: @screen-tablet) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue