|
@@ -8,11 +8,13 @@
|
|
|
|
|
|
namespace App\Http\Services\Backend\Server\System;
|
|
|
|
|
|
+use App\Enums\Common\ErrorMessage;
|
|
|
use App\Enums\Common\Status;
|
|
|
use App\Enums\System\MenuType;
|
|
|
use App\Exceptions\ApiException;
|
|
|
use App\Http\Services\Service;
|
|
|
use App\Models\System\Menu;
|
|
|
+use App\Models\System\Role;
|
|
|
use Exception;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
|
use Spatie\Permission\Guard;
|
|
@@ -27,7 +29,7 @@ class MenuService extends Service
|
|
|
/**
|
|
|
* @throws ApiException
|
|
|
*/
|
|
|
- public function createMenu(array $data, array $permissions)
|
|
|
+ public function createMenu(array $data)
|
|
|
{
|
|
|
// 校验父菜单存在
|
|
|
self::validateParentMenu($data['parentId'], null);
|
|
@@ -35,43 +37,57 @@ class MenuService extends Service
|
|
|
self::validateMenu($data['parentId'], $data['name'], null);
|
|
|
|
|
|
// 校验权限标识
|
|
|
+ $permissions = isset($data['permission']) ? self::convertPermissions($data['permission']) : [];
|
|
|
$this->validatePermissions($permissions);
|
|
|
|
|
|
// 插入数据库
|
|
|
$menu = self::toModel($data, Menu::class);
|
|
|
-
|
|
|
self::initMenuProperty($menu);
|
|
|
|
|
|
DB::beginTransaction();
|
|
|
try {
|
|
|
- $menu_id = $menu->create($menu->getAttributes())->id;
|
|
|
- $this->createPermissions($permissions, $menu_id);
|
|
|
+ $menu = $menu->create($menu->getAttributes());
|
|
|
+ self::createPermissions($permissions);
|
|
|
+ self::syncMenuHasPermissions($menu, $permissions);
|
|
|
DB::commit();
|
|
|
- }
|
|
|
- catch (Exception){
|
|
|
+ return $menu->id;
|
|
|
+ } catch (Exception) {
|
|
|
DB::rollBack();
|
|
|
self::error('添加失败');
|
|
|
}
|
|
|
- return $menu_id;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @throws ApiException
|
|
|
*/
|
|
|
- public function updateMenu($params): void
|
|
|
+ public function updateMenu($data): void
|
|
|
{
|
|
|
// 校验更新的菜单是否存在
|
|
|
- !self::isExistMenu($params['id']) && self::error('MENU_NOT_EXISTS', Response::HTTP_UNPROCESSABLE_ENTITY);
|
|
|
+ !self::isExistMenu($data['id']) && self::error('MENU_NOT_EXISTS', Response::HTTP_UNPROCESSABLE_ENTITY);
|
|
|
// 校验父菜单存在
|
|
|
- self::validateParentMenu($params['parentId'], $params['id']);
|
|
|
+ self::validateParentMenu($data['parentId'], $data['id']);
|
|
|
// 校验菜单(自己)
|
|
|
- self::validateMenu($params['parentId'], $params['name'], $params['id']);
|
|
|
+ self::validateMenu($data['parentId'], $data['name'], $data['id']);
|
|
|
|
|
|
- // 更新到数据库
|
|
|
- $menu = self::toModel($params, Menu::class);
|
|
|
+ // 校验权限标识
|
|
|
+ $permissions = isset($data['permission']) ? self::convertPermissions($data['permission']) : [];
|
|
|
+ $this->validatePermissions($permissions, $data['id']);
|
|
|
|
|
|
+ // 更新到数据库
|
|
|
+ $menu = self::toModel($data, Menu::class);
|
|
|
self::initMenuProperty($menu);
|
|
|
- $menu->update($menu->getAttributes());
|
|
|
+ DB::beginTransaction();
|
|
|
+ try {
|
|
|
+ $menu->update($menu->getAttributes());
|
|
|
+ self::detachMenuHasPermissions($menu);
|
|
|
+ self::createPermissions($permissions);
|
|
|
+ self::syncMenuHasPermissions($menu, $permissions);
|
|
|
+ DB::commit();
|
|
|
+ } catch (Exception) {
|
|
|
+ DB::rollBack();
|
|
|
+ self::error('修改失败');
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -81,14 +97,19 @@ class MenuService extends Service
|
|
|
{
|
|
|
// 校验是否还有子菜单
|
|
|
self::validateChildrenMenu($id);
|
|
|
-
|
|
|
// 校验删除的菜单是否存在
|
|
|
!self::isExistMenu($id) && self::error('MENU_NOT_EXISTS', Response::HTTP_UNPROCESSABLE_ENTITY);
|
|
|
-
|
|
|
$menu = self::toModel(['id' => $id], Menu::class);
|
|
|
-
|
|
|
- // 标记删除
|
|
|
- return $menu->delete();
|
|
|
+ try {
|
|
|
+ self::detachMenuHasPermissions($menu);
|
|
|
+ // 标记删除
|
|
|
+ $res = $menu->delete();
|
|
|
+ DB::commit();
|
|
|
+ return $res;
|
|
|
+ } catch (Exception) {
|
|
|
+ DB::rollBack();
|
|
|
+ self::error('删除失败');
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public function getMenu($id): array
|
|
@@ -159,46 +180,54 @@ class MenuService extends Service
|
|
|
$menu->id !== $id && self::error('MENU_NAME_DUPLICATE', Response::HTTP_UNPROCESSABLE_ENTITY);
|
|
|
}
|
|
|
|
|
|
+ protected static function convertPermissions(string $permission): array
|
|
|
+ {
|
|
|
+ if (empty($permission)) return [];
|
|
|
+ return collect(explode('|', $permission))->map(function ($item) {
|
|
|
+ return trim($item);
|
|
|
+ })->all();
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* @throws ApiException
|
|
|
*/
|
|
|
protected function validatePermissions(array $permissions, int $menu_id = null): void
|
|
|
{
|
|
|
if (empty($permissions)) return;
|
|
|
- $isExists = Permission::query()->whereIn('name', $permissions)->where('guard_name', Guard::getDefaultName(static::class))->exists();
|
|
|
- $isExists && empty($menu_id) && self::error('权限标识重复');
|
|
|
+ $isExistsPermissions = Permission::query()->whereIn('name', $permissions)->where('guard_name', Guard::getDefaultName(static::class))->get();
|
|
|
+ count($isExistsPermissions) && empty($menu_id) && self::error(ErrorMessage::PERMISSION_NAME_DUPLICATE);
|
|
|
+ if (empty($menu_id)) return;
|
|
|
+ $menu = Menu::query()->find($menu_id);
|
|
|
+ $isHas = $menu->hasAllPermissions($isExistsPermissions);
|
|
|
+ !$isHas && self::error(ErrorMessage::PERMISSION_NAME_DUPLICATE);
|
|
|
}
|
|
|
|
|
|
- protected function createPermissions(array $permissions, int $menu_id): void
|
|
|
+ protected static function syncMenuHasPermissions(Menu $menu, array $permissions): void
|
|
|
{
|
|
|
if (empty($permissions)) return;
|
|
|
- $permissionsData = [];
|
|
|
- $guardName = Guard::getDefaultName(static::class);
|
|
|
- $permissionQuery = Permission::query();
|
|
|
- foreach ($permissions as $permission) {
|
|
|
- $permissionsData[] = ['name' => $permission, 'guard_name' => $guardName];
|
|
|
- }
|
|
|
-
|
|
|
- $permissionQuery->insert($permissionsData);
|
|
|
- $permissionIds = $permissionQuery->whereIn('name', $permissions)->pluck('id');
|
|
|
+ $permissions_ids = Permission::query()->whereIn('name', $permissions)->pluck('id');
|
|
|
+ empty($permissions_ids) && self::error(ErrorMessage::PERMISSION_NAME_NOT_EXISTS);;
|
|
|
+ $menu->permissions()->sync($permissions_ids);
|
|
|
+ }
|
|
|
|
|
|
- $this->createMenuHasPermissions($menu_id, $permissionIds->toArray());
|
|
|
+ protected static function detachMenuHasPermissions(Menu $menu)
|
|
|
+ {
|
|
|
+ $permission_ids = $menu->permissions()->pluck('id');
|
|
|
+ Permission::query()->whereIn('id', $permission_ids)->delete();
|
|
|
}
|
|
|
|
|
|
- protected function createMenuHasPermissions(int $menu_id, array $permission_ids): void
|
|
|
+ protected static function createPermissions(array $permissions): void
|
|
|
{
|
|
|
- $tableNames = config('permission.table_names');
|
|
|
- $menuHasPermissionsData = [];
|
|
|
- $model_type = Menu::class;
|
|
|
- foreach ($permission_ids as $permission_id) {
|
|
|
- $menuHasPermissionsData[] = ['permission_id' => $permission_id, 'model_type' => $model_type, 'model_id' => $menu_id];
|
|
|
+ if (empty($permissions)) return;
|
|
|
+ foreach ($permissions as $permissionName) {
|
|
|
+ Permission::create(['name' => $permissionName]);
|
|
|
}
|
|
|
- DB::table($tableNames['model_has_permissions'])->insert($menuHasPermissionsData);
|
|
|
+// $menu->givePermissionTo($permissions);
|
|
|
|
|
|
- // 存在权限并清空权限缓存
|
|
|
-// Cache::forget(config('permission.cache.key'));
|
|
|
+// $menu->flushPermissionCache();
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* 初始化菜单的通用属性。
|
|
|
* <p>
|