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.
187 lines
6.9 KiB
187 lines
6.9 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)
|
|
{
|
|
// 优先从school_sys_role.mobile_rules字段获取权限配置
|
|
$roleData = Db::table('school_sys_role')
|
|
->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());
|
|
}
|
|
}
|
|
}
|