Files
amb_wechatapp/application/admin/model/auth/Group.php
T

187 lines
5.7 KiB
PHP

<?php
namespace app\admin\model\auth;
use think\Model;
class Group extends Model
{
public $menuAuthFile = '';
// 表名
protected $name = 'auth_group';
/**
* 讲师角色常量(写死在代码中,与超级管理员 id=0 同理)
*/
const LECTURER_GROUP_ID = 9;
const LECTURER_GROUP_NAME = '讲师';
const LECTURER_GROUP_REMARK = '直播讲师角色,权限不可编辑';
const LECTURER_GROUP_RULES = 'course_list_live,live_room';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'integer';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = false;
protected $deleteTime = false;
// 追加属性
protected $append = [
'status_text'
];
protected $menu = [
];
public function getStatusList()
{
return ['11' => __('Status 11')];
}
public function getStatusTextAttr($value, $data)
{
$value = $value ? $value : (isset($data['status']) ? $data['status'] : '');
$list = $this->getStatusList();
return isset($list[$value]) ? $list[$value] : '';
}
/**
* 获取角色组的权限
* @param $id 角色组ID
* @return array|false|string[]
*/
public function getGroupRole($id){
if(!$id){
return ['*'];
}
//讲师角色权限写死在代码中,不依赖数据库
if($id == self::LECTURER_GROUP_ID){
return explode(',', self::LECTURER_GROUP_RULES);
}
$group = self::where([
'id'=>$id
])->field('rules')->find();
if(!$group){
return [];
}
return explode(",",$group['rules']);
}
/**
* 遍历roles
* @param $menu
* @return array
*/
public function traversalRole($menu){
$roles = [];
foreach ($menu as $item) {
$roles[] = $item['roles']; // 获取当前项的角色
// 如果有子项,则递归处理
if (!empty($item['children'])) {
$roles = array_merge($roles, $this->traversalRole($item['children']));
}
}
return $roles;
}
/**
* 获取所有的权限
* @param $id 角色组ID
* @return array|false|string[]
*/
public function getAllRoles(){
$menu = config('menu');
return $this->traversalRole($menu);
}
/**
* 遍历菜单列表,判断 key 是否在分组权限中,并添加 selected 字段
* @param array $list 菜单列表
* @param array $groupRules 分组权限规则
* @return array 添加了 selected 字段后的菜单列表
*/
public function updateMenuSelected($list, $groupRules) {
foreach ($list as $key => &$item) {
// 判断当前菜单 key 是否在分组权限中
if(in_array("*",$groupRules)){
$item['selected'] = true;
}else{
$item['selected'] = in_array($item['roles'], $groupRules);
}
// 如果存在 children,递归处理
if (isset($item['children']) && is_array($item['children'])) {
$item['children'] = $this->updateMenuSelected($item['children'], $groupRules);
}
}
return $list;
}
/**
* 补齐menu
* @remark 为了方便端显示,并未展示隐藏的菜单。所以这里需要补齐隐藏菜单
* @return void
*/
public function patchingMenu($rules){
if(!$rules){
return $rules;
}
$candidateMenu = [
'app_store'=>['app_entry'],
'config_system_basic'=>['config_system'],
'app_activity'=>['app_activity_manage','app_activity_edit'],
'app_exam'=>['app_exam_exercises_edit','app_exam_exercises_analyze'],
'app_testpaper_index'=>['app_testpaper_edit'],
'app_test'=>['app_test_analysis_index','app_test_appraise_index','app_test_appraise_detail','app_test_edit'],
'app_question_bank'=>['app_question_bank_edit'],
'course_list_article'=>['course_form','course_detail','course_batch','course_member','course_data'],
'course_list_audio'=>['course_form','course_detail','course_batch','course_member','course_data'],
'course_list_video'=>['course_form','course_detail','course_batch','course_member','course_data'],
'course_list_column'=>['course_form','course_detail','course_batch','course_member','course_data','course_column_detail','course_column_dir'],
'course_group_list'=>['course_group_detail'],
'course_group_category'=>['course_group_detail'],
'message_list'=>['message_form'],
'page_navigation_list'=>['page_navigation_diy'],
'dashboard_channel_channels'=>['dashboard_channel_channels_goods_edit'],
'live'=>['live_room','live_detail','live_form','course_form','course_detail','course_batch','course_member','course_data'],
'course_list_live'=>['live_room'],
'app_coupon'=>['app_coupon_edit','app_coupon_data'],
'app_exchange'=>['app_exchange_warehouse','app_exchange_edit'],
'order_list'=>['order_detail'],
'page_decorate_list'=>['page_decorate_diy'],
'app_pc'=>['app_pc_diy'],
'app_vip'=>['app_vip_edit','app_vip_detail'],
'user_manage_list'=>['user_manage_detail'],
'app_form'=>['app_form_edit','app_form_data'],
];
$rules = explode(",",$rules);
foreach ($rules as $rule){
if(isset($candidateMenu[$rule])){
$rules = array_merge($rules, $candidateMenu[$rule]);
}
}
return implode(",",$rules);
}
}