187 lines
5.7 KiB
PHP
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);
|
|
}
|
|
}
|