作者 Karson

新增后台分类管理

新增后台多语言切换
新增后台最新日志更新
修复后台移动端列表无法滚动的BUG
修复后台部分语言文字
... ... @@ -15,6 +15,7 @@ FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台管理系统。
* 基于`Less`进行样式开发
* 基于`Bower`进行前端组件包管理
* 数据库表一键生成`CRUD`,包括控制器、模型、视图、JS、语言包
* 一键压缩打包JS和CSS文件
* 多语言支持,服务端及客户端支持
* 无缝整合又拍云上传功能
* 第三方登录(QQ、微信、微博)整合
... ...
... ... @@ -10,8 +10,8 @@
<div class="dropdown btn-group">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> 设为正常</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> 设为隐藏</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
</ul>
</div>
</div>
... ...
... ... @@ -71,8 +71,8 @@ class Ajax extends Backend
$controllername = input("controllername");
Lang::load(APP_PATH . $modulename . '/lang/' . Lang::detect() . '/' . str_replace('.', '/', $controllername) . '.php');
//强制输出JSON Object
// $result = 'define(' . json_encode(Lang::get(), JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE) . ');';
return jsonp(Lang::get());
$result = 'define(' . json_encode(Lang::get(), JSON_FORCE_OBJECT | JSON_UNESCAPED_UNICODE) . ');';
return $result;
}
/**
... ...
<?php
namespace app\admin\controller;
use app\common\controller\Backend;
use app\common\model\Category as CategoryModel;
use fast\Tree;
/**
* 分类管理
*
* @icon fa fa-list
* @remark 用于统一管理网站的所有分类,分类可进行无限级分类
*/
class Category extends Backend
{
protected $model = null;
protected $categorylist = [];
public function _initialize()
{
parent::_initialize();
$this->model = model('Category');
$tree = Tree::instance();
$tree->init(CategoryModel::getCategoryArray(), 'pid');
$this->categorylist = $tree->getTreeList($tree->getTreeArray(0), 'name');
$categorydata = [0 => __('None')];
foreach ($this->categorylist as $k => $v)
{
$categorydata[$v['id']] = $v['name'];
}
$this->view->assign("typelist", CategoryModel::getTypeList());
$this->view->assign("parentlist", $categorydata);
}
/**
* 查看
*/
public function index()
{
if ($this->request->isAjax())
{
//构造父类select列表选项数据
$list = $this->categorylist;
$total = count($list);
$result = array("total" => $total, "rows" => $list);
return json($result);
}
return $this->view->fetch();
}
}
... ...
... ... @@ -90,6 +90,8 @@ return [
'%d month%s ago' => '%d月前',
'%d year%s ago' => '%d年前',
//
'Set to normal' => '设为正常',
'Set to hidden' => '设为隐藏',
'Invalid parameters' => '未知参数',
'No results were found' => '记录未找到',
'Parameter %s can not be empty' => '参数%s不能为空',
... ...
<?php
namespace app\admin\model;
use think\Model;
class Page extends Model
{
// 自动写入时间戳字段
protected $autoWriteTimestamp = false;
// 定义时间戳字段名
protected $createTime = false;
protected $updateTime = false;
}
<form id="add-form" role="form" data-toggle="validator" method="POST" action="">
<div class="row">
<div class="col-xs-12 col-sm-6">
<div class="form-group">
<label for="type" class="control-label">{:__('Type')}:</label>
{:build_select('row[type]', $typelist, [], ['id'=>'c-type','class'=>'form-control selectpicker','required'=>''])}
</div>
<div class="form-group">
<label for="title" class="control-label">{:__('Name')}:</label>
<input type="text" class="form-control" id="name" name="row[name]" value="" required="required" />
</div>
<div class="form-group">
<label for="nickname" class="control-label">{:__('Nickname')}:</label>
<input type="text" class="form-control" id="nickname" name="row[nickname]" value="" required="required" />
</div>
<div class="form-group">
<label for="diyname" class="control-label">{:__('Diyname')}:</label>
<input type="text" class="form-control" id="diyname" name="row[diyname]" value="" required="required" />
</div>
<div class="form-group">
<label for="keywords" class="control-label">{:__('Keywords')}:</label>
<input type="text" class="form-control" id="keywords" name="row[keywords]" value="" />
</div>
<div class="form-group">
<label for="description" class="control-label">{:__('Description')}:</label>
<textarea name="row[description]" id="description" class="form-control" cols="30" rows="3"></textarea>
</div>
<div class="row">
<div class="col-sm-4">
<div class="form-group form-inline">
<label for="weigh" class="control-label">{:__('Weigh')}:</label>
<input type="text" class="form-control" id="weigh" name="row[weigh]" value="0" required="required" size="3" />
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-sm-6">
<div class="form-group">
<label for="pid" class="control-label">{:__('Parent')}:</label>
{:build_select('row[pid]', $parentlist, null, ['id'=>'c-pid','class'=>'form-control selectpicker','required'=>''])}
</div>
<div class="form-group">
<label for="c-flag" class="control-label">{:__('Flag')}:</label>
{:build_select('row[flag]', 'h,i,s', null, ['id'=>'c-flag','class'=>'form-control selectpicker','required'=>''])}
</div>
<div class="form-group">
<label for="content" class="control-label">{:__('Status')}:</label>
<div>
{:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')])}
</div>
</div>
</div>
</div>
<div class="form-group hidden layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-success btn-embossed">{:__('OK')}</button>
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
</div>
</div>
</div>
</form>
... ...
<form id="add-form" role="form" data-toggle="validator" method="POST" action="">
<div class="row">
<div class="col-xs-12 col-sm-6">
<div class="form-group">
<label for="type" class="control-label">{:__('Type')}:</label>
{:build_select('row[type]', $typelist, $row['type'], ['id'=>'c-type','class'=>'form-control selectpicker','required'=>''])}
</div>
<div class="form-group">
<label for="title" class="control-label">{:__('Name')}:</label>
<input type="text" class="form-control" id="name" name="row[name]" value="{$row.name}" required="required" />
</div>
<div class="form-group">
<label for="nickname" class="control-label">{:__('Nickname')}:</label>
<input type="text" class="form-control" id="nickname" name="row[nickname]" value="{$row.nickname}" required="required" />
</div>
<div class="form-group">
<label for="diyname" class="control-label">{:__('Diyname')}:</label>
<input type="text" class="form-control" id="diyname" name="row[diyname]" value="{$row.diyname}" required="required" />
</div>
<div class="form-group">
<label for="keywords" class="control-label">{:__('Keywords')}:</label>
<input type="text" class="form-control" id="keywords" name="row[keywords]" value="{$row.keywords}" />
</div>
<div class="form-group">
<label for="description" class="control-label">{:__('Description')}:</label>
<textarea name="row[description]" id="description" class="form-control" cols="30" rows="3">{$row.description}</textarea>
</div>
<div class="row">
<div class="col-sm-4">
<div class="form-group form-inline">
<label for="weigh" class="control-label">{:__('Weigh')}:</label>
<input type="text" class="form-control" id="weigh" name="row[weigh]" value="{$row.weigh}" required="required" size="3" />
</div>
</div>
</div>
</div>
<div class="col-xs-12 col-sm-6">
<div class="form-group">
<label for="pid" class="control-label">{:__('Parent')}:</label>
{:build_select('row[pid]', $parentlist, $row['pid'], ['id'=>'c-pid','class'=>'form-control selectpicker','required'=>''])}
</div>
<div class="form-group">
<label for="c-flag" class="control-label">{:__('Flag')}:</label>
{:build_select('row[flag]', 'h,i,s', $row['flag'], ['id'=>'c-flag','class'=>'form-control selectpicker','required'=>''])}
</div>
<div class="form-group">
<label for="content" class="control-label">{:__('Status')}:</label>
<div>
{:build_radios('row[status]', ['normal'=>__('Normal'), 'hidden'=>__('Hidden')], $row['status'])}
</div>
</div>
</div>
</div>
<div class="form-group hidden layer-footer">
<label class="control-label col-xs-12 col-sm-2"></label>
<div class="col-xs-12 col-sm-8">
<button type="submit" class="btn btn-success btn-embossed">{:__('OK')}</button>
<button type="reset" class="btn btn-default btn-embossed">{:__('Reset')}</button>
</div>
</div>
</div>
</form>
... ...
<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()}
<div class="dropdown btn-group">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
</ul>
</div>
</div>
<table id="table" class="table table-striped table-bordered table-hover" width="100%">
</table>
</div>
</div>
</div>
</div>
</div>
... ...
... ... @@ -25,31 +25,32 @@
<a href="{:url('index/index/index')}" target="_blank"><i class="fa fa-home" style="font-size:14px;"></i></a>
</li>
<!-- 通栏下拉框样式 -->
<li class="dropdown notifications-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">
<i class="fa fa-bell-o"></i>
<span class="label label-warning">2</span>
<span class="label label-warning"></span>
</a>
<ul class="dropdown-menu">
<li class="header">You have 10 notifications</li>
<li class="header">{:__('Latest news')}</li>
<li>
<!-- 下拉条目样式 -->
<!-- FastAdmin最新更新信息,你可以替换成你自己站点的信息,请注意修改public/assets/js/backend/index.js文件 -->
<ul class="menu">
<li>
<a href="#">
<i class="fa fa-users text-aqua"></i> 5 new members joined today
</a>
</li>
<li>
<a href="#">
<i class="fa fa-warning text-yellow"></i> Very long description here that may not fit into the
page and may cause design problems
</a>
</li>
</ul>
</li>
<li class="footer"><a href="#">View all</a></li>
<li class="footer"><a href="#" target="_blank">{:__('View all')}</a></li>
</ul>
</li>
<li>
<a href="javascript:;" class="dropdown-toggle" data-toggle="dropdown"><i class="fa fa-language"></i></a>
<ul class="dropdown-menu">
<li class="{$config['language']=='zh-cn'?'active':''}">
<a href="?lang=zh-cn">简体中文</a>
</li>
<li class="{$config['language']=='en'?'active':''}">
<a href="?lang=en">English</a>
</li>
</ul>
</li>
... ...
... ... @@ -10,8 +10,8 @@
<div class="dropdown btn-group">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> 设为正常</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> 设为隐藏</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
</ul>
</div>
</div>
... ...
... ... @@ -10,8 +10,8 @@
<div class="dropdown btn-group">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> 设为正常</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> 设为隐藏</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
</ul>
</div>
</div>
... ...
... ... @@ -10,8 +10,8 @@
<div class="dropdown btn-group">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> 设为正常</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> 设为隐藏</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
</ul>
</div>
</div>
... ...
... ... @@ -10,8 +10,8 @@
<div class="dropdown btn-group">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> 设为正常</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> 设为隐藏</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
</ul>
</div>
</div>
... ...
... ... @@ -10,8 +10,8 @@
<div class="dropdown btn-group">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> 设为正常</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> 设为隐藏</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
</ul>
</div>
</div>
... ...
... ... @@ -10,8 +10,8 @@
<div class="dropdown btn-group">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> {:__('More')}</a>
<ul class="dropdown-menu text-left" role="menu">
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> 设为正常</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> 设为隐藏</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
</ul>
</div>
</div>
... ...
... ... @@ -10,8 +10,8 @@
<div class="dropdown btn-group">
<a class="btn btn-primary btn-more dropdown-toggle btn-disabled disabled" data-toggle="dropdown"><i class="fa fa-cog"></i> <?= __('More') ?></a>
<ul class="dropdown-menu text-left" role="menu">
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> 设为正常</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> 设为隐藏</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=normal"><i class="fa fa-eye"></i> {:__('Set to normal')}</a></li>
<li><a class="btn btn-link btn-multi btn-disabled disabled" href="javascript:;" data-params="status=hidden"><i class="fa fa-eye-slash"></i> {:__('Set to hidden')}</a></li>
</ul>
</div>
</div>
... ...
... ... @@ -84,7 +84,7 @@ class Backend extends Controller
// 非选项卡时重定向
if (!IS_AJAX && !IS_ADDTABS && $controllername != 'index' && $actionname == 'index')
{
header("location:" . url('index/index#!' . urlencode($this->request->url()), '', false));
header("location:" . url('index/index#!' . urlencode($this->request->baseUrl()), '', false));
exit;
}
... ...
... ... @@ -34,4 +34,26 @@ class Category Extends Model
return $typelist;
}
/**
* 读取分类列表
* @param string $type 指定类型
* @param string $status 指定状态
* @return array
*/
public static function getCategoryArray($type = NULL, $status = NULL)
{
$list = collection(self::where(function($query) use($type, $status)
{
if (!is_null($type))
{
$query->where('type', '=', $type);
}
if (!is_null($status))
{
$query->where('status', '=', $status);
}
})->order('weigh', 'desc')->select())->toArray();
return $list;
}
}
... ...
... ... @@ -8,9 +8,9 @@ class Page extends Model
{
// 自动写入时间戳字段
protected $autoWriteTimestamp = false;
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = false;
protected $updateTime = false;
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
}
... ...
... ... @@ -41,7 +41,7 @@ return [
// 默认时区
'default_timezone' => 'PRC',
// 是否开启多语言
'lang_switch_on' => false,
'lang_switch_on' => true,
// 默认全局过滤方法 用逗号分隔多个
'default_filter' => '',
// 默认语言
... ...
... ... @@ -24,12 +24,12 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
[
{field: 'state', checkbox: true, },
{field: 'id', title: 'ID'},
{field: 'name', title: '名称', align: 'left'},
{field: 'nickname', title: '昵称'},
{field: 'flag', title: '标志', formatter: Table.api.formatter.flag},
{field: 'weigh', title: '权重'},
{field: 'status', title: '状态', formatter: Table.api.formatter.status},
{field: 'operate', title: '操作', events: Table.api.events.operate, formatter: Table.api.formatter.operate}
{field: 'name', title: __('Name'), align: 'left'},
{field: 'nickname', title: __('Nickname')},
{field: 'flag', title: __('Flag'), formatter: Table.api.formatter.flag},
{field: 'weigh', title: __('Weigh')},
{field: 'status', title: __('Status'), formatter: Table.api.formatter.status},
{field: 'operate', title: __('Operate'), events: Table.api.events.operate, formatter: Table.api.formatter.operate}
]
]
});
... ... @@ -39,10 +39,15 @@ define(['jquery', 'bootstrap', 'backend', 'form', 'table'], function ($, undefin
},
add: function () {
Form.api.bindevent($("form[role=form]"));
Controller.api.bindevent();
},
edit: function () {
Form.api.bindevent($("form[role=form]"));
Controller.api.bindevent();
},
api: {
bindevent: function () {
Form.api.bindevent($("form[role=form]"));
}
}
};
... ...
... ... @@ -15,6 +15,20 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'validator'], f
e.stopPropagation();
});
//读取FastAdmin的更新信息
$.ajax({
url: 'http://www.fa.com/index/index/news',
type: 'post',
dataType: 'jsonp',
success: function (ret) {
$(".notifications-menu > a span").text(ret.new > 0 ? ret.new : '');
$(".notifications-menu .footer a").attr("href", ret.url);
$.each(ret.newslist, function (i, j) {
var item = '<li><a href="' + j.url + '" target="_blank"><i class="' + j.icon + '"></i> ' + j.title + '</a></li>';
$(item).appendTo($(".notifications-menu ul.menu"));
});
}
});
//切换左侧sidebar显示隐藏
$(document).on("click", ".sidebar-menu li > a", function (e) {
... ...
... ... @@ -41,7 +41,7 @@ define(['jquery', 'bootstrap', 'backend', 'config', 'toastr', 'moment', 'bootstr
valign: 'middle',
},
config: {
firsttd: 'tbody tr td:first-child',
firsttd: 'tbody tr td:first-child:not(:has(div.card-views))',
toolbar: '.toolbar',
refreshbtn: '.btn-refresh',
addbtn: '.btn-add',
... ...