php composer.phar require mdmsoft/yii2-admin "~2.0" php composer.phar update
'aliases' => [ '@mdm/admin' => '@vendor/mdmsoft/yii2-admin', ],
'admin' => [ 'class' => 'mdm\admin\Module', 'layout' => '@app/views/layouts/main_nifty',//yii2-admin的导航菜单 ],
'authManager' => [ 'class' => 'yii\rbac\DbManager', // or use 'yii\rbac\DbManager' ],
'as access' => [ 'class' => 'mdm\admin\components\AccessControl', 'allowActions' => [ // add or remove allowed actions to this list // 'admin/*', //'*', 'site/*', 'api/*', ] ],
yii migrate --migrationPath=@yii/rbac/migrations yii migrate --migrationPath=@mdm/admin/migrations
'layout' => '@app/views/layouts/main_nifty',
echo Nav::widget( [ "encodeLabels" => false, "options" => ["class" => "sidebar-menu"], "items" => MenuHelper::getAssignedMenu(Yii::$app->user->id), ] );
<ul class="nav nav-list">
<?php
$idx = ;
$request_url = '/' . $mod_id . '/' . $con_id . '/' . $act_id . '/';
foreach ($menus_new['list'] as $label => $menu): ?>
<?php
if (empty($menu['label']) && empty($menu['url'][])) {
continue;
}
?>
<?php if(!isset($menu['items'])):?>
<li class="<?php
if (isset($menu['openurl']) && strstr($menu['openurl'], $request_url)) {
echo 'active';
$breadcrumb[] = $menu['label'];
}
?>">
<a href="<?php echo $menu['url'][] ?>">
<i class="menu-icon fa fa-<?php echo $menu['icon'] ?>"></i>
<span class="menu-text"> <?php echo $menu['label'] ?> </span>
</a>
<b class="arrow"></b>
</li>
<?php else:?>
<li class="<?php
if (isset($menu['openurl']) && strstr($menu['openurl'], $request_url)) {
echo 'open';
$breadcrumb[] = $menu['label'];
}
?>">
<a href="index.html"data-target="#multi-cols-<?php echo $idx ?>"class="dropdown-toggle">
<i class="menu-icon fa fa-<?php echo $menu['icon'] ?>"></i>
<span class="menu-text">
<?php echo $menu['label'] ?>
</span>
<b class="arrow fa fa-angle-down"></b>
</a>
<b class="arrow"></b>
<ul id="multi-cols-<?php echo $idx ?>" class="submenu">
<?php foreach ($menu['items'] as $label => $menu): ?>
<?php
if (empty($menu) || !is_array($menu)) { continue; }
if(!isset($menu['items'])):?>
<li class="<?php
if (isset($menu['openurl']) && strstr($menu['openurl'], $request_url)) {
echo 'active';
$breadcrumb[] = $menu['label'];
}
?>">
<a href="<?php echo $menu['url'][] ?>">
<i class="menu-icon fa fa-caret-right"></i>
<?php echo $menu['label'] ?>
</a>
<b class="arrow"></b>
</li>
<?php else:?>
<li class="<?php
if (isset($menu['openurl']) && strstr($menu['openurl'], $request_url)) {
echo 'open';
$breadcrumb[] = $menu['label'];
}
?>">
<a href="#" class="dropdown-toggle">
<i class="menu-icon fa fa-caret-right"></i>
<?php echo $menu['label'] ?>
<b class="arrow fa fa-angle-down"></b>
</a>
<b class="arrow"></b>
<ul class="submenu">
<?php foreach ($menu['items'] as $label => $url): ?>
<?php if (empty($url) || !is_array($url)) { continue; } ?>
<li class="<?php
if (isset($url['openurl']) && strstr($url['openurl'], $request_url)) {
echo 'active';
$breadcrumb[] = $url['label'];
}
?>">
<a href="<?php echo $url['url'][] ?>">
<i class="menu-icon fa fa-caret-right"></i>
<?php echo $url['label'] ?>
</a>
<b class="arrow"></b>
</li>
<?php endforeach ?>
</ul>
</li>
<?php endif?>
<?php endforeach ?>
</ul>
</li>
<?php endif?>
<?php $idx++; ?>
<?php endforeach ?>
</ul>
$user_id = Yii::$app->user->id;
$breadcrumb = [];
$menus_new['list'] = MenuHelper::getAssignedMenu($user_id);
$redis_key = MenuHelper::getMenuKeyByUserId($user_id);
$redis_menu = Yii::$app->redis->get($redis_key);
$redis_varsion = getVersion();
if (!empty($redis_menu)) {
$menus_new = json_decode($redis_menu, true);
$old_version = isset($menus_new['version']) ? $menus_new['version'] : '';
//判断菜单的版本号,便于及时更新缓存
if (!isset($menus_new['list']) || empty($old_version) || intval($old_version) != $redis_varsion) {
$menus_new = getMenu($user_id, $redis_varsion, $redis_key);
$log = json_encode([
'user_id' => $user_id,
'varsion' => $redis_varsion,
'redis_key' => $redis_key,
'value' => $menus_new
]);
writeLog($log, 'update_menu');
}
} else {
$menus_new = getMenu($user_id, $redis_varsion, $redis_key);
}
function getMenu($user_id, $varsion, $redis_key)
{
$menus_new['list'] = MenuHelper::getAssignedMenu($user_id);
$menus_new['version'] = $varsion;
Yii::$app->redis->set($redis_key, json_encode($menus_new));
Yii::$app->redis->expire($redis_key, 300);
return $menus_new;
}
//设置更新key便于时时更新redis
function getVersion()
{
$version_key = Yii::$app->params['redis_key']['menu_prefix'] . md5(Yii::$app->params['redis_key']['menu_version'] . Yii::$app->db->dsn);
$version_val = Yii::$app->redis->get($version_key);
return empty($version_val) ? 1 : $version_val;
}
生成key和更新key的逻辑如下:
/**
* get menu one user by the id
* @param $user_id
* @return key string
*/
public static function getMenuKeyByUserId($user_id)
{
if (empty($user_id)) {
return false;
}
$list = (new \yii\db\Query())->select('**')
->from('**')
->where(['user_id' => $user_id])
->all();
if (empty($list)) {
return false;
}
$role_str = '';
foreach ($list as $key => $value) {
$role_str .= $value['item_name'];
}
$redis_key = Yii::$app->params['key'] . md5($role_str . Yii::$app->db->dsn);
return $redis_key;
}
/**
* 修改菜单更新状态,更新redis
*/
public static function UpdateMenuVersion()
{
$version_key = Yii::$app->params['key'] . md5(Yii::$app->params['key'] . Yii::$app->db->dsn);
$version_val = Yii::$app->redis->get($version_key);
if (empty($version_val)) {
$version_val = '1';
} else {
$version_val++;
}
$log = json_encode([
'user_id' => Yii::$app->user->id,
'version_key' => $version_key,
'version_val' => $version_val
]);
writeLog($log, 'update_menu_version');
Yii::$app->redis->set($version_key, $version_val);
}
{"icon": "fa fa-home", "visible": true, "openurl":"/web/site/index/"}
$user_type = Yii::$app->user->identity->type;
$customer_id = Yii::$app->user->identity->customer_id;
$callback_func = function($menu) use ($user_type, $customer_id) {
$data = json_decode($menu['data'], true);
$items = $menu['children'];
$return = [
'label' => $menu['name'],
'url' => [$menu['route']],
];
$return['visible'] = isset($data['visible']) ? $data['visible'] : '';
//菜单隐藏的逻辑
if (empty($return['visible'])) {
return false;
}
$return['icon'] = isset($data['icon']) ? $data['icon'] : '';
//控制菜单打开的逻辑
$return['openurl'] = isset($data['openurl']) ? $data['openurl'] : '';
$items && $return['items'] = $items;
return $return;
};
/**
* @inheritdoc
*/
public function beforeAction($action)
{
$actionId = $action->getUniqueId();
$user = $this->getUser();
//预留系统检查权限的逻辑,一旦重写检查权限失败,调用系统检查权限的方法
if ($user->can('/' . $actionId)) {
return true;
}
$obj = $action->controller;
do {
if ($user->can('/' . ltrim($obj->getUniqueId() . '/*', '/'))) {
return true;
}
$obj = $obj->module;
} while ($obj !== null);
$this->denyAccess($user);
}
/**
* 权限判断方法 (先不要使用该方法,用的系统方法,效率极低,等有时间重写之后再用)
* @param string/array $permission_name 权限值(URL 或者 权限名)/批量检测可以传入数组
* @param int $user 用户id,不传值会取当前的登陆用户
* @return boolen
* @author zhaoyafei
*/
public static function permissionCheck($permission_name, $user = 0)
{
//检查是否登陆过
if (Yii::$app->user->isGuest) {
Yii::$app->response->redirect('/site/login');
}
if (empty($permission_name)) {
return false;
}
if (empty($user)) {
$user = Yii::$app->user->id;
}
//管理员权限不能直接返回true,会存在管理员type = 1分到非管理员权限的人员(有坑)
//匿名方法,处理管理员返回值的情况
/*$setAdminSet = function($param) use ($permission_name) {
$paramtmp = $permission_name;
if (is_array($paramtmp)) {
if (count($paramtmp) == 1) {
return true;
}
$paramtmp = array_flip($paramtmp);
foreach ($paramtmp as $key => &$value) {
$value = true;
}
} else {
$paramtmp = true;
}
return $paramtmp;
};*/
//检查是否是管理员, 管理员都有权限
/*if (empty($user)) {
$user = Yii::$app->user->id;
$user_type = Yii::$app->user->identity->type;
if ($user_type == TYPE_ADMIN) {
return $setAdminSet($permission_name);
}
} else {
$user_sql = "SELECT type FROM xm_user WHERE id = :id";
$user_info = Yii::$app->db->createCommand($user_sql)->bindValue(":id", $user)->queryOne();
if (empty($user_info)) {
return false;
}
if ($user_info['type'] == TYPE_ADMIN) {
return $setAdminSet($permission_name);
}
}*/
//根据用户去取权限
$permission_list = [];
$sql = "SELECT xc.child, xc1.child as role_name FROM xm_auth_assignment xa
INNER JOIN xm_auth_item_child xc ON xa.item_name = xc.parent
LEFT JOIN xm_auth_item_child xc1 ON xc.child = xc1.parent
WHERE xa.user_id = :user_id";
$permission = Yii::$app->db->createCommand($sql)
->bindValue(":user_id", $user)
->queryAll();
if (empty($permission)) {
return false;
}
//组合权限列表
foreach ($permission as $key => $value) {
if (!empty($value['child']) && !in_array($value['child'], $permission_list)) {
$permission_list[] = $value['child'];
}
if (!empty($value['role_name']) && !in_array($value['role_name'], $permission_list)) {
$permission_list[] = $value['role_name'];
}
}
//匿名方法,处理子url生成
$getUrlList = function($url) {
if (!strstr($url, '/')) {
return [$url];
}
$url = '/' . trim($url, '/');
$params = explode('/', $url);
$param_arr = [];
$param_str = [];
if (!empty($params) && is_array($params)) {
foreach ($params as $key => $value) {
if (!empty($value)) {
$param_arr[] = $value;
}
}
}
if (!empty($param_arr)) {
$tmp_str = '';
$param_str[] = $url;
$count = count($param_arr);
//生成子父级关系
for ($i = $count -1; $i >= 0; $i--) {
$tmp_str = '/' . $param_arr[$i] . $tmp_str;
$chold_url = str_replace($tmp_str, '/*', $url);
if (!in_array($chold_url, $param_str)) {
$param_str[] = $chold_url;
}
}
}
return $param_str;
};
//拼接检查数据,兼容单传和传输组的情况
$check_list = [];
if (is_array($permission_name)) {
foreach ($permission_name as $key => $value) {
$check_list[$value] = $getUrlList($value);
}
} else {
$check_list[$permission_name] = $getUrlList($permission_name);
}
if (empty($check_list)) {
return false;
}
//批量检查是否有权限
$ret = [];
foreach ($check_list as $key => $value) {
$ret[$key] = false;
foreach ($value as $k => $v) {
if (in_array($v, $permission_list)) {
$ret[$key] = true;
break;
}
}
}
//兼容一维数组
if (count($ret) == 1) {
$ret = array_values($ret);
return $ret[0];
}
return $ret;
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有