where('role_id', $roleId) ->where('status', 1) ->field('mobile_rules') ->find(); if ($roleData && !empty($roleData['mobile_rules'])) { // 解析mobile_rules JSON字符串 $mobileRules = json_decode($roleData['mobile_rules'], true); if (is_array($mobileRules)) { // 使用查询构造器获取所有菜单信息 $allMenus = Db::table('school_sys_menu') ->where('app_type', 'uniapp') ->where('status', 1) ->field('id, menu_key, menu_name, icon as menu_icon, router_path as menu_path, sort as sort_order') ->select() ->toArray(); // 创建menu_key到菜单信息的映射 $menuKeyToMenu = []; foreach ($allMenus as $menu) { $menuKeyToMenu[$menu['menu_key']] = $menu; } // 按mobile_rules中的顺序构建菜单列表 $menuList = []; foreach ($mobileRules as $menuKey) { if (isset($menuKeyToMenu[$menuKey])) { $menu = $menuKeyToMenu[$menuKey]; $menu['menu_params'] = []; $menu['menu_icon'] = $menu['menu_icon'] ?? ''; $menu['menu_path'] = $menu['menu_path'] ?? ''; $menuList[] = $menu; } } return $menuList; } } // 如果mobile_rules为空,则从role_menu_permissions表获取(向后兼容) $menuList = Db::table('role_menu_permissions') ->alias('rmp') ->leftJoin('school_sys_menu m', 'rmp.menu_id = m.id') ->where('rmp.role_id', $roleId) ->where('rmp.is_enabled', 1) ->field('m.id, m.menu_key, m.menu_name, m.icon as menu_icon, m.router_path as menu_path, m.sort as sort_order') ->order('m.sort', 'ASC') ->select() ->toArray(); // 处理参数和数据转换 foreach ($menuList as &$item) { // 设置空的menu_params $item['menu_params'] = []; // 确保字段存在 $item['menu_icon'] = $item['menu_icon'] ?? ''; $item['menu_path'] = $item['menu_path'] ?? ''; } return $menuList; } /** * 设置角色的UniApp菜单权限 * @param int $roleId * @param array $menuKeys 菜单键名数组(如:pages-common/my_attendance) * @return bool */ public function setRoleMenus(int $roleId, array $menuKeys) { Db::startTrans(); try { // 1. 更新school_sys_role表的mobile_rules字段(主要存储方式) $mobileRulesJson = json_encode($menuKeys, JSON_UNESCAPED_UNICODE); Db::table('school_sys_role') ->where('role_id', $roleId) ->update(['mobile_rules' => $mobileRulesJson]); // 2. 同步到role_menu_permissions表(向后兼容) // 删除原有权限 Db::table('role_menu_permissions') ->where('role_id', $roleId) ->delete(); // 添加新权限 if (!empty($menuKeys)) { // 使用查询构造器获取菜单ID映射 $menuList = Db::table('school_sys_menu') ->where('app_type', 'uniapp') ->where('status', 1) ->field('id, menu_key') ->select() ->toArray(); // 创建menu_key到ID的映射 $menuKeyToId = []; foreach ($menuList as $menu) { $menuKeyToId[$menu['menu_key']] = $menu['id']; } // 过滤出有效的菜单ID并构造插入数据 $insertData = []; $currentTime = date('Y-m-d H:i:s'); foreach ($menuKeys as $menuKey) { if (isset($menuKeyToId[$menuKey])) { $insertData[] = [ 'role_id' => $roleId, 'menu_id' => $menuKeyToId[$menuKey], 'is_enabled' => 1, 'created_at' => $currentTime, 'updated_at' => $currentTime ]; } } // 批量插入权限数据 if (!empty($insertData)) { Db::table('role_menu_permissions')->insertAll($insertData); } } Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); throw new AdminException('设置UniApp菜单权限失败:' . $e->getMessage()); } } }