作者 Karson

新增系统配置关联字段、城市专区类型

新增自定义数组类型标题
新增多选项卡配置
新增自定义皮肤配置
... ... @@ -321,6 +321,7 @@ CREATE TABLE `fa_config` (
`content` text NOT NULL COMMENT '变量字典数据',
`rule` varchar(100) NOT NULL DEFAULT '' COMMENT '验证规则',
`extend` varchar(255) NOT NULL DEFAULT '' COMMENT '扩展属性',
`setting` varchar(255) NOT NULL DEFAULT '' COMMENT '配置',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='系统配置';
... ... @@ -329,23 +330,23 @@ CREATE TABLE `fa_config` (
-- Records of fa_config
-- ----------------------------
BEGIN;
INSERT INTO `fa_config` VALUES (1, 'name', 'basic', 'Site name', '请填写站点名称', 'string', '我的网站', '', 'required', '');
INSERT INTO `fa_config` VALUES (2, 'beian', 'basic', 'Beian', '粤ICP备15000000号-1', 'string', '', '', '', '');
INSERT INTO `fa_config` VALUES (3, 'cdnurl', 'basic', 'Cdn url', '如果静态资源使用第三方云储存请配置该值', 'string', '', '', '', '');
INSERT INTO `fa_config` VALUES (4, 'version', 'basic', 'Version', '如果静态资源有变动请重新配置该值', 'string', '1.0.1', '', 'required', '');
INSERT INTO `fa_config` VALUES (5, 'timezone', 'basic', 'Timezone', '', 'string', 'Asia/Shanghai', '', 'required', '');
INSERT INTO `fa_config` VALUES (6, 'forbiddenip', 'basic', 'Forbidden ip', '一行一条记录', 'text', '', '', '', '');
INSERT INTO `fa_config` VALUES (7, 'languages', 'basic', 'Languages', '', 'array', '{\"backend\":\"zh-cn\",\"frontend\":\"zh-cn\"}', '', 'required', '');
INSERT INTO `fa_config` VALUES (8, 'fixedpage', 'basic', 'Fixed page', '请尽量输入左侧菜单栏存在的链接', 'string', 'dashboard', '', 'required', '');
INSERT INTO `fa_config` VALUES (9, 'categorytype', 'dictionary', 'Category type', '', 'array', '{\"default\":\"Default\",\"page\":\"Page\",\"article\":\"Article\",\"test\":\"Test\"}', '', '', '');
INSERT INTO `fa_config` VALUES (10, 'configgroup', 'dictionary', 'Config group', '', 'array', '{\"basic\":\"Basic\",\"email\":\"Email\",\"dictionary\":\"Dictionary\",\"user\":\"User\",\"example\":\"Example\"}', '', '', '');
INSERT INTO `fa_config` VALUES (11, 'mail_type', 'email', 'Mail type', '选择邮件发送方式', 'select', '1', '[\"Please select\",\"SMTP\",\"Mail\"]', '', '');
INSERT INTO `fa_config` VALUES (12, 'mail_smtp_host', 'email', 'Mail smtp host', '错误的配置发送邮件会导致服务器超时', 'string', 'smtp.qq.com', '', '', '');
INSERT INTO `fa_config` VALUES (13, 'mail_smtp_port', 'email', 'Mail smtp port', '(不加密默认25,SSL默认465,TLS默认587)', 'string', '465', '', '', '');
INSERT INTO `fa_config` VALUES (14, 'mail_smtp_user', 'email', 'Mail smtp user', '(填写完整用户名)', 'string', '10000', '', '', '');
INSERT INTO `fa_config` VALUES (15, 'mail_smtp_pass', 'email', 'Mail smtp password', '(填写您的密码)', 'string', 'password', '', '', '');
INSERT INTO `fa_config` VALUES (16, 'mail_verify_type', 'email', 'Mail vertify type', '(SMTP验证方式[推荐SSL])', 'select', '2', '[\"None\",\"TLS\",\"SSL\"]', '', '');
INSERT INTO `fa_config` VALUES (17, 'mail_from', 'email', 'Mail from', '', 'string', '10000@qq.com', '', '', '');
INSERT INTO `fa_config` VALUES (1, 'name', 'basic', 'Site name', '请填写站点名称', 'string', '我的网站', '', 'required', '', '');
INSERT INTO `fa_config` VALUES (2, 'beian', 'basic', 'Beian', '粤ICP备15000000号-1', 'string', '', '', '', '', '');
INSERT INTO `fa_config` VALUES (3, 'cdnurl', 'basic', 'Cdn url', '如果全站静态资源使用第三方云储存请配置该值', 'string', '', '', '', '', '');
INSERT INTO `fa_config` VALUES (4, 'version', 'basic', 'Version', '如果静态资源有变动请重新配置该值', 'string', '1.0.1', '', 'required', '', '');
INSERT INTO `fa_config` VALUES (5, 'timezone', 'basic', 'Timezone', '', 'string', 'Asia/Shanghai', '', 'required', '', '');
INSERT INTO `fa_config` VALUES (6, 'forbiddenip', 'basic', 'Forbidden ip', '一行一条记录', 'text', '', '', '', '', '');
INSERT INTO `fa_config` VALUES (7, 'languages', 'basic', 'Languages', '', 'array', '{\"backend\":\"zh-cn\",\"frontend\":\"zh-cn\"}', '', 'required', '', '');
INSERT INTO `fa_config` VALUES (8, 'fixedpage', 'basic', 'Fixed page', '请尽量输入左侧菜单栏存在的链接', 'string', 'dashboard', '', 'required', '', '');
INSERT INTO `fa_config` VALUES (9, 'categorytype', 'dictionary', 'Category type', '', 'array', '{\"default\":\"Default\",\"page\":\"Page\",\"article\":\"Article\",\"test\":\"Test\"}', '', '', '', '');
INSERT INTO `fa_config` VALUES (10, 'configgroup', 'dictionary', 'Config group', '', 'array', '{\"basic\":\"Basic\",\"email\":\"Email\",\"dictionary\":\"Dictionary\",\"user\":\"User\",\"example\":\"Example\"}', '', '', '', '');
INSERT INTO `fa_config` VALUES (11, 'mail_type', 'email', 'Mail type', '选择邮件发送方式', 'select', '1', '[\"Please select\",\"SMTP\",\"Mail\"]', '', '', '');
INSERT INTO `fa_config` VALUES (12, 'mail_smtp_host', 'email', 'Mail smtp host', '错误的配置发送邮件会导致服务器超时', 'string', 'smtp.qq.com', '', '', '', '');
INSERT INTO `fa_config` VALUES (13, 'mail_smtp_port', 'email', 'Mail smtp port', '(不加密默认25,SSL默认465,TLS默认587)', 'string', '465', '', '', '', '');
INSERT INTO `fa_config` VALUES (14, 'mail_smtp_user', 'email', 'Mail smtp user', '(填写完整用户名)', 'string', '10000', '', '', '', '');
INSERT INTO `fa_config` VALUES (15, 'mail_smtp_pass', 'email', 'Mail smtp password', '(填写您的密码)', 'string', 'password', '', '', '', '');
INSERT INTO `fa_config` VALUES (16, 'mail_verify_type', 'email', 'Mail vertify type', '(SMTP验证方式[推荐SSL])', 'select', '2', '[\"None\",\"TLS\",\"SSL\"]', '', '', '');
INSERT INTO `fa_config` VALUES (17, 'mail_from', 'email', 'Mail from', '', 'string', '10000@qq.com', '', '', '', '');
COMMIT;
-- ----------------------------
... ...
... ... @@ -5,6 +5,8 @@ namespace app\admin\controller\general;
use app\common\controller\Backend;
use app\common\library\Email;
use app\common\model\Config as ConfigModel;
use think\Cache;
use think\Db;
use think\Exception;
use think\Validate;
... ... @@ -21,7 +23,7 @@ class Config extends Backend
* @var \app\common\model\Config
*/
protected $model = null;
protected $noNeedRight = ['check', 'rulelist'];
protected $noNeedRight = ['check', 'rulelist', 'selectpage', 'get_fields_list'];
public function _initialize()
{
... ... @@ -82,7 +84,7 @@ class Config extends Backend
$params = $this->request->post("row/a", [], 'trim');
if ($params) {
foreach ($params as $k => &$v) {
$v = is_array($v) ? implode(',', $v) : $v;
$v = is_array($v) && $k !== 'setting' ? implode(',', $v) : $v;
}
if (in_array($params['type'], ['select', 'selects', 'checkbox', 'radio', 'array'])) {
$params['content'] = json_encode(ConfigModel::decode($params['content']), JSON_UNESCAPED_UNICODE);
... ... @@ -202,12 +204,12 @@ class Config extends Backend
if ($params) {
$config = $this->model->get($params);
if (!$config) {
return $this->success();
$this->success();
} else {
return $this->error(__('Name already exist'));
$this->error(__('Name already exist'));
}
} else {
return $this->error(__('Invalid parameters'));
$this->error(__('Invalid parameters'));
}
}
... ... @@ -262,7 +264,51 @@ class Config extends Backend
$this->error($email->getError());
}
} else {
return $this->error(__('Invalid parameters'));
$this->error(__('Invalid parameters'));
}
}
public function selectpage()
{
$id = $this->request->get("id/d");
$config = \app\common\model\Config::get($id);
if (!$config) {
$this->error(__('Invalid parameters'));
}
$setting = $config['setting'];
//自定义条件
$custom = isset($setting['conditions']) ? (array)json_decode($setting['conditions'], true) : [];
$custom = array_filter($custom);
$this->request->request(['showField' => $setting['field'], 'keyField' => $setting['primarykey'], 'custom' => $custom, 'searchField' => [$setting['field'], $setting['primarykey']]]);
$this->model = \think\Db::connect()->setTable($setting['table']);
return parent::selectpage();
}
/**
* 获取表列表
* @internal
*/
public function get_table_list()
{
$tableList = [];
$dbname = \think\Config::get('database.database');
$tableList = \think\Db::query("SELECT `TABLE_NAME` AS `name`,`TABLE_COMMENT` AS `title` FROM `information_schema`.`TABLES` where `TABLE_SCHEMA` = '{$dbname}';");
$this->success('', null, ['tableList' => $tableList]);
}
/**
* 获取表字段列表
* @internal
*/
public function get_fields_list()
{
$table = $this->request->request('table');
$dbname = \think\Config::get('database.database');
//从数据库中获取表字段信息
$sql = "SELECT `COLUMN_NAME` AS `name`,`COLUMN_COMMENT` AS `title`,`DATA_TYPE` AS `type` FROM `information_schema`.`columns` WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? ORDER BY ORDINAL_POSITION";
//加载主表的列
$fieldList = Db::query($sql, [$dbname, $table]);
$this->success("", null, ['fieldList' => $fieldList]);
}
}
... ...
... ... @@ -33,7 +33,17 @@ return [
'Array' => '数组',
'Array key' => '键名',
'Array value' => '键值',
'City' => '城市地区',
'Selectpage' => '关联表',
'Selectpages' => '关联表(多选)',
'Custom' => '自定义',
'Please select table' => '关联表',
'Selectpage table' => '关联表',
'Selectpage primarykey' => '存储字段',
'Selectpage field' => '显示字段',
'Selectpage conditions' => '筛选条件',
'Field title' => '字段名',
'Field value' => '字段值',
'Content' => '数据列表',
'Rule' => '校验规则',
'Site name' => '站点名称',
... ...
... ... @@ -8,6 +8,10 @@
<!-- Loading Bootstrap -->
<link href="__CDN__/assets/css/backend{$Think.config.app_debug?'':'.min'}.css?v={$Think.config.site.version}" rel="stylesheet">
{if $Think.config.fastadmin.adminskin}
<link href="__CDN__/assets/css/skins/{$Think.config.fastadmin.adminskin}.css?v={$Think.config.site.version}" rel="stylesheet">
{/if}
<!-- HTML5 shim, for IE6-8 support of HTML5 elements. All other JS at the end of file. -->
<!--[if lt IE 9]>
<script src="__CDN__/assets/js/html5shiv.js"></script>
... ...
... ... @@ -59,35 +59,35 @@
<div class="col-sm-8 col-xs-12">
{switch $item.type}
{case string}
<input {$item.extend} type="text" name="row[{$item.name}]" value="{$item.value|htmlentities}" class="form-control" data-rule="{$item.rule}" data-tip="{$item.tip}"/>
<input {$item.extend_html} type="text" name="row[{$item.name}]" value="{$item.value|htmlentities}" class="form-control" data-rule="{$item.rule}" data-tip="{$item.tip}"/>
{/case}
{case text}
<textarea {$item.extend} name="row[{$item.name}]" class="form-control" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}">{$item.value|htmlentities}</textarea>
<textarea {$item.extend_html} name="row[{$item.name}]" class="form-control" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}">{$item.value|htmlentities}</textarea>
{/case}
{case editor}
<textarea {$item.extend} name="row[{$item.name}]" id="editor-{$item.name}" class="form-control editor" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}">{$item.value|htmlentities}</textarea>
<textarea {$item.extend_html} name="row[{$item.name}]" id="editor-{$item.name}" class="form-control editor" data-rule="{$item.rule}" rows="5" data-tip="{$item.tip}">{$item.value|htmlentities}</textarea>
{/case}
{case array}
<dl class="fieldlist" data-name="row[{$item.name}]">
<dl {$item.extend_html} class="fieldlist" data-name="row[{$item.name}]">
<dd>
<ins>{:__('Array key')}</ins>
<ins>{:__('Array value')}</ins>
<ins>{:isset($item["setting"]["key"])&&$item["setting"]["key"]?$item["setting"]["key"]:__('Array key')}</ins>
<ins>{:isset($item["setting"]["value"])&&$item["setting"]["value"]?$item["setting"]["value"]:__('Array value')}</ins>
</dd>
<dd><a href="javascript:;" class="btn btn-sm btn-success btn-append"><i class="fa fa-plus"></i> {:__('Append')}</a></dd>
<textarea name="row[{$item.name}]" class="form-control hide" cols="30" rows="5">{$item.value|htmlentities}</textarea>
</dl>
{/case}
{case date}
<input {$item.extend} type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control datetimepicker" data-date-format="YYYY-MM-DD" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
<input {$item.extend_html} type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control datetimepicker" data-date-format="YYYY-MM-DD" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
{/case}
{case time}
<input {$item.extend} type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control datetimepicker" data-date-format="HH:mm:ss" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
<input {$item.extend_html} type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control datetimepicker" data-date-format="HH:mm:ss" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
{/case}
{case datetime}
<input {$item.extend} type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
<input {$item.extend_html} type="text" name="row[{$item.name}]" value="{$item.value}" class="form-control datetimepicker" data-date-format="YYYY-MM-DD HH:mm:ss" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
{/case}
{case number}
<input {$item.extend} type="number" name="row[{$item.name}]" value="{$item.value}" class="form-control" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
<input {$item.extend_html} type="number" name="row[{$item.name}]" value="{$item.value}" class="form-control" data-tip="{$item.tip}" data-rule="{$item.rule}"/>
{/case}
{case checkbox}
{foreach name="item.content" item="vo"}
... ... @@ -101,7 +101,7 @@
{/case}
{case value="select" break="0"}{/case}
{case value="selects"}
<select {$item.extend} name="row[{$item.name}]{$item.type=='selects'?'[]':''}" class="form-control selectpicker" data-tip="{$item.tip}" {$item.type=='selects'?'multiple':''}>
<select {$item.extend_html} name="row[{$item.name}]{$item.type=='selects'?'[]':''}" class="form-control selectpicker" data-tip="{$item.tip}" {$item.type=='selects'?'multiple':''}>
{foreach name="item.content" item="vo"}
<option value="{$key}" {in name="key" value="$item.value" }selected{/in}>{$vo}</option>
{/foreach}
... ... @@ -136,6 +136,15 @@
<label for="row[{$item.name}]-yes"><input id="row[{$item.name}]-yes" name="row[{$item.name}]" type="radio" value="1" {$item.value?'checked':''} data-tip="{$item.tip}" /> {:__('Yes')}</label>
<label for="row[{$item.name}]-no"><input id="row[{$item.name}]-no" name="row[{$item.name}]" type="radio" value="0" {$item.value?'':'checked'} data-tip="{$item.tip}" /> {:__('No')}</label>
{/case}
{case city}
<div style="position:relative">
<input {$item.extend_html} type="text" name="row[{$item.name}]" id="c-{$item.name}" value="{$item.value|htmlentities}" class="form-control" data-toggle="city-picker" data-tip="{$item.tip}" data-rule="{$item.rule}" />
</div>
{/case}
{case value="selectpage" break="0"}{/case}
{case value="selectpages"}
<input {$item.extend_html} type="text" name="row[{$item.name}]" id="c-{$item.name}" value="{$item.value|htmlentities}" class="form-control selectpage" data-source="{:url('general/config/selectpage')}?id={$item.id}" data-primary-key="{$item.setting.primarykey}" data-field="{$item.setting.field}" data-multiple="{$item.type=='selectpage'?'false':'true'}" data-tip="{$item.tip}" data-rule="{$item.rule}" />
{/case}
{case custom}
{$item.extend_html}
{/case}
... ... @@ -170,21 +179,21 @@
<form id="add-form" class="form-horizontal" role="form" data-toggle="validator" method="POST" action="{:url('general.config/add')}">
{:token()}
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Type')}:</label>
<label class="control-label col-xs-12 col-sm-2">{:__('Group')}:</label>
<div class="col-xs-12 col-sm-4">
<select name="row[type]" class="form-control selectpicker">
{foreach name="typeList" item="vo"}
<option value="{$key}" {in name="key" value="string" }selected{/in}>{$vo}</option>
<select name="row[group]" class="form-control selectpicker">
{foreach name="groupList" item="vo"}
<option value="{$key}" {in name="key" value="basic" }selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
</div>
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Group')}:</label>
<label class="control-label col-xs-12 col-sm-2">{:__('Type')}:</label>
<div class="col-xs-12 col-sm-4">
<select name="row[group]" class="form-control selectpicker">
{foreach name="groupList" item="vo"}
<option value="{$key}" {in name="key" value="basic" }selected{/in}>{$vo}</option>
<select name="row[type]" id="c-type" class="form-control selectpicker">
{foreach name="typeList" item="vo"}
<option value="{$key}" {in name="key" value="string" }selected{/in}>{$vo}</option>
{/foreach}
</select>
</div>
... ... @@ -201,6 +210,52 @@
<input type="text" class="form-control" id="title" name="row[title]" value="" data-rule="required"/>
</div>
</div>
<div class="form-group hidden tf tf-selectpage tf-selectpages">
<label for="c-selectpage-table" class="control-label col-xs-12 col-sm-2">{:__('Selectpage table')}:</label>
<div class="col-xs-12 col-sm-4">
<select id="c-selectpage-table" name="row[setting][table]" class="form-control selectpicker" data-live-search="true">
<option value="">{:__('Please select table')}</option>
</select>
</div>
</div>
<div class="form-group hidden tf tf-selectpage tf-selectpages">
<label for="c-selectpage-primarykey" class="control-label col-xs-12 col-sm-2">{:__('Selectpage primarykey')}:</label>
<div class="col-xs-12 col-sm-4">
<select name="row[setting][primarykey]" class="form-control selectpicker" id="c-selectpage-primarykey"></select>
</div>
</div>
<div class="form-group hidden tf tf-selectpage tf-selectpages">
<label for="c-selectpage-field" class="control-label col-xs-12 col-sm-2">{:__('Selectpage field')}:</label>
<div class="col-xs-12 col-sm-4">
<select name="row[setting][field]" class="form-control selectpicker" id="c-selectpage-field"></select>
</div>
</div>
<div class="form-group hidden tf tf-selectpage tf-selectpages">
<label class="control-label col-xs-12 col-sm-2">{:__('Selectpage conditions')}:</label>
<div class="col-xs-12 col-sm-8">
<dl class="fieldlist" data-name="row[setting][conditions]">
<dd>
<ins>{:__('Field title')}</ins>
<ins>{:__('Field value')}</ins>
</dd>
<dd><a href="javascript:;" class="append btn btn-sm btn-success"><i class="fa fa-plus"></i> {:__('Append')}</a></dd>
<textarea name="row[setting][conditions]" class="form-control hide" cols="30" rows="5"></textarea>
</dl>
</div>
</div>
<div class="form-group hidden tf tf-array">
<label for="c-array-key" class="control-label col-xs-12 col-sm-2">{:__('Array key')}:</label>
<div class="col-xs-12 col-sm-4">
<input type="text" name="row[setting][key]" class="form-control" id="c-array-key">
</div>
</div>
<div class="form-group hidden tf tf-array">
<label for="c-array-value" class="control-label col-xs-12 col-sm-2">{:__('Array value')}:</label>
<div class="col-xs-12 col-sm-4">
<input type="text" name="row[setting][value]" class="form-control" id="c-array-value">
</div>
</div>
<div class="form-group">
<label for="value" class="control-label col-xs-12 col-sm-2">{:__('Value')}:</label>
<div class="col-xs-12 col-sm-4">
... ...
... ... @@ -4,7 +4,7 @@
<!-- 加载样式及META信息 -->
{include file="common/meta" /}
</head>
<body class="hold-transition skin-green sidebar-mini fixed {if $Think.config.fastadmin.multiplenav}multiplenav{/if}" id="tabs">
<body class="hold-transition skin-green {$Think.config.fastadmin.adminskin} sidebar-mini fixed {:$Think.config.fastadmin.multipletab?'multipletab':''} {:$Think.config.fastadmin.multiplenav?'multiplenav':''}" id="tabs">
<div class="wrapper">
... ...
<!DOCTYPE html>
<html lang="{$config.language}">
<head>
{include file="common/meta" /}
<style type="text/css">
body {
color:#999;
background:url('{$background}');
background-size:cover;
}
a {
color:#fff;
}
.login-panel{margin-top:150px;}
.login-screen {
max-width:400px;
padding:0;
margin:100px auto 0 auto;
<head>
{include file="common/meta" /}
}
.login-screen .well {
border-radius: 3px;
-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
background: rgba(255,255,255, 0.2);
}
.login-screen .copyright {
text-align: center;
}
@media(max-width:767px) {
.login-screen {
padding:0 20px;
}
}
.profile-img-card {
width: 100px;
height: 100px;
margin: 10px auto;
display: block;
-moz-border-radius: 50%;
-webkit-border-radius: 50%;
border-radius: 50%;
}
.profile-name-card {
text-align: center;
}
<style type="text/css">
body {
color: #999;
background: url('{$background}');
background-size: cover;
}
#login-form {
margin-top:20px;
}
#login-form .input-group {
margin-bottom:15px;
a {
color: #fff;
}
.login-panel {
margin-top: 150px;
}
.login-screen {
max-width: 400px;
padding: 0;
margin: 100px auto 0 auto;
}
.login-screen .well {
border-radius: 3px;
-webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
box-shadow: 0 0 15px rgba(0, 0, 0, 0.1);
background: rgba(255, 255, 255, 0.2);
border: 1px solid rgba(227, 227, 227, 0.4);
}
.login-screen .input-group .input-group-addon, .login-screen input.form-control {
/*border-color: transparent;*/
}
.login-screen .copyright {
text-align: center;
}
@media (max-width: 767px) {
.login-screen {
padding: 0 20px;
}
}
.profile-img-card {
width: 100px;
height: 100px;
margin: 10px auto;
display: block;
-moz-border-radius: 50%;
-webkit-border-radius: 50%;
border-radius: 50%;
}
.profile-name-card {
text-align: center;
}
#login-form {
margin-top: 20px;
}
</style>
</head>
<body>
<div class="container">
<div class="login-wrapper">
<div class="login-screen">
<div class="well">
<div class="login-form">
<img id="profile-img" class="profile-img-card" src="__CDN__/assets/img/avatar.png" />
<p id="profile-name" class="profile-name-card"></p>
<form action="" method="post" id="login-form">
<div id="errtips" class="hide"></div>
{:token()}
<div class="input-group">
<div class="input-group-addon"><span class="glyphicon glyphicon-user" aria-hidden="true"></span></div>
<input type="text" class="form-control" id="pd-form-username" placeholder="{:__('Username')}" name="username" autocomplete="off" value="" data-rule="{:__('Username')}:required;username" />
</div>
<div class="input-group">
<div class="input-group-addon"><span class="glyphicon glyphicon-lock" aria-hidden="true"></span></div>
<input type="password" class="form-control" id="pd-form-password" placeholder="{:__('Password')}" name="password" autocomplete="off" value="" data-rule="{:__('Password')}:required;password" />
</div>
{if $Think.config.fastadmin.login_captcha}
<div class="input-group">
<div class="input-group-addon"><span class="glyphicon glyphicon-option-horizontal" aria-hidden="true"></span></div>
<input type="text" name="captcha" class="form-control" placeholder="{:__('Captcha')}" data-rule="{:__('Captcha')}:required;length(4)" />
<span class="input-group-addon" style="padding:0;border:none;cursor:pointer;">
#login-form .input-group {
margin-bottom: 15px;
}
</style>
</head>
<body>
<div class="container">
<div class="login-wrapper">
<div class="login-screen">
<div class="well">
<div class="login-form">
<img id="profile-img" class="profile-img-card" src="__CDN__/assets/img/avatar.png"/>
<p id="profile-name" class="profile-name-card"></p>
<form action="" method="post" id="login-form">
<div id="errtips" class="hide"></div>
{:token()}
<div class="input-group">
<div class="input-group-addon"><span class="glyphicon glyphicon-user" aria-hidden="true"></span></div>
<input type="text" class="form-control" id="pd-form-username" placeholder="{:__('Username')}" name="username" autocomplete="off" value="" data-rule="{:__('Username')}:required;username"/>
</div>
<div class="input-group">
<div class="input-group-addon"><span class="glyphicon glyphicon-lock" aria-hidden="true"></span></div>
<input type="password" class="form-control" id="pd-form-password" placeholder="{:__('Password')}" name="password" autocomplete="off" value="" data-rule="{:__('Password')}:required;password"/>
</div>
{if $Think.config.fastadmin.login_captcha}
<div class="input-group">
<div class="input-group-addon"><span class="glyphicon glyphicon-option-horizontal" aria-hidden="true"></span></div>
<input type="text" name="captcha" class="form-control" placeholder="{:__('Captcha')}" data-rule="{:__('Captcha')}:required;length(4)"/>
<span class="input-group-addon" style="padding:0;border:none;cursor:pointer;">
<img src="{:rtrim('__PUBLIC__', '/')}/index.php?s=/captcha" width="100" height="30" onclick="this.src = '{:rtrim('__PUBLIC__', '/')}/index.php?s=/captcha&r=' + Math.random();"/>
</span>
</div>
{/if}
<div class="form-group checkbox">
<label class="inline" for="keeplogin">
<input type="checkbox" name="keeplogin" id="keeplogin" value="1" />
{:__('Keep login')}
</label>
</div>
<div class="form-group">
<button type="submit" class="btn btn-success btn-lg btn-block">{:__('Sign in')}</button>
</div>
</form>
</div>
</div>
{/if}
<div class="form-group checkbox">
<label class="inline" for="keeplogin">
<input type="checkbox" name="keeplogin" id="keeplogin" value="1"/>
{:__('Keep login')}
</label>
</div>
<div class="form-group">
<button type="submit" class="btn btn-success btn-lg btn-block">{:__('Sign in')}</button>
</div>
</form>
</div>
</div>
</div>
{include file="common/script" /}
</body>
</div>
</div>
{include file="common/script" /}
</body>
</html>
... ...
... ... @@ -149,7 +149,7 @@ class Backend extends Controller
}
// 判断是否需要验证权限
if (!$this->auth->match($this->noNeedRight)) {
// 判断控制器和方法判断是否有对应权限
// 判断控制器和方法是否有对应权限
if (!$this->auth->check($path)) {
Hook::listen('admin_nopermission', $this);
$this->error(__('You have no permission'), '');
... ...
... ... @@ -21,6 +21,9 @@ class Config extends Model
protected $append = [
'extend_html'
];
protected $type = [
'setting' => 'json',
];
/**
* 读取配置类型
... ...
... ... @@ -273,10 +273,12 @@ return [
'login_background' => "/assets/img/loginbg.jpg",
//是否启用多级菜单导航
'multiplenav' => false,
//是否开启多选项卡(仅在开启多级菜单时起作用)
'multipletab' => true,
//后台皮肤,为空时表示使用skin-green
'adminskin' => '',
//允许跨域的域名,多个以,分隔
'cors_request_domain' => 'localhost,127.0.0.1',
//自动检测更新
'checkupdate' => false,
//版本号
'version' => '1.2.0',
//API接口地址
... ...
... ... @@ -17,7 +17,7 @@
{include file="common/sidenav" /}
</div>
<div class="col-md-9">
<div class="panel panel-default ">
<div class="panel panel-default">
<div class="panel-body">
<h2 class="page-header">
{:__('Member center')}
... ... @@ -73,4 +73,4 @@
</div>
</div>
</div>
</div>
\ No newline at end of file
</div>
... ...
... ... @@ -385,13 +385,6 @@ form.form-horizontal .control-label {
.nav-addtabs li:hover > .close-tab {
display: block;
}
.multiplenav .content-wrapper,
.multiplenav .right-side {
padding-top: 94px;
}
.multiplenav #firstnav .nav-addtabs {
padding-right: 450px;
}
#firstnav {
height: 50px;
border-bottom: 1px solid transparent;
... ... @@ -420,6 +413,7 @@ form.form-horizontal .control-label {
}
/*次栏菜单栏*/
#secondnav {
display: none;
height: 44px;
position: absolute;
top: 50px;
... ... @@ -495,6 +489,20 @@ form.form-horizontal .control-label {
border-color: #222e32;
color: #222e32;
}
.multiplenav .content-wrapper,
.multiplenav .right-side {
padding-top: 50px;
}
.multiplenav #firstnav .nav-addtabs {
padding-right: 450px;
}
.multipletab #secondnav {
display: block;
}
.multipletab.multiplenav .content-wrapper,
.multipletab.multiplenav .right-side {
padding-top: 94px;
}
.main-sidebar .sidebar-form {
overflow: visible;
}
... ...
... ... @@ -13,6 +13,7 @@ body {
body {
padding-top: 50px;
font-size: 13px;
background: #f4f6f8;
}
.dropdown:hover .dropdown-menu {
display: block;
... ... @@ -100,7 +101,10 @@ form.form-horizontal .control-label {
}
.panel-default {
padding: 0 15px;
border-color: #e4ecf3;
border: none;
-webkit-box-shadow: none;
-moz-box-shadow: none;
box-shadow: none;
}
.panel-default > .panel-heading {
position: relative;
... ... @@ -109,6 +113,14 @@ form.form-horizontal .control-label {
background: #fff;
border-bottom: 1px solid #f5f5f5;
}
.panel-default h2.page-header {
margin-top: 0;
height: 50px;
line-height: 31px;
font-size: 18px;
padding: 10px 0;
border-bottom: 1px solid #f5f5f5;
}
.panel-default > .panel-heading .panel-title {
color: #313131;
}
... ... @@ -320,7 +332,6 @@ footer.footer .copyright a:hover {
-moz-background-clip: padding;
border-radius: 4px;
background-clip: padding-box;
border: 1px solid #e4ecf3;
}
.login-section {
margin: 50px auto;
... ... @@ -346,7 +357,7 @@ footer.footer .copyright a:hover {
font-size: 16px;
text-align: center;
color: #616161;
background-color: #f5f5f5;
background-color: #ececec;
-webkit-transition: all 0.3s ease;
-moz-transition: all 0.3s ease;
-o-transition: all 0.3s ease;
... ... @@ -400,13 +411,6 @@ main.content {
padding: 20px 0 10px 0;
margin-bottom: 20px;
background-color: #fff;
-webkit-border-radius: 4px;
-webkit-background-clip: padding-box;
-moz-border-radius: 4px;
-moz-background-clip: padding;
border-radius: 4px;
background-clip: padding-box;
border: 1px solid #e4ecf3;
}
.sidenav .list-group:last-child {
margin-bottom: 0;
... ... @@ -439,7 +443,8 @@ main.content {
background-clip: padding-box;
}
.sidenav .list-group .list-group-item:hover {
background-color: #f5f5f5;
border-left: 2px solid rgba(245, 245, 245, 0.38);
background-color: rgba(245, 245, 245, 0.38);
}
.sidenav .list-group .list-group-item > a {
display: block;
... ... @@ -448,7 +453,7 @@ main.content {
}
.sidenav .list-group .list-group-item.active {
border-left: 2px solid #46c37b;
background-color: #f5f5f5;
background-color: rgba(245, 245, 245, 0.38);
}
.sidenav .list-group .list-group-item.active > a {
color: #46c37b;
... ...
... ... @@ -101,10 +101,6 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echart
myChart.resize();
});
$(document).on("click", ".btn-checkversion", function () {
top.window.$("[data-toggle=checkupdate]").trigger("click");
});
$(document).on("click", ".btn-refresh", function () {
setTimeout(function () {
myChart.resize();
... ... @@ -115,4 +111,4 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echart
};
return Controller;
});
\ No newline at end of file
});
... ...
... ... @@ -27,6 +27,53 @@ define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefin
}, 1500);
});
//渲染关联显示字段和存储字段
var renderselect = function (id, data, defaultvalue) {
var html = [];
for (var i = 0; i < data.length; i++) {
html.push("<option value='" + data[i].name + "' " + (defaultvalue == data[i].name ? "selected" : "") + " data-subtext='" + data[i].title + "'>" + data[i].name + "</option>");
}
var select = $(id);
$(select).html(html.join(""));
select.trigger("change");
if (select.data("selectpicker")) {
select.selectpicker('refresh');
}
};
//关联表切换
$(document).on('change', "#c-selectpage-table", function (e, first) {
var that = this;
Fast.api.ajax({
url: "general/config/get_fields_list",
data: {table: $(that).val()},
}, function (data, ret) {
renderselect("#c-selectpage-primarykey", data.fieldList, first ? $("#c-selectpage-primarykey").data("value") : '');
renderselect("#c-selectpage-field", data.fieldList, first ? $("#c-selectpage-field").data("value") : '');
return false;
});
return false;
});
//如果编辑模式则渲染已知数据
if (['selectpage', 'selectpages'].indexOf($("#c-type").val()) > -1) {
$("#c-selectpage-table").trigger("change", true);
}
//切换类型时
$(document).on("change", "#c-type", function () {
var value = $(this).val();
$(".tf").addClass("hidden");
$(".tf.tf-" + value).removeClass("hidden");
if (["selectpage", "selectpages"].indexOf(value) > -1 && $("#c-selectpage-table option").size() == 1) {
//异步加载表列表
Fast.api.ajax({
url: "general/config/get_table_list",
}, function (data, ret) {
renderselect("#c-selectpage-table", data.tableList);
return false;
});
}
});
//切换显示隐藏变量字典列表
$(document).on("change", "form#add-form select[name='row[type]']", function (e) {
$("#add-content-container").toggleClass("hide", ['select', 'selects', 'checkbox', 'radio'].indexOf($(this).val()) > -1 ? false : true);
... ...
... ... @@ -11258,7 +11258,7 @@ define('table',['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstr
});
});
//当内容渲染完成后
table.on('post-body.bs.table', function (e, settings, json, xhr) {
table.on('post-body.bs.table', function (e, data) {
$(Table.config.refreshbtn, toolbar).find(".fa").removeClass("fa-spin");
if ($(Table.config.checkboxtd + ":first", table).find("input[type='checkbox'][data-index]").size() > 0) {
// 拖拽选择,需要重新绑定事件
... ...
... ... @@ -198,7 +198,7 @@ define(['jquery', 'bootstrap', 'moment', 'moment/locale/zh-cn', 'bootstrap-table
});
});
//当内容渲染完成后
table.on('post-body.bs.table', function (e, settings, json, xhr) {
table.on('post-body.bs.table', function (e, data) {
$(Table.config.refreshbtn, toolbar).find(".fa").removeClass("fa-spin");
if ($(Table.config.checkboxtd + ":first", table).find("input[type='checkbox'][data-index]").size() > 0) {
// 拖拽选择,需要重新绑定事件
... ...
... ... @@ -24,1289 +24,1302 @@
html,
body {
height: 100%;
height: 100%;
}
body {
background: #f1f4f6;
font-size: 13px;
background: #f1f4f6;
font-size: 13px;
}
body.is-dialog {
background: #fff;
background: #fff;
}
.selection {
position: absolute;
border: 1px solid #8B9;
background-color: #BEC;
position: absolute;
border: 1px solid #8B9;
background-color: #BEC;
}
.main-header {
.logo, .navbar {
.transition(none);
}
.logo, .navbar {
.transition(none);
}
.navbar {
position: relative;
}
.navbar {
position: relative;
}
}
.bootstrap-dialog .modal-dialog {
/*width: 70%;*/
max-width: 885px;
/*width: 70%;*/
max-width: 885px;
}
/*iOS兼容*/
html.ios-fix, html.ios-fix body {
height: 100%;
overflow: auto;
-webkit-overflow-scrolling: touch;
height: 100%;
overflow: auto;
-webkit-overflow-scrolling: touch;
}
.wrapper {
height: 100%;
height: 100%;
}
#header {
background: #fff;
//box-shadow: 0 2px 2px rgba(0,0,0,.05),0 1px 0 rgba(0,0,0,.05);
background: #fff;
//box-shadow: 0 2px 2px rgba(0,0,0,.05),0 1px 0 rgba(0,0,0,.05);
}
.content-wrapper {
position: relative;
height: 100%;
position: relative;
height: 100%;
}
.control-relative {
position: relative;
position: relative;
}
.tab-addtabs {
//overflow: hidden;
.tab-pane {
height: 100%;
width: 100%;
}
//overflow: hidden;
.tab-pane {
height: 100%;
width: 100%;
}
}
.row-between {
.col-xs-6 + .col-xs-6:before {
content: "-";
position: absolute;
left: -2%;
top: 6px;
}
.col-xs-6 + .col-xs-6:before {
content: "-";
position: absolute;
left: -2%;
top: 6px;
}
}
@media only screen and (min-width: 481px) {
.row-flex {
display: flex;
flex-wrap: wrap;
}
.row-flex {
display: flex;
flex-wrap: wrap;
}
.row-flex > [class*='col-'] {
display: flex;
flex-direction: column;
}
.row-flex > [class*='col-'] {
display: flex;
flex-direction: column;
}
.row-flex.row:after,
.row-flex.row:before {
display: flex;
}
.row-flex.row:after,
.row-flex.row:before {
display: flex;
}
}
@media (max-width: 991px) {
.main-header .navbar-custom-menu a {
&.btn-danger {
color: #fff;
background-color: @brand-danger;
}
.main-header .navbar-custom-menu a {
&.btn-danger {
color: #fff;
background-color: @brand-danger;
}
&.btn-primary {
color: #fff;
background-color: @brand-primary;
&.btn-primary {
color: #fff;
background-color: @brand-primary;
}
}
}
}
.common-search-table {
min-height: 20px;
padding: 15px;
margin-bottom: 15px;
background-color: #f5f5f5;
min-height: 20px;
padding: 15px;
margin-bottom: 15px;
background-color: #f5f5f5;
}
/* 固定的底部按钮 */
.fixed-footer {
position: fixed;
bottom: 0;
background-color: #ecf0f1;
width: 100%;
margin-bottom: 0;
padding: 10px;
position: fixed;
bottom: 0;
background-color: #ecf0f1;
width: 100%;
margin-bottom: 0;
padding: 10px;
}
table.table-template {
overflow: hidden;
overflow: hidden;
}
.sp_container {
.msg-box {
position: absolute;
right: 0;
top: 0;
}
.msg-box {
position: absolute;
right: 0;
top: 0;
}
.sp_element_box {
overflow: unset;
.sp_element_box {
overflow: unset;
> li.input_box {
position: unset;
}
> li.input_box {
position: unset;
}
.msg-box {
right: -24px;
.msg-box {
right: -24px;
}
}
}
}
@media (max-width: 767px) {
.sp_container .sp_element_box .msg-box {
left: inherit;
}
.sp_container .sp_element_box .msg-box {
left: inherit;
}
}
.toast-top-right-index {
top: 62px;
right: 12px;
top: 62px;
right: 12px;
}
.bootstrap-select .status {
background: #f0f0f0;
clear: both;
color: #999;
font-size: 12px;
font-weight: 500;
line-height: 1;
margin-bottom: -5px;
padding: 10px 20px;
background: #f0f0f0;
clear: both;
color: #999;
font-size: 12px;
font-weight: 500;
line-height: 1;
margin-bottom: -5px;
padding: 10px 20px;
}
select.bs-select-hidden, select.selectpicker {
display: inherit !important;
max-height: 31px;
overflow: hidden;
display: inherit !important;
max-height: 31px;
overflow: hidden;
&[multiple] {
height: 31px;
//visibility: hidden;
padding: 0;
background: #f4f4f4;
&[multiple] {
height: 31px;
//visibility: hidden;
padding: 0;
background: #f4f4f4;
option {
color: #f4f4f4;
.opacity(0);
}
option {
color: #f4f4f4;
.opacity(0);
}
@media not all and (min-resolution: .001dpcm) {
@supports (-webkit-appearance:none) {
visibility: hidden;
}
@media not all and (min-resolution: .001dpcm) {
@supports (-webkit-appearance:none) {
visibility: hidden;
}
}
}
}
}
.img-center {
margin: 0 auto;
display: inline;
float: none;
margin: 0 auto;
display: inline;
float: none;
}
/*
* RIBBON
*/
#ribbon {
overflow: hidden;
padding: 15px 15px 0 15px;
position: relative;
a {
color: #777 !important;
text-decoration: none !important;
}
overflow: hidden;
padding: 15px 15px 0 15px;
position: relative;
.breadcrumb {
display: inline-block;
margin: 0;
padding: 0;
background: none;
vertical-align: top;
}
.breadcrumb > .active,
.breadcrumb li {
color: #aaa;
}
.shortcut {
a {
margin-left: 10px;
color: #777 !important;
text-decoration: none !important;
}
.breadcrumb {
display: inline-block;
margin: 0;
padding: 0;
background: none;
vertical-align: top;
}
.breadcrumb > .active,
.breadcrumb li {
color: #aaa;
}
.shortcut {
a {
margin-left: 10px;
}
}
}
}
.is-dialog {
#main {
background: #fff;
}
#main {
background: #fff;
}
.layer-footer {
display: none;
}
.layer-footer {
display: none;
}
}
form.form-horizontal .control-label {
font-weight: normal;
font-weight: normal;
}
.user-panel > .image img {
width: 45px;
height: 45px;
width: 45px;
height: 45px;
}
/*panel扩展描述样式*/
.panel-intro {
margin-bottom: 0;
border: none;
margin-bottom: 0;
border: none;
> .panel-heading {
padding: 15px;
padding-bottom: 0;
background: @panel-intro-bg;
border-color: @panel-intro-bg;
position: relative;
> .panel-heading {
padding: 15px;
padding-bottom: 0;
background: @panel-intro-bg;
border-color: @panel-intro-bg;
position: relative;
.panel-lead {
margin-bottom: 15px;
.panel-lead {
margin-bottom: 15px;
em {
display: block;
font-weight: bold;
font-style: normal;
}
}
em {
display: block;
font-weight: bold;
font-style: normal;
}
}
.panel-title {
height: 25px;
font-weight: normal;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.panel-title {
height: 25px;
font-weight: normal;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.panel-control {
height: 42px;
position: absolute;
top: 8px;
right: 8px;
.panel-control {
height: 42px;
position: absolute;
top: 8px;
right: 8px;
.fa {
font-size: 14px;
}
}
.fa {
font-size: 14px;
}
}
.nav-tabs {
border-bottom: 0;
margin-bottom: 0;
}
.nav-tabs {
border-bottom: 0;
margin-bottom: 0;
}
.nav-tabs > li > a {
margin-right: 4px;
color: #95a5a6;
background-color: darken(@panel-intro-bg, 5%);
border: 1px solid @panel-intro-bg;
border-bottom-color: transparent;
}
.nav-tabs > li > a {
margin-right: 4px;
color: #95a5a6;
background-color: darken(@panel-intro-bg, 5%);
border: 1px solid @panel-intro-bg;
border-bottom-color: transparent;
}
.nav-tabs > li > a:hover, .nav-tabs > li > a:focus {
border: 1px solid @panel-intro-bg;
color: #7b8a8b;
background-color: darken(@panel-intro-bg, 10%);
}
.nav-tabs > li > a:hover, .nav-tabs > li > a:focus {
border: 1px solid @panel-intro-bg;
color: #7b8a8b;
background-color: darken(@panel-intro-bg, 10%);
}
.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
color: #7b8a8b;
background-color: #ffffff;
border-bottom-color: transparent;
cursor: default;
.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
color: #7b8a8b;
background-color: #ffffff;
border-bottom-color: transparent;
cursor: default;
}
}
}
}
/*单表格*/
.panel-tabs {
.panel-heading {
padding: 12px 15px 12px 15px;
.panel-heading {
padding: 12px 15px 12px 15px;
.panel-lead {
margin-bottom: 0px;
}
.panel-lead {
margin-bottom: 0px;
}
.panel-title {
.panel-title {
}
}
}
}
/*选项卡*/
.panel-nav {
.panel-heading {
padding: 0px;
padding-bottom: 0;
background: @main-bg;
border-color: @main-bg;
}
.panel-heading {
padding: 0px;
padding-bottom: 0;
background: @main-bg;
border-color: @main-bg;
}
.nav-tabs > li > a {
padding: 12px 15px;
background-color: @panel-intro-bg;
border: 1px solid @main-bg;
}
.nav-tabs > li > a {
padding: 12px 15px;
background-color: @panel-intro-bg;
border: 1px solid @main-bg;
}
.nav-tabs > li > a:hover, .nav-tabs > li > a:focus {
border: 1px solid @panel-intro-bg;
background-color: @panel-intro-bg;
}
.nav-tabs > li > a:hover, .nav-tabs > li > a:focus {
border: 1px solid @panel-intro-bg;
background-color: @panel-intro-bg;
}
.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
border-color: @main-bg;
border-bottom-color: transparent;
}
.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
border-color: @main-bg;
border-bottom-color: transparent;
}
}
/*顶栏addtabs*/
.nav-addtabs {
height: 100%;
height: 100%;
&.disable-top-badge {
> li > a > .pull-right-container {
display: none;
&.disable-top-badge {
> li > a > .pull-right-container {
display: none;
}
}
}
border: none;
border: none;
> li {
margin: 0;
> li {
margin: 0;
> a {
height: 50px;
line-height: 50px;
padding: 0 15px;
border-radius: 0;
border: none;
border-right: 1px solid rgba(0, 0, 0, 0.05);
margin: 0;
color: #95a5a6;
> a {
height: 50px;
line-height: 50px;
padding: 0 15px;
border-radius: 0;
border: none;
border-right: 1px solid rgba(0, 0, 0, 0.05);
margin: 0;
color: #95a5a6;
&:hover, &:focus {
border: none;
color: #2c3e50;
border-right: 1px solid rgba(0, 0, 0, 0.05);
}
}
&:hover, &:focus {
border: none;
color: #2c3e50;
border-right: 1px solid rgba(0, 0, 0, 0.05);
}
}
&.active > a {
height: 50px;
line-height: 50px;
padding: 0 15px;
border-radius: 0;
border: none;
border-right: 1px solid rgba(0, 0, 0, 0.05);
background: #f1f4f6;
color: #2c3e50;
overflow: hidden;
&:hover, &:focus {
border: none;
color: #2c3e50;
background: #f1f4f6;
border-right: 1px solid rgba(0, 0, 0, 0.05);
}
}
.close-tab {
font-size: 10px;
position: absolute;
right: 0px;
top: 50%;
margin-top: -8px;
z-index: 100;
cursor: pointer;
color: #eee;
&:before {
content: "\e626";
font-family: iconfont;
font-style: normal;
font-weight: normal;
text-decoration: inherit;
font-size: 18px;
}
display: none;
}
}
.open > a {
&:hover, &:focus {
border-right: 1px solid rgba(0, 0, 0, 0.05);
}
}
ul li {
position: relative;
}
&.active > a {
height: 50px;
line-height: 50px;
padding: 0 15px;
border-radius: 0;
border: none;
border-right: 1px solid rgba(0, 0, 0, 0.05);
background: #f1f4f6;
color: #2c3e50;
overflow: hidden;
&:hover, &:focus {
border: none;
color: #2c3e50;
background: #f1f4f6;
border-right: 1px solid rgba(0, 0, 0, 0.05);
}
}
li:hover > .close-tab {
display: block;
}
}
.close-tab {
font-size: 10px;
position: absolute;
right: 0px;
top: 50%;
margin-top: -8px;
z-index: 100;
cursor: pointer;
color: #eee;
&:before {
content: "\e626";
font-family: iconfont;
font-style: normal;
font-weight: normal;
text-decoration: inherit;
font-size: 18px;
}
display: none;
}
}
.multiplenav {
.content-wrapper, .right-side {
padding-top: 94px;
}
.open > a {
&:hover, &:focus {
border-right: 1px solid rgba(0, 0, 0, 0.05);
}
}
#firstnav .nav-addtabs {
padding-right: 450px;
}
ul li {
position: relative;
}
li:hover > .close-tab {
display: block;
}
}
#firstnav {
height: 50px;
border-bottom: 1px solid transparent;
box-shadow: 0 1px 4px rgba(0, 21, 41, .08);
position: relative;
.sidebar-toggle {
position: absolute;
width: 45px;
text-align: center;
height: 50px;
line-height: 50px;
padding: 0;
}
border-bottom: 1px solid transparent;
box-shadow: 0 1px 4px rgba(0, 21, 41, .08);
position: relative;
.nav-addtabs {
position: absolute;
left: 45px;
z-index: 98;
}
.sidebar-toggle {
position: absolute;
width: 45px;
text-align: center;
height: 50px;
line-height: 50px;
padding: 0;
}
.navbar-custom-menu {
position: absolute;
top: 0;
right: 0;
z-index: 99;
background: transparent;
}
.nav-addtabs {
position: absolute;
left: 45px;
z-index: 98;
}
.navbar-custom-menu {
position: absolute;
top: 0;
right: 0;
z-index: 99;
background: transparent;
}
}
/*次栏菜单栏*/
#secondnav {
height: 44px;
position: absolute;
top: 50px;
left: 0;
background: #fff;
width: 100%;
box-shadow: 0 1px 4px rgba(0, 21, 41, .08);
padding: 5px 10px;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
.nav-addtabs {
height: 100%;
display: none;
height: 44px;
position: absolute;
top: 50px;
left: 0;
background: #fff;
width: 100%;
box-shadow: 0 1px 4px rgba(0, 21, 41, .08);
padding: 5px 10px;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
&.disable-top-badge {
> li > a > .pull-right-container {
display: none;
}
}
.nav-addtabs {
height: 100%;
border: none;
&.disable-top-badge {
> li > a > .pull-right-container {
display: none;
}
}
> li {
border: 1px solid #eee;
border-radius: 3px;
padding: 0 15px;
height: 30px;
line-height: 30px;
margin: 2px 5px 2px 0;
background: #fff;
> a {
display: block;
color: #495060 !important;
height: 100%;
padding: 0;
line-height: 28px;
font-size: 12px;
vertical-align: middle;
opacity: 1;
overflow: hidden;
background: none;
border: none;
}
&.active {
border-color: #bdbebd;
background-color: #f7f7f7;
}
> li {
border: 1px solid #eee;
border-radius: 3px;
padding: 0 15px;
height: 30px;
line-height: 30px;
margin: 2px 5px 2px 0;
background: #fff;
> a {
display: block;
color: #495060 !important;
height: 100%;
padding: 0;
line-height: 28px;
font-size: 12px;
vertical-align: middle;
opacity: 1;
overflow: hidden;
background: none;
border: none;
}
&.active {
border-color: #bdbebd;
background-color: #f7f7f7;
}
.close-tab {
font-size: 10px;
position: absolute;
right: 0px;
top: 50%;
margin-top: -8px;
z-index: 100;
cursor: pointer;
color: #eee;
&:before {
content: "\e626";
font-family: iconfont;
font-style: normal;
font-weight: normal;
text-decoration: inherit;
font-size: 18px;
}
}
&:hover, &:focus {
border-color: #bdbebd;
}
}
.close-tab {
font-size: 10px;
position: absolute;
right: 0px;
top: 50%;
margin-top: -8px;
z-index: 100;
cursor: pointer;
color: #eee;
&:before {
content: "\e626";
font-family: iconfont;
font-style: normal;
font-weight: normal;
text-decoration: inherit;
font-size: 18px;
ul li {
position: relative;
}
}
&:hover, &:focus {
border-color: #bdbebd;
}
li:hover > .close-tab {
display: block;
border-color: #222e32;
color: #222e32
}
}
ul li {
position: relative;
}
}
li:hover > .close-tab {
display: block;
border-color: #222e32;
color: #222e32
.multiplenav {
.content-wrapper, .right-side {
padding-top: 50px;
}
}
#firstnav .nav-addtabs {
padding-right: 450px;
}
}
.main-sidebar .sidebar-form {
overflow: visible;
.multipletab {
#secondnav {
display: block;
}
.menuresult {
z-index: 999;
position: absolute;
top: 34px;
left: -1px;
width: 100%;
max-height: 250px;
overflow: auto;
margin: 0;
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
&.multiplenav {
.content-wrapper, .right-side {
padding-top: 94px;
}
}
}
a {
border-top: 1px solid #eee;
display: block;
background-color: #fff;
border-bottom: 1px solid #eee;
margin-bottom: -1px;
display: block;
padding: 10px 15px;
color: #222d32;
.main-sidebar .sidebar-form {
overflow: visible;
&:hover {
background: #eee;
}
.menuresult {
z-index: 999;
position: absolute;
top: 34px;
left: -1px;
width: 100%;
max-height: 250px;
overflow: auto;
margin: 0;
border-top: none;
border-top-left-radius: 0;
border-top-right-radius: 0;
a {
border-top: 1px solid #eee;
display: block;
background-color: #fff;
border-bottom: 1px solid #eee;
margin-bottom: -1px;
display: block;
padding: 10px 15px;
color: #222d32;
&:hover {
background: #eee;
}
}
}
}
}
.input-group .sp_result_area {
width: 100%;
width: 100%;
}
.sidebar-menu {
&.show-submenu {
.treeview-menu {
display: block;
&.show-submenu {
.treeview-menu {
display: block;
}
}
}
> li .badge {
margin-top: 0;
}
> li .badge {
margin-top: 0;
}
.treeview-menu > li > a {
font-size: inherit;
}
.treeview-menu > li > a {
font-size: inherit;
}
}
.sidebar-collapse {
.user-panel > .image img {
width: 25px;
height: 25px;
}
.user-panel > .image img {
width: 25px;
height: 25px;
}
}
@media (min-width: 768px) {
.sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {
top: 41px;
}
.sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > .treeview-menu {
top: 41px;
}
.sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > .pull-right-container {
top: 7px !important;
height: 17px;
}
.sidebar-mini.sidebar-collapse .sidebar-menu > li:hover > a > .pull-right-container {
top: 7px !important;
height: 17px;
}
}
.fieldlist dd {
display: block;
margin: 5px 0;
display: block;
margin: 5px 0;
input {
display: inline-block;
width: 300px;
}
input {
display: inline-block;
width: 300px;
}
input:first-child {
width: 110px;
}
input:first-child {
width: 110px;
}
ins {
width: 110px;
display: inline-block;
text-decoration: none;
font-weight: bold;
}
ins {
width: 110px;
display: inline-block;
text-decoration: none;
font-weight: bold;
}
}
/* 弹窗中的表单 */
.form-layer {
height: 100%;
min-height: 150px;
min-width: 300px;
height: 100%;
min-height: 150px;
min-width: 300px;
.form-body {
width: 100%;
overflow: auto;
top: 0;
position: absolute;
z-index: 10;
bottom: 50px;
padding: 15px;
}
.form-body {
width: 100%;
overflow: auto;
top: 0;
position: absolute;
z-index: 10;
bottom: 50px;
padding: 15px;
}
.form-footer {
height: 50px;
line-height: 50px;
background-color: #ecf0f1;
width: 100%;
position: absolute;
z-index: 200;
bottom: 0;
margin: 0;
}
.form-footer {
height: 50px;
line-height: 50px;
background-color: #ecf0f1;
width: 100%;
position: absolute;
z-index: 200;
bottom: 0;
margin: 0;
}
.form-footer .form-group {
margin-left: 0;
margin-right: 0;
}
.form-footer .form-group {
margin-left: 0;
margin-right: 0;
}
}
#treeview {
.jstree-container-ul .jstree-node {
display: block;
clear: both;
}
.jstree-container-ul .jstree-node {
display: block;
clear: both;
}
.jstree-leaf:not(:first-child) {
float: left;
background: none;
margin-left: 0;
min-width: 80px;
clear: none;
}
.jstree-leaf:not(:first-child) {
float: left;
background: none;
margin-left: 0;
min-width: 80px;
clear: none;
}
.jstree-leaf {
float: left;
margin-left: 0;
padding-left: 24px;
min-width: 80px;
clear: none;
color: #777;
}
.jstree-leaf {
float: left;
margin-left: 0;
padding-left: 24px;
min-width: 80px;
clear: none;
color: #777;
}
.jstree-leaf > .jstree-icon, .jstree-leaf .jstree-themeicon {
display: none;
}
.jstree-leaf > .jstree-icon, .jstree-leaf .jstree-themeicon {
display: none;
}
.jstree-last {
background-image: url("../img/32px.png");
background-position: -292px -4px;
background-repeat: repeat-y;
}
.jstree-last {
background-image: url("../img/32px.png");
background-position: -292px -4px;
background-repeat: repeat-y;
}
.jstree-children {
.clearfix();
}
.jstree-children {
.clearfix();
}
.jstree-themeicon {
display: none;
}
.jstree-themeicon {
display: none;
}
}
/*去除bootstrap-table的边框*/
.fixed-table-container {
border: none !important;
border: none !important;
tbody .selected td {
background-color: rgba(216, 224, 230, .5);
}
tbody .selected td {
background-color: rgba(216, 224, 230, .5);
}
}
/*修复nice-validator新版下的一处BUG*/
.nice-validator {
input, select, textarea, [contenteditable] {
vertical-align: top;
display: inline-block;
*display: inline;
*zoom: 1;
}
input, select, textarea, [contenteditable] {
vertical-align: top;
display: inline-block;
*display: inline;
*zoom: 1;
}
}
/*修复nice-validator和summernote的编辑框冲突*/
.nice-validator .note-editor .note-editing-area .note-editable {
display: inherit;
display: inherit;
}
/*预览区域*/
.plupload-preview, .faupload-preview {
padding: 0 10px;
margin-bottom: 0;
padding: 0 10px;
margin-bottom: 0;
li {
margin-top: 15px;
}
li {
margin-top: 15px;
}
.thumbnail {
margin-bottom: 10px;
}
.thumbnail {
margin-bottom: 10px;
}
a {
display: block;
a {
display: block;
&:first-child {
height: 90px;
}
&:first-child {
height: 90px;
}
img {
height: 80px;
object-fit: cover;
img {
height: 80px;
object-fit: cover;
}
}
}
}
.pjax-loader-bar .progress {
position: fixed;
top: 0;
left: 0;
height: 2px;
background: #77b6ff;
box-shadow: 0 0 10px rgba(119, 182, 255, 0.7);
-webkit-transition: width 0.4s ease;
transition: width 0.4s ease;
position: fixed;
top: 0;
left: 0;
height: 2px;
background: #77b6ff;
box-shadow: 0 0 10px rgba(119, 182, 255, 0.7);
-webkit-transition: width 0.4s ease;
transition: width 0.4s ease;
}
.dropdown-menu.text-left {
a, li {
text-align: left !important;
}
a, li {
text-align: left !important;
}
}
.bootstrap-table .fixed-table-toolbar .dropdown-menu {
overflow: auto;
overflow: auto;
}
.bootstrap-table .fa-toggle-on.fa-2x {
font-size: 1.86em;
font-size: 1.86em;
}
.bootstrap-table .form-commonsearch .form-group {
margin-left: 0;
margin-right: 0;
white-space: nowrap;
margin-left: 0;
margin-right: 0;
white-space: nowrap;
}
.toolbar {
margin-top: 10px;
margin-bottom: 10px;
margin-top: 10px;
margin-bottom: 10px;
}
.fixed-table-toolbar .bs-bars, .fixed-table-toolbar .columns, .fixed-table-toolbar .search {
line-height: inherit;
line-height: inherit;
}
.fixed-table-toolbar .toolbar {
margin-top: 0;
margin-bottom: 0;
margin-top: 0;
margin-bottom: 0;
}
.bootstrap-table table tbody tr:first-child td .bs-checkbox {
vertical-align: middle;
vertical-align: middle;
}
.bootstrap-table td.bs-checkbox {
vertical-align: middle;
vertical-align: middle;
}
table.table-nowrap {
tbody > tr > td, thead > tr > th {
white-space: nowrap;
}
tbody > tr > td, thead > tr > th {
white-space: nowrap;
}
}
.fixed-table-container thead th .sortable {
padding-right: 0;
padding-right: 0;
}
.dropdown-submenu {
position: relative;
> .dropdown-menu {
overflow: auto;
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
.border-radius(0 6px 6px 6px);
}
position: relative;
&:hover {
> .dropdown-menu {
display: block;
overflow: auto;
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
.border-radius(0 6px 6px 6px);
}
&:hover {
> .dropdown-menu {
display: block;
}
> a:after {
border-left-color: #fff;
}
}
> a:after {
border-left-color: #fff;
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: #ccc;
margin-top: 5px;
margin-right: -10px;
}
}
> a:after {
display: block;
content: " ";
float: right;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
border-width: 5px 0 5px 5px;
border-left-color: #ccc;
margin-top: 5px;
margin-right: -10px;
}
&.pull-left {
float: none;
&.pull-left {
float: none;
> .dropdown-menu {
left: -100%;
margin-left: 10px;
.border-radius(6px 0 6px 6px);
> .dropdown-menu {
left: -100%;
margin-left: 10px;
.border-radius(6px 0 6px 6px);
}
}
}
}
/*重写toast的几个背景色*/
.toast-primary {
background-color: #48c9b0 !important;
background-color: #48c9b0 !important;
}
.toast-success {
background-color: #18bc9c !important;
background-color: #18bc9c !important;
}
.toast-error {
background-color: #e74c3c !important;
background-color: #e74c3c !important;
}
.toast-info {
background-color: #5dade2 !important;
background-color: #5dade2 !important;
}
.toast-warning {
background-color: #f1c40f !important;
background-color: #f1c40f !important;
}
.toast-inverse {
background-color: #34495e !important;
background-color: #34495e !important;
}
.toast-default {
background-color: #bdc3c7 !important;
background-color: #bdc3c7 !important;
}
#toast-container {
> div, > div:hover {
.box-shadow(0 0 3px #eee);
}
> div, > div:hover {
.box-shadow(0 0 3px #eee);
}
}
.layui-layer-fast {
.layui-layer-title {
background: #2c3e50 !important;
color: #fff !important;
border-bottom: none;
//只有当包含layui-layer-title标题时才显示按钮
~ .layui-layer-setwin {
top: 0px;
height: 42px;
> a {
height: 42px;
line-height: 42px;
display: inline-block;
}
.layui-layer-title {
background: #2c3e50 !important;
color: #fff !important;
border-bottom: none;
//只有当包含layui-layer-title标题时才显示按钮
~ .layui-layer-setwin {
top: 0px;
height: 42px;
> a {
height: 42px;
line-height: 42px;
display: inline-block;
}
}
}
}
&.layui-layer-border {
border: none !important;
box-shadow: 1px 1px 50px rgba(0, 0, 0, .3) !important;
}
&.layui-layer-iframe {
//overflow:hidden!important;
overflow: visible;
}
.layui-layer-moves {
.box-sizing(content-box);
}
/*自定义底部灰色操作区*/
.layui-layer-btn {
text-align: center !important;
padding: 10px !important;
background: #ecf0f1;
overflow: hidden;
&.layui-layer-border {
border: none !important;
box-shadow: 1px 1px 50px rgba(0, 0, 0, .3) !important;
}
a {
background-color: #95a5a6;
border-color: #95a5a6;
color: #fff !important;
height: 31px;
margin-top: 0;
border: 1px solid transparent;
&.layui-layer-iframe {
//overflow:hidden!important;
overflow: visible;
}
.layui-layer-btn0 {
background-color: #18bc9c;
border-color: #18bc9c;
.layui-layer-moves {
.box-sizing(content-box);
}
}
.layui-layer-footer {
padding: 8px 20px;
background-color: #ecf0f1;
height: auto;
text-align: inherit !important;
}
/*自定义底部灰色操作区*/
.layui-layer-setwin {
> a {
background: none !important;
.layui-layer-btn {
text-align: center !important;
padding: 10px !important;
background: #ecf0f1;
overflow: hidden;
cite {
display: none;
}
&:after {
content: "\e625";
font-family: iconfont;
font-style: normal;
font-weight: normal;
text-decoration: inherit;
position: absolute;
font-size: 18px;
color: #fff;
margin: 0;
z-index: 1;
}
a {
background-color: #95a5a6;
border-color: #95a5a6;
color: #fff !important;
height: 31px;
margin-top: 0;
border: 1px solid transparent;
}
&:hover {
text-decoration: none !important;
background: none !important;
}
.layui-layer-btn0 {
background-color: #18bc9c;
border-color: #18bc9c;
}
}
&:focus {
text-decoration: none !important;
}
.layui-layer-footer {
padding: 8px 20px;
background-color: #ecf0f1;
height: auto;
text-align: inherit !important;
}
.layui-layer-min {
display: none;
.layui-layer-setwin {
> a {
background: none !important;
cite {
display: none;
}
&:after {
content: "\e625";
font-family: iconfont;
font-style: normal;
font-weight: normal;
text-decoration: inherit;
position: absolute;
font-size: 18px;
color: #fff;
margin: 0;
z-index: 1;
}
&:hover {
text-decoration: none !important;
background: none !important;
}
&:focus {
text-decoration: none !important;
}
}
&:after {
content: "\e625";
}
}
.layui-layer-min {
display: none;
.layui-layer-max {
display: none;
&:after {
content: "\e625";
}
}
&:after {
content: "\e623";
}
}
.layui-layer-max {
display: none;
.layui-layer-maxmin {
display: none;
&:after {
content: "\e623";
}
}
&:after {
content: "\e624";
}
}
.layui-layer-maxmin {
display: none;
.layui-layer-close1 {
&:after {
content: "\e626";
}
}
&:after {
content: "\e624";
}
}
//样式二关闭按钮
.layui-layer-close2, .layui-layer-close2:hover {
background: url('../libs/fastadmin-layer/dist/theme/default/icon.png') no-repeat -149px -31px !important;
top: -30px;
right: -30px;
.layui-layer-close1 {
&:after {
content: "\e626";
}
}
&:after {
display: none;
}
//样式二关闭按钮
.layui-layer-close2, .layui-layer-close2:hover {
background: url('../libs/fastadmin-layer/dist/theme/default/icon.png') no-repeat -149px -31px !important;
top: -30px;
right: -30px;
&:after {
display: none;
}
}
}
}
}
.layui-layer-content {
clear: both;
clear: both;
}
.layui-layer-fast-msg {
min-width: 100px;
min-width: 100px;
}
.layui-layer-fast-tab {
.layui-layer-title {
.layui-this {
color: #333;
.layui-layer-title {
.layui-this {
color: #333;
}
}
}
.layui-layer-content {
.layui-layer-tabmain {
margin: 0;
padding: 0;
.layui-layer-content {
.layui-layer-tabmain {
margin: 0;
padding: 0;
}
}
}
}
.input-group > .msg-box.n-right {
position: absolute;
position: absolute;
}
@media (min-width: 564px) {
body.is-dialog .daterangepicker {
min-width: 130px;
}
body.is-dialog .daterangepicker {
min-width: 130px;
}
body.is-dialog .daterangepicker .ranges ul {
width: 130px;
}
body.is-dialog .daterangepicker .ranges ul {
width: 130px;
}
}
/*手机版样式*/
@media (max-width: @screen-phone) {
#firstnav {
.nav-addtabs {
//display: none;
}
#firstnav {
.nav-addtabs {
//display: none;
}
.navbar-custom-menu {
ul li a {
padding-left: 10px;
padding-right: 10px;
}
}
.navbar-custom-menu {
ul li a {
padding-left: 10px;
padding-right: 10px;
}
}
.navbar-nav > .user-menu .user-image {
margin-top: -3px;
.navbar-nav > .user-menu .user-image {
margin-top: -3px;
}
}
}
.fixed-table-toolbar {
.columns-right.btn-group {
display: none;
.fixed-table-toolbar {
.columns-right.btn-group {
display: none;
}
}
}
.fixed .content-wrapper, .fixed .right-side {
padding-top: 50px;
}
.multiplenav {
.fixed .content-wrapper, .fixed .right-side {
padding-top: 94px;
padding-top: 50px;
}
.content-wrapper, .right-side {
padding-top: 94px;
.multiplenav {
.fixed .content-wrapper, .fixed .right-side {
padding-top: 94px;
}
.content-wrapper, .right-side {
padding-top: 94px;
}
}
}
.main-sidebar, .left-side {
padding-top: 144px;
}
.main-sidebar, .left-side {
padding-top: 144px;
}
}
/*平板样式*/
@media (max-width: @screen-xs-max) {
body .wrapper .main-header .logo {
background: none;
color: #fff;
border-bottom: 0 solid transparent;
position: absolute;
top: 0;
z-index: 1200;
width: 130px;
left: 50%;
margin-left: -65px;
}
body .sidebar .mobilenav a.btn-app {
color: #444;
width: 100px;
height: 70px;
font-size: 13px;
i.fa {
font-size: 24px;
body .wrapper .main-header .logo {
background: none;
color: #fff;
border-bottom: 0 solid transparent;
position: absolute;
top: 0;
z-index: 1200;
width: 130px;
left: 50%;
margin-left: -65px;
}
span {
margin-top: 5px;
display: block;
}
body .sidebar .mobilenav a.btn-app {
color: #444;
width: 100px;
height: 70px;
font-size: 13px;
&.active {
color: #222d32;
}
}
i.fa {
font-size: 24px;
}
body .wrapper .main-header .navbar .dropdown-menu li {
> a {
color: #333;
span {
margin-top: 5px;
display: block;
}
&:hover {
background: #eee;
}
&.active {
color: #222d32;
}
}
&.active > a {
color: #fff;
body .wrapper .main-header .navbar .dropdown-menu li {
> a {
color: #333;
&:hover {
background: #222d32
}
}
}
&:hover {
background: #eee;
}
}
.main-sidebar, .left-side {
padding-top: 50px;
}
&.active > a {
color: #fff;
.n-bootstrap {
.n-right {
margin-top: 0;
top: -20px;
position: absolute;
left: 0;
text-align: right;
width: 100%;
&:hover {
background: #222d32
}
}
}
.msg-wrap {
position: relative;
}
.main-sidebar, .left-side {
padding-top: 50px;
}
.col-xs-12 > .n-right {
.msg-wrap {
margin-right: 15px;
}
.n-bootstrap {
.n-right {
margin-top: 0;
top: -20px;
position: absolute;
left: 0;
text-align: right;
width: 100%;
.msg-wrap {
position: relative;
}
}
.col-xs-12 > .n-right {
.msg-wrap {
margin-right: 15px;
}
}
}
}
}
/*修复radio和checkbox样式对齐*/
.radio, .checkbox {
> label {
margin-right: 10px;
> label {
margin-right: 10px;
> input {
margin: 2px 0 0;
> input {
margin: 2px 0 0;
}
}
}
}
.wipecache li a {
color: #444444 !important;
color: #444444 !important;
}
/*修正开关关闭下的颜色值*/
.btn-switcher {
&.disabled {
opacity: .6;
cursor: not-allowed;
}
&.disabled {
opacity: .6;
cursor: not-allowed;
}
.text-gray {
color: #d2d6de !important;
}
.text-gray {
color: #d2d6de !important;
}
}
.jumpto input {
height: 31px;
width: 50px;
margin-left: 5px;
margin-right: 5px;
text-align: center;
display: inline-block;
height: 31px;
width: 50px;
margin-left: 5px;
margin-right: 5px;
text-align: center;
display: inline-block;
}
.sidebar-menu li.treeview-open > a > .fa-angle-left, .sidebar-menu li.treeview-open > a > .pull-right-container > .fa-angle-left {
-webkit-transform: rotate(-90deg);
-ms-transform: rotate(-90deg);
-o-transform: rotate(-90deg);
transform: rotate(-90deg);
-webkit-transform: rotate(-90deg);
-ms-transform: rotate(-90deg);
-o-transform: rotate(-90deg);
transform: rotate(-90deg);
}
... ...
... ... @@ -30,6 +30,7 @@ body {
body {
padding-top: 50px;
font-size:13px;
background:#f4f6f8;
}
.dropdown:hover .dropdown-menu {
... ... @@ -121,7 +122,8 @@ form.form-horizontal .control-label {
.panel-default {
padding: 0 15px;
border-color: #e4ecf3;
border: none;
.box-shadow(none);
> .panel-heading {
position: relative;
font-size: 16px;
... ... @@ -129,6 +131,14 @@ form.form-horizontal .control-label {
background: #fff;
border-bottom: 1px solid #f5f5f5;
}
h2.page-header {
margin-top:0;
height:50px;
line-height:31px;
font-size:18px;
padding:10px 0;
border-bottom: 1px solid #f5f5f5;
}
> .panel-heading {
.panel-title {
color: #313131;
... ... @@ -308,7 +318,6 @@ footer.footer{
padding: 15px;
margin-bottom: 20px;
.border-radius(4px);
border: 1px solid #e4ecf3;
}
.login-section {
margin: 50px auto;
... ... @@ -327,7 +336,7 @@ footer.footer{
font-size: 16px;
text-align: center;
color: #616161;
background-color: #f5f5f5;
background-color: #ececec;
.transition(all 0.3s ease);
&:hover {
background-color: #fafafa;
... ... @@ -377,8 +386,6 @@ main.content {
padding: 20px 0 10px 0;
margin-bottom: 20px;
background-color: #fff;
.border-radius(4px);
border: 1px solid #e4ecf3;
.list-group{
&:last-child {
margin-bottom: 0;
... ... @@ -399,7 +406,8 @@ main.content {
.border-radius(0);
}
&:hover {
background-color: #f5f5f5;
border-left: 2px solid rgba(245, 245, 245, 0.38);
background-color: rgba(245, 245, 245, 0.38);
}
> a {
display: block;
... ... @@ -408,7 +416,7 @@ main.content {
}
&.active {
border-left: 2px solid #46c37b;
background-color: #f5f5f5;
background-color: rgba(245, 245, 245, 0.38);
> a {
color: #46c37b;
}
... ...