社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
项目需要进行改造的需求:
不同角色登录后显示的控制面板不一样
不同角色登录后显示的统计数据不一样
重构:
1. 不同角色登录后显示的控制面板不一样
为了不影响已有代码,新增控制面板Controller:DashboardController;
在控制面板Controller中添加角色对应Layout的数组;
根据当前登录用户的角色,加载不同的layout和content,比如项目经理是layout_pm和content_pm,默认则是layout_default何content_default;
Controller中核心代码:
//=>确定加载的角色模板
$redirectUrl = '';
$layoutRoleNames = [//优先级越大越优先,对应角色名称,模板编号
['order' => 1, 'role' => '项目经理', 'layoutCode' => 'pm'],
['order' => 2, 'role' => '资料组长', 'layoutCode' => 'zl_leader'],
['order' => 100, 'role' => '施工队长', 'layoutCode' => '',
'redirectUrl' => [//不设置单独模板,而是进入指定页面
'controller' => 'ProjectEngineeringNodes', 'action' => 'myPreNodeIndex'
]
],
];//角色特定模板名称,排列顺序是优先级,越往后越优先
$nowOrder = 0;//当前角色模板优先级
$layoutCode = 'default';//当前角色模板编号
$nowLayout = 'sanse' . '_' . $layoutCode;
$roles = $this->Auth->user('roles');
foreach ($roles as $role) {
foreach ($layoutRoleNames as $layoutRoleName) {
if ($role['name'] === $layoutRoleName['role']) {//拥有该角色特定模板
$newOrder = $layoutRoleName['order'];//key 标识优先级
if ($newOrder > $nowOrder) {//高优先级则更新模板顺序
$nowOrder = $newOrder;
if ($layoutRoleName['layoutCode']) {
$layoutCode = $layoutRoleName['layoutCode'];
$nowLayout = 'sanse' . '_' . $layoutCode;
}
if (array_key_exists('redirectUrl', $layoutRoleName)) $redirectUrl = $layoutRoleName['redirectUrl'];
}
$nowOrder = ($newOrder > $nowOrder) ? $newOrder : $nowOrder;
}
}
}
//<=确定加载的角色模板
layout中新增,根据自己需要可以增加其他角色的layout:
layout中加载对应Element:
<!-- Content Wrapper -->
<div class="content-wrapper">
<?= $this->Flash->render() ?>
<?= $this->element('Dashboard/content_'.$layoutCode);?>
</div>
<!-- /Content Wrapper -->
Element中添加相应文件:
2. 不同角色登录后显示的统计数据不一样
为了区分不同用户的项目数据,使用bake,在项目统计表project_overviews中新增user_id字段,更新project_overviews的Model:
添加项目时记录项目所属用户:
修改content_pm和content_default中调用的数据统计接口,根据角色不同加载数据不同:
判断用户角色,是老总和超级管理员则统计所有项目数据;否则统计用户项目数据;统计数据的API核心代码:
Acl中isRoles方法来判断是否是某些角色:
最终效果:
项目经理pm1登录后的控制面板:
超级管理员admin登录后的控制面板:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!