新增数据限制功能,支持限制当前管理员数据

优化全站多语言的文字标识
优化后台控制台首页显示
优化后台管理员编辑自动填充
修复多语言函数__返回全部语言包的BUG
pull/18/head
Karson 2017-09-15 17:55:11 +08:00
parent a12ec606db
commit 75c28dc48a
27 changed files with 553 additions and 217 deletions

File diff suppressed because one or more lines are too long

View File

@ -225,7 +225,7 @@ class Menu extends Command
$title = (!isset($controllerArr[$key]) ? $controllerTitle : '');
$icon = (!isset($controllerArr[$key]) ? $controllerIcon : 'fa fa-list');
$remark = (!isset($controllerArr[$key]) ? $controllerRemark : '');
$title = $title ? $title : __(ucfirst($v) . ' manager');
$title = $title ? $title : ucfirst($v);
$rulemodel = $this->model->get(['name' => $name]);
if (!$rulemodel)
{
@ -262,8 +262,10 @@ class Menu extends Command
}
//过滤掉其它字符
$comment = preg_replace(array('/^\/\*\*(.*)[\n\r\t]/u', '/[\s]+\*\//u', '/\*\s@(.*)/u', '/[\s|\*]+/u'), '', $comment);
$ruleArr[] = array('pid' => $pid, 'name' => $name . "/" . strtolower($n->name), 'icon' => 'fa fa-circle-o', 'title' => $comment ? $comment : $n->name, 'ismenu' => 0, 'status' => 'normal');
$title = $comment ? $comment : $n->name;
$ruleArr[] = array('pid' => $pid, 'name' => $name . "/" . strtolower($n->name), 'icon' => 'fa fa-circle-o', 'title' => ucfirst($name), 'ismenu' => 0, 'status' => 'normal');
}
$this->model->saveAll($ruleArr);
}

View File

@ -121,29 +121,31 @@ function build_toolbar($btns = NULL, $attr = [])
/**
* 生成页面Heading
*
* @param string $title
* @param string $content
* @param string $path 指定的path
* @return string
*/
function build_heading($title = NULL, $content = NULL, $path = NULL)
function build_heading($path = NULL, $container = TRUE)
{
if (is_null($title) && is_null($content))
$title = $content = '';
if (is_null($path))
{
if (is_null($path))
{
$action = request()->action();
$controller = str_replace('.', '/', request()->controller());
$path = strtolower($controller . ($action && $action != 'index' ? '/' . $action : ''));
}
// 根据当前的URI自动匹配父节点的标题和备注
$data = Db::name('auth_rule')->where('name', $path)->field('title,remark')->find();
if ($data)
{
$title = $data['title'];
$content = $data['remark'];
}
$action = request()->action();
$controller = str_replace('.', '/', request()->controller());
$path = strtolower($controller . ($action && $action != 'index' ? '/' . $action : ''));
}
// 根据当前的URI自动匹配父节点的标题和备注
$data = Db::name('auth_rule')->where('name', $path)->field('title,remark')->find();
if ($data)
{
$title = __($data['title']);
$content = __($data['remark']);
}
if (!$content)
return '';
return '<div class="panel-heading"><div class="panel-lead"><em>' . $title . '</em>' . $content . '</div></div>';
$result = '<div class="panel-lead"><em>' . $title . '</em>' . $content . '</div>';
if ($container)
{
$result = '<div class="panel-heading">' . $result . '</div>';
}
return $result;
}

View File

@ -26,22 +26,24 @@ class Dashboard extends Backend
$createlist[$day] = mt_rand(20, 200);
$paylist[$day] = mt_rand(1, mt_rand(1, $createlist[$day]));
}
$hooks = config('addons.hooks');
$uploadmode = isset($hooks['upload_config_init']) && $hooks['upload_config_init'] ? implode(',', $hooks['upload_config_init']) : 'local';
$this->view->assign([
'totaluser' => 35200,
'totalviews' => 219390,
'totalorder' => 32143,
'totalorderamount' => 174800,
'todayuserlogin' => 321,
'todayusersignup' => 430,
'todayorder' => 2324,
'todayunsettleorder' => 132,
'sevendnu' => '80%',
'sevendau' => '32%',
'paylist' => $paylist,
'createlist' => $createlist,
'totaluser' => 35200,
'totalviews' => 219390,
'totalorder' => 32143,
'totalorderamount' => 174800,
'todayuserlogin' => 321,
'todayusersignup' => 430,
'todayorder' => 2324,
'unsettleorder' => 132,
'sevendnu' => '80%',
'sevendau' => '32%',
'paylist' => $paylist,
'createlist' => $createlist,
'uploadmode' => $uploadmode
]);
return $this->view->fetch();
}

View File

@ -32,6 +32,11 @@ class Group extends Backend
$groupName = AuthGroup::where('id', 'in', $this->childrenGroupIds)
->column('id,name');
foreach ($groupName as $k => &$v)
{
$v = __($v);
}
unset($v);
$this->groupdata = $groupName;
$this->assignconfig("admin", ['id' => $this->auth->id, 'group_ids' => $this->auth->getGroupIds()]);

