前言
项目需求:后台管理系统根据用户所拥有的页面权限展示对应的页面
一、数据库设计
1:用户账号表中添加了 page_power 字段用以存储用户所拥有的页面权限数据
数据形式是加密的json数组
2: 新增power_tree:权限表(用以存储页面侧边栏一级目录数据,以及栏目下对应的页面权限id ,以及用作分配权限时的权限树状表查询)
示例:
power_page:页面表(用以存储页面路径各项信息)
示例:
注意:
两张表中的字段数据必须对应前端路由格式(包括权限查询时返回的所有数据字段等都必须和页面路由格式一致)
二、使用步骤
1.获取树状权限
提供树状列表返回前端渲染用于权限分配时展示进行复选操作:
1):取出所有父级数据 (最终查询结果返回前端渲染)
2):循环数组分割 power 字段,带着分割后的power到 power_page 查询子页面数据
/**获取所欲的父级页面数据(tree表中的数据)*/
$fPower = $treeModel->fPage();
/**分割权限tree表中power字符 */
foreach ($fPower as $val) {
$arr = explode(',', $val['power']);
/**清空循环防止叠加 */
$power = null;
/**循环分割后的数组获取所有子级页面数据 */
foreach ($arr as $item) {
$power[] = $powerModel->cPage($item);
}
/**将子页面数据融合到父级数据中 */
$val['children'] = $power;
$array[] = $val;
}
/**返回给前端*/
return json(['code' => 0, 'data' => $array]);
2.分配权限
思路:前端提交数据需要数组格式(账号id,权限数组【父编号,子页面id】),后端加密存储到账户表中的 page_power 字段
public function allocation_power()
{
/**接收数据 */
$data = $this->request->param();
/**实例模型 */
$adminModel = new admin();
foreach ($data as $value) {
/**加密json数组 */
$arrData = json_encode($value['child']);
/**分配权限 update更改账户id相同数据的page_power => $arrData(自行编写)*/
$allocationPower = $adminModel->allocationPower($value['id'], $arrData);
return json(['code'=>1,'msg'=>'分配成功']);
}
}
3.实现动态页面权限
思路:用户登陆成功之后,通过账号id获取page_power字段,循环查询父级和子级(将数据返回给前端)
/**通过uid获取父级页面权限id */
$fPage = $adminModel->fPowerArr($this->uid);
/**解密json数组 */
$fPage = json_decode($fPage, true);
foreach ($fPage as $val) {
/**获取父级数据 */
$arrData = $powerModel->fData($val['id']);
/**获取子级数据 */
$arrData['child'] = $pageModel->cAllData($val['child']);
unset($val['id']);
unset($val['child']);
$dataArr[] = $arrData;
}
(最终查询结果:只会返回用户名下有的页面权限)
4.其他操作
分配权限时获取用户原有的默认权限数据(只需要查询该用户的page_power字段 json_decode 解密 返回前端)
总结
开发过程有实际变动需要自行调整哦