智慧教务系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

129 lines
4.6 KiB

<?php
// +----------------------------------------------------------------------
// | Niucloud-admin 企业快速开发的多应用管理平台
// +----------------------------------------------------------------------
// | 官方网址:https://www.niucloud.com
// +----------------------------------------------------------------------
// | niucloud团队 版权所有 开源版本可自由商用
// +----------------------------------------------------------------------
// | Author: Niucloud Team
// +----------------------------------------------------------------------
namespace app\service\admin\uniapp;
use core\base\BaseAdminService;
use core\exception\AdminException;
use think\facade\Db;
/**
* UniApp权限管理服务类
*/
class UniappAuthService extends BaseAdminService
{
/**
* 获取所有UniApp菜单(用于权限配置)
* @return array
*/
public function getAllMenus()
{
// 从UniApp员工端功能页面整理文档获取菜单数据,基于school_sys_menu表结构
$sql = "SELECT id, menu_key, menu_name, icon as menu_icon, router_path as menu_path,
'' as menu_params, sort, status, menu_short_name as description
FROM school_sys_menu
WHERE status = 1 AND app_type = 'uniapp'
ORDER BY sort ASC, id ASC";
$list = Db::query($sql);
// 处理参数和数据转换
foreach ($list as &$item) {
// 设置空的menu_params
$item['menu_params'] = [];
// 确保字段存在
$item['menu_icon'] = $item['menu_icon'] ?? '';
$item['menu_path'] = $item['menu_path'] ?? '';
$item['sort_order'] = $item['sort'];
}
return $list;
}
/**
* 获取角色的UniApp菜单权限
* @param int $roleId
* @return array
*/
public function getRoleMenus(int $roleId)
{
$sql = "SELECT m.id, m.menu_key, m.menu_name, m.icon as menu_icon,
m.router_path as menu_path, '' as menu_params, m.sort as sort_order
FROM role_menu_permissions rmp
LEFT JOIN school_sys_menu m ON rmp.menu_id = m.id
WHERE rmp.role_id = ? AND rmp.is_enabled = 1
ORDER BY m.sort ASC";
$menuList = Db::query($sql, [$roleId]);
// 处理参数和数据转换
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 {
// 删除原有权限
Db::execute("DELETE FROM role_menu_permissions WHERE role_id = ?", [$roleId]);
// 添加新权限
if (!empty($menuKeys)) {
// 将menu_key转换为对应的数据库ID
$menuIds = [];
$sql = "SELECT id, menu_key FROM school_sys_menu WHERE app_type = 'uniapp' AND status = 1";
$menuList = Db::query($sql);
$menuKeyToId = [];
foreach ($menuList as $menu) {
$menuKeyToId[$menu['menu_key']] = $menu['id'];
}
// 过滤出有效的菜单ID
foreach ($menuKeys as $menuKey) {
if (isset($menuKeyToId[$menuKey])) {
$menuIds[] = $menuKeyToId[$menuKey];
}
}
// 插入新的权限数据
if (!empty($menuIds)) {
$values = [];
$params = [];
foreach ($menuIds as $menuId) {
$values[] = "(?, ?, 1, NOW(), NOW())";
$params[] = $roleId;
$params[] = $menuId;
}
$sql = "INSERT INTO role_menu_permissions (role_id, menu_id, is_enabled, created_at, updated_at) VALUES " . implode(', ', $values);
Db::execute($sql, $params);
}
}
Db::commit();
return true;
} catch (\Exception $e) {
Db::rollback();
throw new AdminException('设置UniApp菜单权限失败:' . $e->getMessage());
}
}
}