View File

@ -24,10 +24,17 @@ class Rule extends Backend
parent::_initialize();
$this->model = model('AuthRule');
// 必须将结果集转换为数组
Tree::instance()->init(collection($this->model->order('weigh', 'desc')->select())->toArray());
$ruleList = collection($this->model->order('weigh', 'desc')->select())->toArray();
foreach ($ruleList as $k => &$v)
{
$v['title'] = __($v['title']);
$v['remark'] = __($v['remark']);
}
unset($v);
Tree::instance()->init($ruleList);
$this->rulelist = Tree::instance()->getTreeList(Tree::instance()->getTreeArray(0), 'title');
$ruledata = [0 => __('None')];
foreach ($this->rulelist as $k => $v)
foreach ($this->rulelist as $k => &$v)
{
if (!$v['ismenu'])
continue;

View File

@ -42,6 +42,7 @@ class Config extends Backend
continue;
}
$value = $v->toArray();
$value['title'] = __($value['title']);
if (in_array($value['type'], ['select', 'selects', 'checkbox', 'radio']))
{
$value['value'] = explode(',', $value['value']);

View File

@ -11,10 +11,14 @@ return [
'Keep login' => '保持会话',
'Guest' => '游客',
'Welcome' => '%s你好',
'View' => '查看',
'Add' => '添加',
'Edit' => '编辑',
'Del' => '删除',
'Delete' => '删除',
'Detail' => '详情',
'Multi' => '批量更新',
'Setting' => '配置',
'Move' => '移动',
'Name' => '名称',
'Status' => '状态',
@ -40,6 +44,8 @@ return [
'Choose' => '选择',
'Search' => '搜索',
'Refresh' => '刷新',
'Install' => '安装',
'Uninstall' => '卸载',
'First' => '首页',
'Previous' => '上一页',
'Next' => '下一页',
@ -81,14 +87,6 @@ return [
'Update time' => '更新时间',
'Flag' => '标志',
'Redirect now' => '立即跳转',
'Operation completed' => '操作成功!',
'Operation failed' => '操作失败!',
'Unknown data format' => '未知的数据格式!',
'Network error' => '网络错误!',
'Auth manager' => '权限管理',
'General manager' => '常规管理',
'Example manager' => '示例管理',
'Wechat manager' => '微信管理',
'Common search' => '普通搜索',
'Search %s' => '搜索 %s',
'View %s' => '查看 %s',
@ -99,9 +97,13 @@ return [
'%d week%s ago' => '%d周前',
'%d month%s ago' => '%d月前',
'%d year%s ago' => '%d年前',
//
'Set to normal' => '设为正常',
'Set to hidden' => '设为隐藏',
//提示
'Operation completed' => '操作成功!',
'Operation failed' => '操作失败!',
'Unknown data format' => '未知的数据格式!',
'Network error' => '网络错误!',
'Invalid parameters' => '未知参数',
'No results were found' => '记录未找到',
'Parameter %s can not be empty' => '参数%s不能为空',
@ -114,4 +116,35 @@ return [
'Please login first' => '请登录后操作',
'An unexpected error occurred' => '发生了一个意外错误,程序猿正在紧急处理中',
'This page will be re-directed in %s seconds' => '页面将在 %s 秒后自动跳转',
//菜单
'Dashboard' => '控制台',
'General' => '常规管理',
'Category' => '分类管理',
'Addon' => '插件管理',
'Auth' => '权限管理',
'Config' => '系统配置',
'Attachment' => '附件管理',
'Profile' => '个人配置',
'Admin' => '管理员管理',
'Admin log' => '管理员日志',
'Group' => '角色组',
'Rule' => '规则管理',
'Select attachment' => '选择附件',
'Update profile' => '更新个人信息',
'Local install' => '本地安装',
'Update state' => '禁用启用',
'Admin group' => '超级管理组',
'Second group' => '二级管理组',
'Third group' => '三级管理组',
'Second group 2' => '二级管理组2',
'Third group 2' => '三级管理组2',
'Dashboard tips' => '用于展示当前系统中的统计数据、统计报表及重要实时数据',
'Config tips' => '可以在此增改系统的变量和分组,也可以自定义分组和变量,如果需要删除请从数据库中删除',
'Category tips' => '用于统一管理网站的所有分类,分类可进行无限级分类',
'Attachment tips' => '主要用于管理上传到服务器或第三方存储的数据',
'Addon tips' => '可在线安装、卸载、禁用、启用插件同时支持Add本地插件。FastAdmin已上线插件商店 ,你可以发布你的免费或付费插件:<a href="http://www.fastadmin.net/store.html" target="_blank">http://www.fastadmin.net/store.html</a>',
'Admin tips' => '一个管理员可以有多个角色组,左侧的菜单根据管理员所拥有的权限进行生成',
'Admin log tips' => '管理员可以View自己所拥有的权限的管理员日志',
'Group tips' => '角色组可以有多个,角色有上下级层级关系,如果子角色有角色组和管理员的权限则可以派生属于自己组别下级的角色组或管理员',
'Rule tips' => '规则通常对应一个控制器的方法,同时左侧的菜单栏数据也从规则中体现,通常建议通过控制台进行生成规则节点',
];

View File

@ -9,6 +9,7 @@ return [
'Name' => '规则URL',
'Controller/Action' => '控制器名/方法名',
'Ismenu' => '菜单',
'Search icon' => '搜索图标',
'The non-menu rule must have parent' => '非菜单规则节点必须有父级',
'If not necessary, use the command line to build rule' => '非必要情况下请直接使用命令行php think menu来生成',
];

View File

@ -0,0 +1,43 @@
<?php
return [
'Custom' => '自定义',
'Pid' => '父ID',
'Type' => '栏目类型',
'Image' => '图片',
'Total user' => '总会员数',
'Total view' => '总访问数',
'Total order' => '总订单数',
'Total order amount' => '总金额',
'Today user signup' => '今日注册',
'Today user login' => '今日登录',
'Today order' => '今日订单',
'Unsettle order' => '未处理订单',
'Seven dnu' => '七日新增',
'Seven dau' => '七日活跃',
'Custom zone' => '这里是你的自定义数据',
'Custom zone' => '这里是你的自定义数据',
'Sales' => '成交数',
'Orders' => '订单数',
'Real time' => '实时',
'Category count' => '分类统计',
'Category count tips' => '当前分类总记录数',
'Attachment count' => '附件统计',
'Attachment count tips' => '当前上传的附件数量',
'Article count' => '文章统计',
'News count' => '新闻统计',
'Comment count' => '评论次数',
'Like count' => '点赞次数',
'Recent news' => '最新新闻',
'Recent discussion' => '最新发贴',
'Server info' => '服务器信息',
'PHP version' => 'PHP版本',
'Fastadmin version' => 'FastAdmin版本',
'Sapi name' => '运行方式',
'Debug mode' => '调试模式',
'Software' => '环境信息',
'Upload mode' => '上传模式',
'Upload url' => '上传URL',
'Timezone' => '时区',
'Language' => '语言',
];

View File

@ -10,6 +10,7 @@ return [
'Basic' => '基础配置',
'Email' => '邮件配置',
'Attachment' => '附件配置',
'Dictionary' => '字典配置',
'User' => '会员配置',
'Example' => '示例分组',
'Extend' => '扩展属性',
@ -32,6 +33,23 @@ return [
'Array value' => '键值',
'Content' => '数据列表',
'Rule' => '校验规则',
'Site name' => '站点名称',
'Beian' => '备案号',
'Cdn url' => 'CDN地址',
'Version' => '版本号',
'Timezone' => '时区',
'Forbidden ip' => '禁止IP',
'Languages' => '语言',
'Fixed page' => '后台固定页',
'Category type' => '分类类型',
'Config group' => '配置分组',
'Mail type' => '邮件发送方式',
'Mail smtp host' => 'SMTP服务器',
'Mail smtp port' => 'SMTP端口',
'Mail smtp user' => 'SMTP用户名',
'Mail smtp password' => 'SMTP密码',
'Mail vertify type' => 'SMTP验证方式',
'Mail from' => '发件人邮箱',
'Name already exist' => '变量名称已经存在',
'Send a test message' => '发送测试邮件',
'This is a test mail content' => '这是一封测试邮件,用于测试邮件配置是否正常!',

View File

@ -35,4 +35,8 @@ return [
'Check for updates' => '检测更新',
'Latest news' => '最新消息',
'View more' => '查看更多',
'Links' => '相关链接',
'Docs' => '官方文档',
'Forum' => '交流社区',
'QQ qun' => 'QQ交流群',
];

View File

@ -313,6 +313,7 @@ class Auth extends \fast\Auth
foreach ($this->breadcrumb as $k => &$v)
{
$v['url'] = url($v['name']);
$v['title'] = __($v['title']);
}
}
return $this->breadcrumb;
@ -373,6 +374,7 @@ class Auth extends \fast\Auth
$v['badge'] = isset($badgeList[$v['name']]) ? $badgeList[$v['name']] : '';
$v['py'] = $pinyin->abbr($v['title'], '');
$v['pinyin'] = $pinyin->permalink($v['title'], '');
$v['title'] = __($v['title']);
}
// 构造菜单数据
Tree::instance()->init($ruleList);

View File

@ -52,6 +52,10 @@ trait Backend
{
$v = is_array($v) ? implode(',', $v) : $v;
}
if ($this->dataLimitType)
{
$params[$this->dataLimitField] = $this->auth->id;
}
try
{
//是否采用模型验证
@ -89,6 +93,14 @@ trait Backend
$row = $this->model->get($ids);
if (!$row)
$this->error(__('No Results were found'));
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds))
{
if (!in_array($row[$this->dataLimitField], $adminIds))
{
$this->error(__('You have no permission'));
}
}
if ($this->request->isPost())
{
$params = $this->request->post("row/a");
@ -135,7 +147,15 @@ trait Backend
{
if ($ids)
{
$count = $this->model->destroy($ids);
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds))
{
$count = $this->model->where($this->dataLimitField, 'in', $adminIds)->delete($ids);
}
else
{
$count = $this->model->destory($ids);
}
if ($count)
{
$this->success();
@ -158,6 +178,11 @@ trait Backend
$values = array_intersect_key($values, array_flip(is_array($this->multiFields) ? $this->multiFields : explode(',', $this->multiFields)));
if ($values)
{
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds))
{
$this->model->where($this->dataLimitField, 'in', $adminIds);
}
$count = $this->model->where($this->model->getPk(), 'in', $ids)->update($values);
if ($count)
{

View File

@ -2,7 +2,7 @@
<div class="form-group">
<label for="role_id" class="control-label col-xs-12 col-sm-2">{:__('Group')}:</label>
<div class="col-xs-12 col-sm-8">
{:build_select('group[]', $groupdata, null, ['class'=>'form-control selectpicker', 'multiple'=>'', 'required'=>''])}
{:build_select('group[]', $groupdata, null, ['class'=>'form-control selectpicker', 'multiple'=>'', 'data-rule'=>'required'])}
</div>
</div>
<div class="form-group">

View File

@ -2,7 +2,7 @@
<div class="form-group">
<label for="role_id" class="control-label col-xs-12 col-sm-2">{:__('Group')}:</label>
<div class="col-xs-12 col-sm-8">
{:build_select('group[]', $groupdata, $groupids, ['class'=>'form-control selectpicker', 'multiple'=>''])}
{:build_select('group[]', $groupdata, $groupids, ['class'=>'form-control selectpicker', 'multiple'=>'', 'data-rule'=>'required'])}
</div>
</div>
<div class="form-group">

View File

@ -3,7 +3,7 @@
<div class="form-group">
<label for="pid" class="control-label col-xs-12 col-sm-2">{:__('Parent')}:</label>
<div class="col-xs-12 col-sm-8">
{:build_select('row[pid]', $groupdata, null, ['class'=>'form-control selectpicker', 'required'=>''])}
{:build_select('row[pid]', $groupdata, null, ['class'=>'form-control selectpicker', 'data-rule'=>'required'])}
</div>
</div>
<div class="form-group">

View File

@ -3,7 +3,7 @@
<div class="form-group">
<label for="pid" class="control-label col-xs-12 col-sm-2">{:__('Parent')}:</label>
<div class="col-xs-12 col-sm-8">
{:build_select('row[pid]', $groupdata, $row['pid'], ['class'=>'form-control selectpicker', 'required'=>'', 'data-id'=>$row['id'], 'data-pid'=>$row['pid']])}
{:build_select('row[pid]', $groupdata, $row['pid'], ['class'=>'form-control selectpicker', 'data-rule'=>'required', 'data-id'=>$row['id'], 'data-pid'=>$row['pid']])}
</div>
</div>
<div class="form-group">

View File

@ -32,7 +32,7 @@
<div class="col-xs-12 col-sm-8">
<div class="input-group input-groupp-md">
<input type="text" class="form-control" id="icon" name="row[icon]" value="fa fa-dot" />
<a href="javascript:;" class="btn-search-icon input-group-addon">搜索图标</a>
<a href="javascript:;" class="btn-search-icon input-group-addon">{:__('Search icon')}</a>
</div>
</div>
</div>

View File

@ -28,7 +28,7 @@
<div class="col-xs-12 col-sm-8">
<div class="input-group input-groupp-md">
<input type="text" class="form-control" id="icon" name="row[icon]" value="{$row.icon}" />
<a href="javascript:;" class="btn-search-icon input-group-addon">搜索图标</a>
<a href="javascript:;" class="btn-search-icon input-group-addon">{:__('Search icon')}</a>
</div>
</div>
</div>

View File

@ -29,10 +29,10 @@
<!--如果想始终显示子菜单,则给ul加上show-submenu类即可-->
<ul class="sidebar-menu">
{$menulist}
<li class="header">相关链接</li>
<li><a href="http://doc.fastadmin.net" target="_blank"><i class="fa fa-list text-red"></i> <span>官方文档</span></a></li>
<li><a href="http://forum.fastadmin.net" target="_blank"><i class="fa fa-comment text-yellow"></i> <span>社区交流</span></a></li>
<li><a href="https://jq.qq.com/?_wv=1027&k=487PNBb" target="_blank"><i class="fa fa-qq text-aqua"></i> <span>QQ交流群</span></a></li>
<li class="header">{:__('Links')}</li>
<li><a href="http://doc.fastadmin.net" target="_blank"><i class="fa fa-list text-red"></i> <span>{:__('Docs')}</span></a></li>
<li><a href="http://forum.fastadmin.net" target="_blank"><i class="fa fa-comment text-yellow"></i> <span>{:__('Forum')}</span></a></li>
<li><a href="https://jq.qq.com/?_wv=1027&k=487PNBb" target="_blank"><i class="fa fa-qq text-aqua"></i> <span>{:__('QQ qun')}</span></a></li>
</ul>
</section>
<!-- /.sidebar -->

View File

@ -124,10 +124,10 @@
</style>
<div class="panel panel-default panel-intro">
<div class="panel-heading">
<div class="panel-lead"><em>控制台Dashboard</em>用于展示当前系统中的统计数据、统计报表及重要实时数据</div>
{:build_heading(null, false)}
<ul class="nav nav-tabs">
<li class="active"><a href="#one" data-toggle="tab">控制台</a></li>
<li><a href="#two" data-toggle="tab">微信统计</a></li>
<li class="active"><a href="#one" data-toggle="tab">{:__('Dashboard')}</a></li>
<li><a href="#two" data-toggle="tab">{:__('Custom')}</a></li>
</ul>
</div>
<div class="panel-body">
@ -140,7 +140,7 @@
<span class="sm-st-icon st-red"><i class="fa fa-users"></i></span>
<div class="sm-st-info">
<span>{$totaluser}</span>
总会员数
{:__('Total user')}
</div>
</div>
</div>
@ -149,7 +149,7 @@
<span class="sm-st-icon st-violet"><i class="fa fa-book"></i></span>
<div class="sm-st-info">
<span>{$totalviews}</span>
总访问数
{:__('Total view')}
</div>
</div>
</div>
@ -158,7 +158,7 @@
<span class="sm-st-icon st-blue"><i class="fa fa-shopping-bag"></i></span>
<div class="sm-st-info">
<span>{$totalorder}</span>
总订单数
{:__('Total order')}
</div>
</div>
</div>
@ -167,7 +167,7 @@
<span class="sm-st-icon st-green"><i class="fa fa-cny"></i></span>
<div class="sm-st-info">
<span>{$totalorderamount}</span>
总金额
{:__('Total order amount')}
</div>
</div>
</div>
@ -185,60 +185,60 @@
<div class="stat-icon"> <i class="fa fa-rocket"></i> </div>
<div class="stat">
<div class="value"> {$todayusersignup} </div>
<div class="name"> 今日注册 </div>
<div class="name"> {:__('Today user signup')} </div>
</div>
<div class="progress">
<div class="progress-bar progress-bar-success" style="width: 20%"></div>
<div class="progress-bar progress-bar-success" style="width: 30%"></div>
</div>
</div>
<div class="col-xs-6 stat-col">
<div class="stat-icon"> <i class="fa fa-shopping-cart"></i> </div>
<div class="stat">
<div class="value"> {$todayuserlogin} </div>
<div class="name"> 今日登录 </div>
<div class="name"> {:__('Today user login')} </div>
</div>
<div class="progress">
<div class="progress-bar progress-bar-success" style="width: 20%"></div>
<div class="progress-bar progress-bar-success" style="width: 25%"></div>
</div>
</div>
<div class="col-xs-6 stat-col">
<div class="stat-icon"> <i class="fa fa-line-chart"></i> </div>
<div class="stat">
<div class="value"> {$todayorder} </div>
<div class="name"> 今日订单 </div>
<div class="name"> {:__('Today order')} </div>
</div>
<div class="progress">
<div class="progress-bar progress-bar-success" style="width: 20%"></div>
<div class="progress-bar progress-bar-success" style="width: 25%"></div>
</div>
</div>
<div class="col-xs-6 stat-col">
<div class="stat-icon"> <i class="fa fa-users"></i> </div>
<div class="stat">
<div class="value"> {$todayunsettleorder} </div>
<div class="name"> 未处理订单 </div>
<div class="value"> {$unsettleorder} </div>
<div class="name"> {:__('Unsettle order')} </div>
</div>
<div class="progress">
<div class="progress-bar progress-bar-success" style="width: 20%"></div>
<div class="progress-bar progress-bar-success" style="width: 25%"></div>
</div>
</div>
<div class="col-xs-6 stat-col">
<div class="stat-icon"> <i class="fa fa-list-alt"></i> </div>
<div class="stat">
<div class="value"> {$sevendnu} </div>
<div class="name"> 七日新增 </div>
<div class="name"> {:__('Seven dnu')} </div>
</div>
<div class="progress">
<div class="progress-bar progress-bar-success" style="width: 20%"></div>
<div class="progress-bar progress-bar-success" style="width: 25%"></div>
</div>
</div>
<div class="col-xs-6 stat-col">
<div class="stat-icon"> <i class="fa fa-dollar"></i> </div>
<div class="stat">
<div class="value"> {$sevendau} </div>
<div class="name"> 七日活跃 </div>
<div class="name"> {:__('Seven dau')} </div>
</div>
<div class="progress">
<div class="progress-bar progress-bar-success" style="width: 20%"></div>
<div class="progress-bar progress-bar-success" style="width: 25%"></div>
</div>
</div>
</div>
@ -246,43 +246,22 @@
</div>
</div>
</div>
<div class="row hidden">
<div class="col-lg-4">
<div class="box">
<div class="box-header"><h3 class="box-title">温馨设置</h3></div>
<div class="box-body">test test</div>
</div>
</div>
<div class="col-lg-4">
<div class="box">
<div class="box-header">cccc</div>
<div class="box-body">test test</div>
</div>
</div>
<div class="col-lg-4">
<div class="box">
<div class="box-header">cccc</div>
<div class="box-body">test test</div>
</div>
</div>
</div>
<div class="row" style="margin-top:15px;">
<div class="col-lg-12">
<h4>详细统计</h4>
</div>
<div class="col-xs-6 col-md-3">
<div class="panel bg-blue">
<div class="panel-body">
<div class="panel-title">
<span class="label label-success pull-right">管理</span>
<h5>教练统计</h5>
<span class="label label-success pull-right">{:__('Real time')}</span>
<h5>{:__('Category count')}</h5>
</div>
<div class="panel-content">
<h1 class="no-margins">1234</h1>
<div class="stat-percent font-bold text-gray"><i class="fa fa-commenting"></i> 1234</div>
<small>总评论数</small>
<small>{:__('Category count tips')}</small>
</div>
</div>
</div>
@ -291,13 +270,13 @@
<div class="panel bg-aqua-gradient">
<div class="panel-body">
<div class="ibox-title">
<span class="label label-info pull-right">管理</span>
<h5>文章统计</h5>
<span class="label label-info pull-right">{:__('Real time')}</span>
<h5>{:__('Attachment count')}</h5>
</div>
<div class="ibox-content">
<h1 class="no-margins">1043</h1>
<div class="stat-percent font-bold text-gray"><i class="fa fa-modx"></i> 2592</div>
<small>总文章数</small>
<small>{:__('Attachment count tips')}</small>
</div>
</div>
</div>
@ -307,19 +286,19 @@
<div class="panel bg-purple-gradient">
<div class="panel-body">
<div class="ibox-title">
<span class="label label-primary pull-right">管理</span>
<h5>动态统计</h5>
<span class="label label-primary pull-right">{:__('Real time')}</span>
<h5>{:__('Article count')}</h5>
</div>
<div class="ibox-content">
<div class="row">
<div class="col-md-6">
<h1 class="no-margins">1234</h1>
<div class="font-bold text-navy"><i class="fa fa-commenting"></i> <small>总评论数</small></div>
<div class="font-bold text-navy"><i class="fa fa-commenting"></i> <small>{:__('Comment count')}</small></div>
</div>
<div class="col-md-6">
<h1 class="no-margins">6754</h1>
<div class="font-bold text-navy"><i class="fa fa-heart"></i> <small>总评论点赞数</small></div>
<div class="font-bold text-navy"><i class="fa fa-heart"></i> <small>{:__('Like count')}</small></div>
</div>
</div>
</div>
@ -330,19 +309,19 @@
<div class="panel bg-green-gradient">
<div class="panel-body">
<div class="ibox-title">
<span class="label label-primary pull-right">管理</span>
<h5>活动统计</h5>
<span class="label label-primary pull-right">{:__('Real time')}</span>
<h5>{:__('News count')}</h5>
</div>
<div class="ibox-content">
<div class="row">
<div class="col-md-6">
<h1 class="no-margins">5302</h1>
<div class="font-bold text-navy"><i class="fa fa-commenting"></i> <small>总评论数</small></div>
<div class="font-bold text-navy"><i class="fa fa-commenting"></i> <small>{:__('Comment count')}</small></div>
</div>
<div class="col-md-6">
<h1 class="no-margins">8205</h1>
<div class="font-bold text-navy"><i class="fa fa-user"></i> <small>总参与人数</small></div>
<div class="font-bold text-navy"><i class="fa fa-user"></i> <small>{:__('Like count')}</small></div>
</div>
</div>
</div>
@ -351,78 +330,119 @@
</div>
</div>
<div class="row">
<div class="col-lg-4">
<div class="box box-danger">
<div class="box-header">
<h3 class="box-title">{:__('Recent news')}</h3>
<div class="box-tools pull-right">
<a href="http://www.fastadmin.net" target="_blank" class="btn btn-box-tool">{:__('More')}</a>
</div>
</div>
<div class="box-body" id="news-list">
</div>
</div>
</div>
<div class="col-lg-4">
<div class="box box-success">
<div class="box-header">
<h3 class="box-title">{:__('Recent discussion')}</h3>
<div class="box-tools pull-right">
<a href="http://forum.fastadmin.net" class="btn btn-box-tool">{:__('More')}</a>
</div>
</div>
<div class="box-body" id="discussion-list">
</div>
</div>
</div>
<div class="col-lg-4">
<div class="box box-info">
<div class="box-header"><h3 class="box-title">{:__('Server info')}</h3></div>
<div class="box-body">
<table class="table table-striped">
<tbody>
<tr>
<td width="120px">{:__('PHP version')}</td>
<td>{$Think.const.PHP_VERSION}</td>
</tr>
<tr>
<td width="120px">{:__('FastAdmin version')}</td>
<td>{$Think.config.fastadmin.version}</td>
</tr>
<tr>
<td width="120px">{:__('Sapi name')}</td>
<td>{:php_sapi_name()}</td>
</tr>
<tr>
<td width="120px">{:__('Debug mode')}</td>
<td>{$Think.config.app_debug?__('Yes'):__('No')}</td>
</tr>
<tr>
<td width="120px">{:__('Software')}</td>
<td>{$Think.server.SERVER_SOFTWARE}</td>
</tr>
<tr>
<td width="120px">{:__('Upload mode')}</td>
<td>{$uploadmode}</td>
</tr>
<tr>
<td width="120px">{:__('Upload url')}</td>
<td>{$config.upload.uploadurl}</td>
</tr>
<tr>
<td width="120px">{:__('Timezone')}</td>
<td>{:date_default_timezone_get()}</td>
</tr>
<tr>
<td width="120px">{:__('Language')}</td>
<td>{$config.language}</td>
</tr>
</tbody></table>
</div>
</div>
</div>
</div>
</div>
<div class="tab-pane fade" id="two">
<div class="row">
<div class="col-xs-3">
<div class="box box-danger">
<div class="box-header with-border"><span class="label label-success pull-right">Monthly</span>
<div class="box-title">
统计数据1
</div>
</div>
<div class="box-body">
<div class="ibox-content">
<h1 class="no-margin no-padding">40 886,200</h1>
<div class="stat-percent font-bold text-success">98% <i class="fa fa-bolt"></i></div>
<small>Total income</small>
</div>
</div>
</div>
</div>
<div class="col-xs-3">
<div class="box box-success bg-green-gradient">
<div class="box-header"><span class="label label-success pull-right">Monthly</span>
<div class="box-title">
统计数据2
</div>
</div>
<div class="box-body">
<div class="ibox-content">
<h1 class="no-margin no-padding">40 886,200</h1>
<div class="stat-percent font-bold text-success">98% <i class="fa fa-bolt"></i></div>
<small>Total income</small>
</div>
</div>
</div>
</div>
<div class="col-xs-3">
<div class="box box-warning">
<div class="box-header with-border"><span class="label label-success pull-right">Monthly</span>
<div class="box-title">
统计数据3
</div>
</div>
<div class="box-body">
<div class="ibox-content">
<h1 class="no-margin no-padding">40 886,200</h1>
<div class="stat-percent font-bold text-success">98% <i class="fa fa-bolt"></i></div>
<small>Total income</small>
</div>
</div>
</div>
</div>
<div class="col-xs-3">
<div class="box box-info bg-purple-gradient">
<div class="box-header"><span class="label label-success pull-right">Monthly</span>
<div class="box-title">
统计数据4
</div>
</div>
<div class="box-body">
<div class="ibox-content">
<h1 class="no-margin no-padding">40 886,200</h1>
<div class="stat-percent font-bold text-success">98% <i class="fa fa-bolt"></i></div>
<small>Total income</small>
</div>
</div>
</div>
<div class="col-xs-12">
{:__('Custom zone')}
</div>
</div>
</div>
</div>
</div>
</div>
<script id="newstpl" type="text/html">
<ul class="nav nav-stacked">
<%for(var i=0;i < news.length;i++){%>
<%var item=news[i];%>
<li>
<a href="<%=item.url%>" target="_blank">
<span class="text"><%=item.title%></span>
</a>
</li>
<%}%>
</ul>
</script>
<script id="discussiontpl" type="text/html">
<ul class="products-list product-list-in-box">
<%for(var i=0;i < news.length;i++){%>
<%var item=news[i];%>
<li class="item">
<div class="">
<a href="<%=item.url%>" target="_blank" class="product-title"><%=item.title%>
<span class="label label-warning pull-right"><%=item.comments_count%></span></a>
<span class="product-description">
<%=item.last_time%>
</span>
</div>
</li>
<%}%>
</ul>
</script>
<script>
var Orderdata = {
column: {:json_encode(array_keys($paylist))},

View File

@ -11,10 +11,10 @@
</style>
<div class="panel panel-default panel-intro">
<div class="panel-heading">
<div class="panel-lead"><em>系统配置</em>可以在此增改系统的变量和分组,也可以自定义分组和变量,如果需要删除请从数据库中删除</div>
{:build_heading(null, false)}
<ul class="nav nav-tabs">
{foreach $siteList as $index=>$vo}
<li class="{$vo.active?'active':''}"><a href="#{$vo.name}" data-toggle="tab">{$vo.title}</a></li>
<li class="{$vo.active?'active':''}"><a href="#{$vo.name}" data-toggle="tab">{:__($vo.title)}</a></li>
{/foreach}
<li>
<a href="#addcfg" data-toggle="tab"><i class="fa fa-plus"></i></a>

View File

@ -14,7 +14,7 @@ if (!function_exists('__'))
*/
function __($name, $vars = [], $lang = '')
{
if (is_numeric($name))
if (is_numeric($name) || !$name)
return $name;
if (!is_array($vars))
{

View File

@ -49,6 +49,19 @@ class Backend extends Controller
*/
protected $relationSearch = false;
/**
* 是否开启数据限制
* 支持auth/personal
* 表示按权限判断/仅限个人
* 默认为禁用,若启用请务必保证表中存在admin_id字段
*/
protected $dataLimit = false;
/**
* 数据限制字段
*/
protected $dataLimitField = 'admin_id';
/**
* 是否开启Validate验证
*/
@ -222,6 +235,11 @@ class Backend extends Controller
}
$sort = stripos($sort, ".") === false ? $tableName . $sort : $sort;
}
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds))
{
$where[] = [$this->dataLimitField, 'in', $adminIds];
}
if ($search)
{
$searcharr = is_array($searchfields) ? $searchfields : explode(',', $searchfields);
@ -312,6 +330,25 @@ class Backend extends Controller
return [$where, $sort, $order, $offset, $limit];
}
/**
* 获取数据限制的管理员ID
* 禁用数据限制时返回的是null
* @return mixed
*/
protected function getDataLimitAdminIds()
{
if (!$this->dataLimit)
{
return null;
}
$adminIds = [];
if (in_array($this->dataLimit, ['auth', 'personal']))
{
$adminIds = $this->dataLimit == 'auth' ? $this->auth->getChildrenAdminIds(true) : [$this->auth->id];
}
return $adminIds;
}
/**
* Selectpage的实现方法
*
@ -375,10 +412,19 @@ class Backend extends Controller
}
};
}
$adminIds = $this->getDataLimitAdminIds();
if (is_array($adminIds))
{
$this->model->where($this->dataLimitField, 'in', $adminIds);
}
$list = [];
$total = $this->model->where($where)->count();
if ($total > 0)
{
if (is_array($adminIds))
{
$this->model->where($this->dataLimitField, 'in', $adminIds);
}
$list = $this->model->where($where)
->order($order)
->page($page, $pagesize)
@ -386,7 +432,6 @@ class Backend extends Controller
->field("password,salt", true)
->select();
}
//这里一定要返回有list这个字段,total是可选的,如果total<=list的数量,则会隐藏分页按钮
return json(['list' => $list, 'total' => $total]);
}

View File

@ -15,7 +15,6 @@ class Category Extends Model
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
// 追加属性
protected $append = [
'type_text',
@ -28,8 +27,12 @@ class Category Extends Model
*/
public static function getTypeList()
{
$typelist = config('site.categorytype');
return $typelist;
$typeList = config('site.categorytype');
foreach ($typeList as $k => &$v)
{
$v = __($v);
}
return $typeList;
}
public function getTypeTextAttr($value, $data)

View File

@ -1,4 +1,4 @@
define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echarts-theme'], function ($, undefined, Backend, Datatable, Table, Echarts) {
define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echarts-theme', 'template'], function ($, undefined, Backend, Datatable, Table, Echarts, undefined, Template) {
var Controller = {
index: function () {
@ -15,7 +15,7 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echart
trigger: 'axis'
},
legend: {
data: ['下单', '成交']
data: [__('Sales'), __('Orders')]
},
toolbox: {
show: false,
@ -39,7 +39,7 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echart
bottom: 30
}],
series: [{
name: '成交',
name: __('Sales'),
type: 'line',
smooth: true,
areaStyle: {
@ -54,7 +54,7 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echart
data: Orderdata.paydata
},
{
name: '下单',
name: __('Orders'),
type: 'line',
smooth: true,
areaStyle: {
@ -92,11 +92,11 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echart
data: Orderdata.column
},
series: [{
name: '成交',
name: __('Sales'),
data: Orderdata.paydata
},
{
name: '下单',
name: __('Orders'),
data: Orderdata.createdata
}]
});
@ -104,6 +104,24 @@ define(['jquery', 'bootstrap', 'backend', 'addtabs', 'table', 'echarts', 'echart
$(window).resize(function () {
myChart.resize();
});
//读取FastAdmin的更新信息
$.ajax({
url: Config.fastadmin.api_url + '/news/index',
type: 'post',
dataType: 'jsonp',
success: function (ret) {
$("#news-list").html(Template("newstpl", {news: ret.newslist}));
}
});
$.ajax({
url: Config.fastadmin.api_url + '/forum/discussion',
type: 'post',
dataType: 'jsonp',
success: function (ret) {
$("#discussion-list").html(Template("discussiontpl", {news: ret.discussionlist.slice(0,6)}));
}
});
}
};