Commit 61352f7d authored by hangjun83's avatar hangjun83

整体代码布局调整

parent 11f9979f
......@@ -9,7 +9,7 @@
* with this source code in the file LICENSE.
*/
namespace App\Http\Middleware;
namespace App\Http\Controllers\Middleware;
use App\Repositories\Enums\ResponseCodeEnum;
use Closure;
......@@ -73,6 +73,16 @@ class Authenticate
$request->headers->set('authorization','bearer'.$decodeToken['hash']);
}
//对用户权限进行判断验证
$currentUser = auth()->user();
/*echo "<pre>";
print_r($currentUser->permissions->toArray());
exit;*/
/*echo "<pre>";
print_R($request->route());
exit;*/
return $next($request);
}
}
<?php
/*
* This file is part of the Jiannei/lumen-api-starter.
*
* (c) Jiannei <longjian.huang@foxmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace App\Http\Controllers\V1\Auth;
use Illuminate\Http\Request;
use Jiannei\Response\Laravel\Support\Facades\Response;
use App\Http\Controllers\V1\Controller;
use App\Services\AuthService;
use App\Services\RoleAndPermissionsService;
class AuthUserController extends Controller
{
protected $authService = null;
/**
* Create a new AuthController instance.
* @param \App\Services\AuthService $authService
*/
public function __construct(AuthService $authService)
{
$this->authService = $authService;
}
/**
* @param \Illuminate\Http\Request $request
*/
public function login(Request $request)
{
$message = [
'username.required' => "请输入用户名",
'password.required' => "请输入密码",
];
$this->validateRequest($request, $message);
try{
$response = $this->authService->login($request);
return Response::success([
'token' => $response,
], '登陆成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
}
}
/**
* @param \Illuminate\Http\Request $request
*/
public function logout(Request $request)
{
try{
$this->authService->logout($request);
return Response::success(null,'请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
}
}
public function addUser(Request $request)
{
$message = [
'username.required' => "用户登陆账号必填",
'password.required' => "密码必填",
'type.required' => "用户类型必选",
'nickname.required' => "用户名称必填",
'email.required' => "邮箱必填",
];
$this->validateRequest($request, $message);
try{
$this->authService->saveOrUpdateUser($request);
return Response::success(null,'请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
}
}
public function editUser(Request $request)
{
$message = [
'type.required' => "用户类型必选",
'nickname.required' => "用户名称必填",
'email.required' => "邮箱必填",
];
$this->validateRequest($request, $message);
try{
$this->authService->saveOrUpdateUser($request);
return Response::success(null,'请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
}
}
public function changeUserStatus(Request $request, $id)
{
if(!$id){
return Response::fail('缺少id参数',500);
}
try{
$this->authService->updateUserStatus($request,$id);
return Response::success(null,'请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
}
}
public function delUserByIds(Request $request)
{
$message = [
'ids.required' => "用户id必传",
];
$this->validateRequest($request, $message);
try{
$this->authService->deleteUser($request);
return Response::success(null,'请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
}
}
/**
* 获取用户信息
* @param Request $request
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
*/
public function info(Request $request)
{
try{
$user = $this->authService->getUserInfo();
$service = app(RoleAndPermissionsService::class);
$service->getRolesToUser();
return Response::success([
'userinfo' => $user,
], '请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
}
}
public function listByPage(Request $request)
{
try{
$service = app(AuthService::class);
$roles = $service->listByPage($request);
return Response::success($service->formatKeysfromArray($roles,'toCamelCase'), '操作成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
}
}
/**
* @param Request $request
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
*/
public function resetPassword(Request $request)
{
$message = [
'oldpassword.required' => "请输入旧密码",
'newpassword.required' => "请输入新密码",
];
$this->validateRequest($request, $message);
try{
$response = $this->authService->resetPassword($request);
return Response::success([], '更新成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
}
}
}
......@@ -9,7 +9,7 @@
* with this source code in the file LICENSE.
*/
namespace App\Http\V1;
namespace App\Http\Controllers\V1;
use Jiannei\Response\Laravel\Support\Facades\Response;
use Jiannei\Response\Laravel\Support\Traits\ExceptionTrait;
......
......@@ -9,178 +9,26 @@
* with this source code in the file LICENSE.
*/
namespace App\Http\V1\Auth;
namespace App\Http\Controllers\V1;
use App\Repositories\Enums\ResponseCodeEnum;
use App\Services\MenusService;
use Illuminate\Http\Request;
use Jiannei\Response\Laravel\Support\Facades\Response;
use App\Http\V1\Controller;
use App\Services\AuthService;
use App\Http\Controllers\V1\Controller;
use App\Services\RoleAndPermissionsService;
class AuthorizationController extends Controller
class PermissionsController extends Controller
{
protected $authService = null;
protected $roleAndPermissionService = null;
/**
* Create a new AuthController instance.
* @param \App\Services\AuthService $authService
*/
public function __construct(AuthService $authService)
public function __construct(RoleAndPermissionsService $roleAndPermissionsService)
{
$this->authService = $authService;
}
/**
* @param \Illuminate\Http\Request $request
*/
public function login(Request $request)
{
$message = [
'username.required' => "请输入用户名",
'password.required' => "请输入密码",
];
$this->validateRequest($request, $message);
try{
$response = $this->authService->login($request);
return Response::success([
'token' => $response,
], '登陆成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
}
}
/**
* @param \Illuminate\Http\Request $request
*/
public function logout(Request $request)
{
try{
$this->authService->logout($request);
return Response::success(null,'请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
}
}
public function addUser(Request $request)
{
$message = [
'username.required' => "用户登陆账号必填",
'password.required' => "密码必填",
'type.required' => "用户类型必选",
'nickname.required' => "用户名称必填",
'email.required' => "邮箱必填",
];
$this->validateRequest($request, $message);
try{
$this->authService->saveOrUpdateUser($request);
return Response::success(null,'请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
}
}
public function editUser(Request $request)
{
$message = [
'type.required' => "用户类型必选",
'nickname.required' => "用户名称必填",
'email.required' => "邮箱必填",
];
$this->validateRequest($request, $message);
try{
$this->authService->saveOrUpdateUser($request);
return Response::success(null,'请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
}
}
public function changeUserStatus(Request $request, $id)
{
if(!$id){
return Response::fail('缺少id参数',500);
}
try{
$this->authService->updateUserStatus($request,$id);
return Response::success(null,'请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
}
}
public function delUserByIds(Request $request)
{
$message = [
'ids.required' => "用户id必传",
];
$this->validateRequest($request, $message);
try{
$this->authService->deleteUser($request);
return Response::success(null,'请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
}
}
/**
* 获取用户信息
* @param Request $request
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
*/
public function info(Request $request)
{
try{
$user = $this->authService->getUserInfo();
$service = app(RoleAndPermissionsService::class);
$service->getRolesToUser();
return Response::success([
'userinfo' => $user,
], '请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
}
}
public function listByPage(Request $request)
{
try{
$service = app(AuthService::class);
$roles = $service->listByPage($request);
return Response::success($service->formatKeysfromArray($roles,'toCamelCase'), '操作成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
}
}
/**
* @param Request $request
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource
*/
public function resetPassword(Request $request)
{
$message = [
'oldpassword.required' => "请输入旧密码",
'newpassword.required' => "请输入新密码",
];
$this->validateRequest($request, $message);
try{
$response = $this->authService->resetPassword($request);
return Response::success([], '更新成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
}
$this->roleAndPermissionService = $roleAndPermissionsService;
}
/**
......@@ -191,10 +39,9 @@ class AuthorizationController extends Controller
public function getMenuList(Request $request)
{
try{
$service = app(RoleAndPermissionsService::class);
$menuList = $service->getUserRoleMenus();
$menuList = $this->roleAndPermissionService->getUserRoleMenus();
return Response::success([
'data' => $service->getMenusTree($menuList,'page'),
'data' => app(MenusService::class)->getMenusTree($menuList,'page'),
], '请求成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
......@@ -209,7 +56,7 @@ class AuthorizationController extends Controller
public function getAllMenuList(Request $request)
{
try{
$service = app(RoleAndPermissionsService::class);
$service = app(MenusService::class);
$menuList = $service->getAllMenus();
$treeMenu = $service->getMenusTree($menuList);
return Response::success([
......@@ -245,7 +92,7 @@ class AuthorizationController extends Controller
}
try{
$service = app(RoleAndPermissionsService::class);
$service = app(MenusService::class);
$service->editMenu($request);
return Response::success([], '更新成功');
}catch(\Exception $exception){
......@@ -256,8 +103,7 @@ class AuthorizationController extends Controller
public function getDefaultButtonPermission(Request $request)
{
try{
$service = app(RoleAndPermissionsService::class);
$buttonPermissions = $service->getButtonDefaultPermission();
$buttonPermissions = $this->roleAndPermissionService->getButtonDefaultPermission();
return Response::success($buttonPermissions, '操作成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
......@@ -293,11 +139,11 @@ class AuthorizationController extends Controller
}
try{
$service = app(RoleAndPermissionsService::class);
$service = app(MenusService::class);
$service->addSubMenu($request);
return Response::success([], '操作成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
return Response::fail($exception->getMessage(),500);
}
}
......@@ -309,7 +155,7 @@ class AuthorizationController extends Controller
$this->validateRequest($request, $message);
try{
$service = app(RoleAndPermissionsService::class);
$service = app(MenusService::class);
$service->deleteMenus($request);
return Response::success([], '操作成功');
}catch(\Exception $exception){
......@@ -325,9 +171,8 @@ class AuthorizationController extends Controller
public function getAllByPage(Request $request)
{
try{
$service = app(RoleAndPermissionsService::class);
$roles = $service->getAllRolesToPage($request);
return Response::success($service->formatKeysfromArray($roles,'toCamelCase'), '操作成功');
$roles = $this->roleAndPermissionService->getAllRolesToPage($request);
return Response::success($this->roleAndPermissionService->formatKeysfromArray($roles,'toCamelCase'), '操作成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
}
......@@ -336,9 +181,8 @@ class AuthorizationController extends Controller
public function getAllList(Request $request)
{
try{
$service = app(RoleAndPermissionsService::class);
$roles = $service->getAllRolesList($request);
return Response::success($service->formatKeysfromArray($roles,'toCamelCase'), '操作成功');
$roles = $this->roleAndPermissionService->getAllRolesList($request);
return Response::success($this->roleAndPermissionService->formatKeysfromArray($roles,'toCamelCase'), '操作成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),$exception->getCode());
}
......@@ -353,8 +197,7 @@ class AuthorizationController extends Controller
$this->validateRequest($request, $message);
try{
$service = app(RoleAndPermissionsService::class);
$service->saveRole($request);
$this->roleAndPermissionService->saveRole($request);
return Response::success([], '操作成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
......@@ -376,8 +219,7 @@ class AuthorizationController extends Controller
$this->validateRequest($request, $message);
try{
$service = app(RoleAndPermissionsService::class);
$service->saveRole($request);
$this->roleAndPermissionService->saveRole($request);
return Response::success([], '操作成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
......@@ -397,8 +239,7 @@ class AuthorizationController extends Controller
$this->validateRequest($request, $message);
try{
$service = app(RoleAndPermissionsService::class);
$service->syncPermissionToRole($request);
$this->roleAndPermissionService->syncPermissionToRole($request);
return Response::success([], '操作成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
......@@ -413,8 +254,7 @@ class AuthorizationController extends Controller
$this->validateRequest($request, $message);
try{
$service = app(RoleAndPermissionsService::class);
$service->deleteRoleByIds($request);
$this->roleAndPermissionService->deleteRoleByIds($request);
return Response::success([], '操作成功');
}catch(\Exception $exception){
return Response::fail($exception->getMessage(),500);
......
......@@ -53,6 +53,9 @@ class AuthService
if( !$user = auth()->attempt($requestCriteria) ){
throw new UnauthorizedHttpException('authroization error','用户登陆授权失败,用户名或密码错误',null,ResponseCodeEnum::CLIENT_PARAMETER_ERROR);
}
if(auth()->user()->toArray()['status'] == 0){
throw new UnauthorizedHttpException('authroization error','用户登陆授权失败,该用户已被冻结',null,ResponseCodeEnum::CLIENT_PARAMETER_ERROR);
}
return $this->generateToken($user);
}catch(\Exception $exception){
throw new UnauthorizedHttpException('authroization error',$exception->getMessage(),null,ResponseCodeEnum::SERVICE_LOGIN_ERROR);
......@@ -90,6 +93,11 @@ class AuthService
if(!$params['page_size'] || $params['page_size'] == 0){
$params['page_size'] = 10;
}
if(isset($params['type'])){
}
$users = $this->userRepository->paginate($params['page_size'],['id','username','nickname','email','token','is_admin','status','lastlogin','created_at','updated_at']);
$returnRecord = [];
if($users){
......@@ -172,8 +180,9 @@ class AuthService
// 如果编辑用户时选择了所属角色
if(isset($params['role_ids']) && !empty($params['role_ids'])){
$ids = explode(',',$params['role_ids']);
$roles = Role::query()->whereIn('id',$ids)->get();
if(!$roles){
//获取需要分配的角色
$toBeAssignRoles = Role::query()->whereIn('id',$ids)->get();
if(!$toBeAssignRoles){
throw new \LogicException('角色不存在');
}
......@@ -182,13 +191,13 @@ class AuthService
$belongRoles = $user->roles;
//角色
if(count($belongRoles->toArray()) > 0){
$this->removeUserRoleAndPermission($user, $roles);
$this->removeUserRoleAndPermission($user, $belongRoles);
}
$this->authroizeUserRoleAndPermission($user, $roles);
$this->authroizeUserRoleAndPermission($user, $toBeAssignRoles);
}else{
$roles = $user->roles;
if(count($roles->toArray()) > 0){
$this->removeUserRoleAndPermission($user,$roles);
$belongRoles = $user->roles;
if(count($belongRoles->toArray()) > 0){
$this->removeUserRoleAndPermission($user,$belongRoles);
}
}
}
......
......@@ -12,10 +12,12 @@
namespace App\Services;
use App\Repositories\Enums\ResponseCodeEnum;
use App\Repositories\Models\Menus;
use App\Support\Traits\Helpers;
use App\Repositories\Contracts\MenusRepository;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
......@@ -26,13 +28,310 @@ class MenusService
use Helpers;
protected $menuRepository = null;
protected $menusRepository = null;
public function __construct(MenusRepository $menuRepository)
{
$this->menuRepository = $menuRepository;
$this->menusRepository = $menuRepository;
}
/**
* 添加子菜单
* @param $request
* @return bool
*/
public function addSubMenu($request)
{
$params = $this->formatKeysfromArray($request->all(),'toUnderScore');
$menuModel = app(Menus::class);
$parentMenu = $menuModel->where('id',$params['parent_id'])->first();
if(!$parentMenu){
throw new \LogicException('上级菜单不存在!',500);
}
if('button' == $params['type']){
$permission = Permission::query()->where(['menu_id' => 0, 'sys_default' => 1,'guard_name' => config('auth.defaults.guard'), 'action' => $params['button_type']])->first();
if(!$permission){
throw new \LogicException('按钮动作不存在!',500);
}
}
$filterParams = [];
collect($this->menusRepository->rules['create'])->map(function($rule,$key) use ($params, &$filterParams){
if(isset($params[$key]) && !empty($params[$key])){
$filterParams[$key] = $params[$key];
} else{
$filterParams[$key] = '';
}
});
$filterParams['created_by'] = auth()->user()->id;
$filterParams['menu_icon'] = $params['icon'];
$filterParams['component'] = $params['component'];
$filterParams['status'] = intval($params['status']);
$filterParams = collect($filterParams)->map(function($value,$key) use ($params){
if($value == ''){
switch($key){
case 'menu_name' : $value = $params['title']; break;
case 'menu_path' : $value = $params['path']; break;
case 'menu_icon' : $value = $params['icon']; break;
case 'menu_type' : $value = $params['type']; break;
case 'is_show' : $value = 1; break;
case 'sys_default' : $value = 0; break;
}
}
return $value;
});
$result = $this->menusRepository->create($filterParams->toArray());
if($result){
$permission = [];
$permission['name'] = $result['menu_name'];
$permission['menu_id'] = $result['id'];
$permission['action'] = $params['button_type'];
$permission['permission_type'] = 'menu';
$permission['sys_default'] = 0;
$permission['remark'] = $result['menu_name'].'的相关权限';
$permission['guard_name'] = config('auth.defaults.guard');
//增加对应的按钮权限
$permissionResult = Permission::create($permission);
// 如果是管理员,自动绑定赋予权限
if(auth()->user()->isSuperAdmin()){
if($permissionResult){
app(RoleAndPermissionsService::class)->assignRoleAndPermissionToUser($permissionResult, auth()->user());
}
}
}
return true;
}
/**
* 删除菜单
* @param $request
*/
public function deleteMenus($request)
{
$params = $this->formatKeysfromArray($request->all(),'toUnderScore');
$menuModel = app(Menus::class);
$menu_ids = explode(',',$params['ids']);
if(!$menus = $menuModel->whereIn('id',$menu_ids)->get()){
throw new \LogicException('选中的菜单不存在!',500);
}
//判断该菜单下面是否有其他子菜单
$parent_menus = $menuModel->whereIn('id',$menu_ids)->get();
if($parent_menus){
$notFatherMenus = [];
$checkedMenus = [];
collect($parent_menus)->map(function($menu) use (&$notFatherMenus, &$checkedMenus){
if(count($notFatherMenus) == 0){
$notFatherMenus[$menu['id']] = $menu;
}else{
if(isset($notFatherMenus[$menu['parent_id']])){
unset($notFatherMenus[$menu['parent_id']]);
$checkedMenus[] = $menu['parent_id'];
}else{
if(!in_array($menu['parent_id'],$checkedMenus)){
$notFatherMenus[$menu['id']] = $menu;
}
}
}
});
if(count($notFatherMenus) > 0){
if(count($menuModel->whereIn('parent_id',array_keys($notFatherMenus))->get()->toArray()) > 0 ){
throw new \LogicException('选中的菜单中有子菜单存在,无法删除该菜单。',500);
}
}
}
//判断选中的菜单是否已被赋予权限给到用户组
//查询该菜单对应的权限数据
$menuPermission = Permission::query()->whereIn('menu_id',$menu_ids)->get();
if($menuPermission){
$allRoles = Role::all();
if($allRoles){
$hasPermission = false;
collect($allRoles)->map(function($role) use ($menuPermission, &$hasPermission){
collect($menuPermission)->map(function($permission) use ($role, &$hasPermission){
if($role->hasPermissionTo($permission)){
$hasPermission = true ;
}
});
});
if($hasPermission){
throw new \LogicException('用户权限中已经包含该菜单权限,请先取消角色中该菜单的权限,在进行删除操作.',500);
}
//删除对应的菜单
collect($menus)->map(function($menu) use ($menuPermission){
$menu->delete();
//删除对应的菜单权限
collect($menuPermission)->map(function($permission){
$permission->delete();
});
});
}
}
}
/**
* 编辑菜单
* @param Request $request
* @return mixed
*/
public function editMenu(Request $request)
{
$params = $this->formatKeysfromArray($request->all(),'toUnderScore');
$menuModel = app(Menus::class);
$menu = $menuModel->where('id',$params['id'])->first();
if(!$menu){
throw new \LogicException('此菜单不存在!',500);
}
$parentMenu = $menuModel->where('id',$params['parent_id'])->first();
if(!$parentMenu){
throw new \LogicException('上级菜单不存在!',500);
}
if(!in_array($params['menu_type'],['top','page','button'])){
throw new \LogicException('菜单类型不正确!',500);
}
$params['menu_name'] = $params['title'];
$params['menu_path'] = $params['path'];
$params['menu_icon'] = $params['icon'];
// 根据role规则重组 user
$updateMenus = [];
collect($this->menusRepository->rules['update'])->map(function($rule,$key) use ($params, &$updateMenus){
if($key != 'id'){
$updateMenus[$key] = $params[$key];
}
});
$updateMenus['component'] = $params['component'];
$updateMenus['created_by'] = auth()->user()->id;
$result = $this->menusRepository->update($updateMenus,$params['id']);
return $result;
}
/**
* 获取所有菜单列表
* @return array
* @throws \Psr\Container\ContainerExceptionInterface
*
* @throws \Psr\Container\NotFoundExceptionInterface
*/
public function getAllMenus()
{
$menuModel = app(Menus::class);
$allMenus = $menuModel->get();
// key_name转换
$parent_id = [];
$menusList = collect($allMenus)->map(function($menu) use (&$parent_id){
$newMenu = [
'name' => $menu->menu_name,
'title' => $menu->menu_name,
'path' => $menu->menu_path,
'icon' => $menu->menu_icon,
'expand' => true,
'checked' => false
];
if($menu->parent_id > 0 && $menu->menu_type != 'top'){
$parent_id[] = $menu->parent_id;
}
$menuArr = $menu->toArray();
unset($menuArr['menu_name']);
unset($menuArr['menu_path']);
unset($menuArr['menu_icon']);
return array_merge($newMenu,$menuArr);
});
$parentMenu = $menuModel->whereIn('id',$parent_id)->get();
$menusList = collect($menusList)->map(function($menu) use ($parentMenu){
$parent_id = $menu['parent_id'];
if($parent_id > 0){
$parentName = collect($parentMenu)->map(function($m) use (&$menu,$parent_id){
if($m->id == $parent_id){
$menu['parent_title'] = $m->menu_name;
}
});
}
return $menu;
});
return $menusList->toArray();
}
/**
* 获取菜单结构树
* level : all (全部) top (只显示顶部) page (只显示2级,不包括button级)
* @param $menus
* @return false|mixed
*/
public function getMenusTree($menus, $level = 'all')
{
$treeMenus = [];
collect($menus)->map(function($menu) use (&$treeMenus, $level){
if($menu['parent_id'] == -1 && 'top' == $menu['menu_type']){
$treeMenus[$menu['id']] = $menu;
$treeMenus[$menu['id']]['level'] = 0;
}else{
if('top' == $level){
return ;
}elseif('page' == $level){
if('page' == $menu['menu_type']) {
if($menu['parent_id'] == 0) {
$treeMenus[$menu['id']] = $menu;
$treeMenus[$menu['id']]['level'] = 1;
}else{
$treeMenus = $this->getChildrenTree($treeMenus,$menu);
}
}
}else{
if($menu['parent_id'] == 0) {
$treeMenus[$menu['id']] = $menu;
$treeMenus[$menu['id']]['level'] = 1;
}else{
$treeMenus = $this->getChildrenTree($treeMenus,$menu);
}
}
}
});
return array_values($treeMenus);
}
/**
* 递归树形结构菜单
* @param $treeMenus
* @param $currMenu
* @return array
*/
private function getChildrenTree($treeMenus,$currMenu) : array
{
$returnTreeMenus = collect($treeMenus)->map(function($tMenus) use ($currMenu){
if(!isset($tMenus['children']) || empty($tMenus['children'])){
if($currMenu['parent_id'] == $tMenus['id']){
$currMenu['level'] = (int)$tMenus['level'] + 1;
$tMenus['children'][] = $currMenu;
}
} // 如果有children的话,进行递归循环
else{
if($currMenu['parent_id'] == $tMenus['id']){
$currMenu['level'] = (int)$tMenus['level'] + 1;
$tMenus['children'][] = $currMenu;
}else{
$tMenus['children'] = $this->getChildrenTree($tMenus['children'],$currMenu);
}
}
return $tMenus;
});
return $returnTreeMenus->toArray();
}
}
......@@ -28,7 +28,6 @@ class RoleAndPermissionsService
public function __construct(MenusRepository $menusRepository)
{
$this->user = auth()->user();
$this->menusRepository = $menusRepository;
}
......@@ -37,7 +36,7 @@ class RoleAndPermissionsService
*/
public function getRolesToUser($user = null){
if($user == null){
$user = $this->user;
$user = auth()->user();
}
$this->getAllPermissions($user);
$role = $user->roles;
......@@ -45,7 +44,7 @@ class RoleAndPermissionsService
}
public function getUserPermissions(){
$role = $this->getAllPermissions($this->user);
$role = $this->getAllPermissions(auth()->user());
}
/**
......@@ -108,7 +107,7 @@ class RoleAndPermissionsService
*/
public function getUserRoleMenus()
{
$permissions = $this->getAllPermissions($this->user);
$permissions = $this->getAllPermissions(auth()->user());
$menuIds = collect($permissions)->map(function($permission){
if($permission instanceof \Spatie\Permission\Models\Permission){
$permission = $permission->toArray();
......@@ -129,281 +128,6 @@ class RoleAndPermissionsService
return empty($menuList) || NULL ? [] : $menuList;
}
/**
* 获取所有菜单列表
* @return array
* @throws \Psr\Container\ContainerExceptionInterface
*
* @throws \Psr\Container\NotFoundExceptionInterface
*/
public function getAllMenus()
{
$menuModel = app(Menus::class);
$allMenus = $menuModel->get();
// key_name转换
$parent_id = [];
$menusList = collect($allMenus)->map(function($menu) use (&$parent_id){
$newMenu = [
'name' => $menu->menu_name,
'title' => $menu->menu_name,
'path' => $menu->menu_path,
'icon' => $menu->menu_icon,
'expand' => true,
'checked' => false
];
if($menu->parent_id > 0 && $menu->menu_type != 'top'){
$parent_id[] = $menu->parent_id;
}
$menuArr = $menu->toArray();
unset($menuArr['menu_name']);
unset($menuArr['menu_path']);
unset($menuArr['menu_icon']);
return array_merge($newMenu,$menuArr);
});
$parentMenu = $menuModel->whereIn('id',$parent_id)->get();
$menusList = collect($menusList)->map(function($menu) use ($parentMenu){
$parent_id = $menu['parent_id'];
if($parent_id > 0){
$parentName = collect($parentMenu)->map(function($m) use (&$menu,$parent_id){
if($m->id == $parent_id){
$menu['parent_title'] = $m->menu_name;
}
});
}
return $menu;
});
return $menusList->toArray();
}
/**
* 获取菜单结构树
* level : all (全部) top (只显示顶部) page (只显示2级,不包括button级)
* @param $menus
* @return false|mixed
*/
public function getMenusTree($menus, $level = 'all')
{
$treeMenus = [];
collect($menus)->map(function($menu) use (&$treeMenus, $level){
if($menu['parent_id'] == -1 && 'top' == $menu['menu_type']){
$treeMenus[$menu['id']] = $menu;
$treeMenus[$menu['id']]['level'] = 0;
}else{
if('top' == $level){
return ;
}elseif('page' == $level){
if('page' == $menu['menu_type']) {
if($menu['parent_id'] == 0) {
$treeMenus[$menu['id']] = $menu;
$treeMenus[$menu['id']]['level'] = 1;
}else{
$treeMenus = $this->getChildrenTree($treeMenus,$menu);
}
}
}else{
if($menu['parent_id'] == 0) {
$treeMenus[$menu['id']] = $menu;
$treeMenus[$menu['id']]['level'] = 1;
}else{
$treeMenus = $this->getChildrenTree($treeMenus,$menu);
}
}
}
});
return array_values($treeMenus);
}
/**
* 递归树形结构菜单
* @param $treeMenus
* @param $currMenu
* @return array
*/
private function getChildrenTree($treeMenus,$currMenu) : array
{
$returnTreeMenus = collect($treeMenus)->map(function($tMenus) use ($currMenu){
if(!isset($tMenus['children']) || empty($tMenus['children'])){
if($currMenu['parent_id'] == $tMenus['id']){
$currMenu['level'] = (int)$tMenus['level'] + 1;
$tMenus['children'][] = $currMenu;
}
} // 如果有children的话,进行递归循环
else{
if($currMenu['parent_id'] == $tMenus['id']){
$currMenu['level'] = (int)$tMenus['level'] + 1;
$tMenus['children'][] = $currMenu;
}else{
$tMenus['children'] = $this->getChildrenTree($tMenus['children'],$currMenu);
}
}
return $tMenus;
});
return $returnTreeMenus->toArray();
}
/**
* 编辑菜单
* @param Request $request
* @return mixed
*/
public function editMenu(Request $request)
{
$params = $this->formatKeysfromArray($request->all(),'toUnderScore');
$menuModel = app(Menus::class);
$menu = $menuModel->where('id',$params['id'])->first();
if(!$menu){
throw new \LogicException('此菜单不存在!',500);
}
$parentMenu = $menuModel->where('id',$params['parent_id'])->first();
if(!$parentMenu){
throw new \LogicException('上级菜单不存在!',500);
}
if(!in_array($params['menu_type'],['top','page','button'])){
throw new \LogicException('菜单类型不正确!',500);
}
$params['menu_name'] = $params['title'];
$params['menu_path'] = $params['path'];
$params['menu_icon'] = $params['icon'];
// 根据role规则重组 user
$updateMenus = [];
collect($this->menusRepository->rules['update'])->map(function($rule,$key) use ($params, &$updateMenus){
if($key != 'id'){
$updateMenus[$key] = $params[$key];
}
});
$updateMenus['created_by'] = $this->user->id;
$result = $this->menusRepository->update($updateMenus,$params['id']);
return $result;
}
/**
* 添加子菜单
* @param $request
* @return bool
*/
public function addSubMenu($request)
{
$params = $this->formatKeysfromArray($request->all(),'toUnderScore');
$menuModel = app(Menus::class);
$parentMenu = $menuModel->where('id',$params['parent_id'])->first();
if(!$parentMenu){
throw new \LogicException('上级菜单不存在!',500);
}
if('button' == $params['type']){
$permission = Permission::query()->where(['menu_id' => 0, 'sys_default' => 1,'guard_name' => config('auth.defaults.guard'), 'action' => $params['button_type']])->first();
if(!$permission){
throw new \LogicException('按钮动作不存在!',500);
}
}
$filterParams = [];
collect($this->menusRepository->rules['create'])->map(function($rule,$key) use ($params, &$filterParams){
if(isset($params[$key]) && !empty($params[$key])){
$filterParams[$key] = $params[$key];
} else{
$filterParams[$key] = '';
}
});
$filterParams['created_by'] = $this->user->id;
$filterParams['menu_icon'] = $params['icon'];
$filterParams['component'] = $params['component'];
$filterParams['status'] = intval($params['status']);
$filterParams = collect($filterParams)->map(function($value,$key) use ($params){
if($value == ''){
switch($key){
case 'menu_name' : $value = $params['title']; break;
case 'menu_path' : $value = $params['path']; break;
case 'menu_icon' : $value = $params['icon']; break;
case 'menu_type' : $value = $params['type']; break;
case 'is_show' : $value = 1; break;
case 'sys_default' : $value = 0; break;
}
}
return $value;
});
$result = $this->menusRepository->create($filterParams->toArray());
if($result){
$permission = [];
$permission['name'] = $result['menu_name'];
$permission['menu_id'] = $result['id'];
$permission['action'] = $params['button_type'];
$permission['permission_type'] = 'menu';
$permission['sys_default'] = 0;
$permission['remark'] = $result['menu_name'].'的相关权限';
$permission['guard_name'] = config('auth.defaults.guard');
//增加对应的按钮权限
$permissionResult = Permission::create($permission);
// 如果是管理员,自动绑定赋予权限
if($this->user->isSuperAdmin()){
if($permissionResult){
$this->assignRoleAndPermissionToUser($permissionResult,$this->user);
}
}
}
return true;
}
public function deleteMenus($request)
{
$params = $this->formatKeysfromArray($request->all(),'toUnderScore');
$menuModel = app(Menus::class);
$menu_ids = explode(',',$params['ids']);
if(!$menus = $menuModel->whereIn('id',$menu_ids)->get()){
throw new \LogicException('选中的菜单不存在!',500);
}
//判断该菜单下面是否有其他子菜单
/*if($menuModel->whereIn('parent_id',$menu_ids)->get()){
throw new \LogicException('选中的菜单中有子菜单存在,无法删除该菜单。',500);
}*/
//判断选中的菜单是否已被赋予权限给到用户组
//查询该菜单对应的权限数据
$menuPermission = Permission::query()->whereIn('menu_id',$menu_ids)->get();
if($menuPermission){
$allRoles = Role::all();
if($allRoles){
$hasPermission = false;
collect($allRoles)->map(function($role) use ($menuPermission, &$hasPermission){
collect($menuPermission)->map(function($permission) use ($role, &$hasPermission){
if($role->hasPermissionTo($permission)){
$hasPermission = true ;
}
});
});
if($hasPermission){
throw new \LogicException('用户权限中已经包含该菜单权限,请先取消角色中该菜单的权限,在进行删除操作.',500);
}
//删除对应的菜单
collect($menus)->map(function($menu) use ($menuPermission){
$menu->delete();
//删除对应的菜单权限
collect($menuPermission)->map(function($permission){
$permission->delete();
});
});
}
}
}
/**
* 同步指定权限给指定用户
* @param $permission
......
......@@ -33,11 +33,10 @@ $app = new Laravel\Lumen\Application(
);
$app->withFacades();
$app->withEloquent();
//$app->register(Jenssegers\Mongodb\MongodbServiceProvider::class);
$app->withEloquent();
/*
|--------------------------------------------------------------------------
| Register Container Bindings
......@@ -104,7 +103,7 @@ $app->middleware([
]);
$app->routeMiddleware([
'superadmin' => App\Http\Middleware\Authenticate::class,
'permissions' => App\Http\Controllers\Middleware\Authenticate::class,
//'userRole' => App\Http\Middleware\UserPermissionMiddleware::class,
//'enum' => \Jiannei\Enum\Laravel\Http\Middleware\TransformEnums::class,
//'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
......
......@@ -8,5 +8,6 @@
$api = app('Dingo\Api\Routing\Router');
require __DIR__.'/../routes/api/auth.php';
require __DIR__.'/../routes/api/permissions.php';
return $app;
......@@ -13,44 +13,28 @@
$api->version('v1', function($api) {
$api->group(['namespace'=>'App\Http\V1\Auth','middleware' => ['api.auth','superadmin'], 'providers' => 'jwt'], function($api) {
$api->group(['namespace'=>'App\Http\Controllers\V1\Auth','middleware' => ['api.auth','permissions'], 'providers' => 'jwt'], function($api) {
//用户相关
$api->post('/adminapi/user/add', ['uses'=>'AuthorizationController@addUser']);
$api->post('/adminapi/user/edit', ['uses'=>'AuthorizationController@editUser']);
$api->get('/adminapi/user/info', ['uses'=>'AuthorizationController@info']);
$api->post('/adminapi/auth/resetPassword', ['uses'=>'AuthorizationController@resetPassword']);
$api->get('/adminapi/user/listByPage', ['uses'=>'AuthorizationController@listByPage']);
$api->post('/adminapi/user/disable/{id}', ['uses'=>'AuthorizationController@changeUserStatus']);
$api->post('/adminapi/user/enable/{id}', ['uses'=>'AuthorizationController@changeUserStatus']);
$api->post('/adminapi/user/delByIds', ['uses'=>'AuthorizationController@delUserByIds']);
//菜单相关
$api->get('/adminapi/permission/menu/list', ['uses'=>'AuthorizationController@getMenuList']);
$api->post('/adminapi/permission/menu/edit', ['uses'=>'AuthorizationController@editMenus']);
$api->post('/adminapi/permission/menu/sub_add', ['uses'=>'AuthorizationController@addSubMenus']);
$api->post('/adminapi/permission/menu/del', ['uses'=>'AuthorizationController@deleteMenus']);
$api->get('/adminapi/permission/menu/all', ['uses'=>'AuthorizationController@getAllMenuList']);
//用户组相关
$api->get('/adminapi/permission/role/getAllByPage', ['uses'=>'AuthorizationController@getAllByPage']);
$api->get('/adminapi/permission/role/getAllList', ['uses'=>'AuthorizationController@getAllList']);
$api->post('/adminapi/permission/role/add', ['uses'=>'AuthorizationController@addRole']);
$api->post('/adminapi/permission/role/edit', ['uses'=>'AuthorizationController@editRole']);
$api->post('/adminapi/permission/role/delByIds', ['uses'=>'AuthorizationController@delByIds']);
$api->post('/adminapi/permission/role/editRolePermission', ['uses'=>'AuthorizationController@editRolePermission']);
$api->get('/adminapi/permission/dictData/defaultButtonPermission', ['uses'=>'AuthorizationController@getDefaultButtonPermission']);
$api->post('/adminapi/user/add', ['permission' => 'user.add', 'uses'=>'AuthUserController@addUser']);
$api->post('/adminapi/user/edit', ['permission' => 'user.edit', 'uses'=>'AuthUserController@editUser']);
$api->get('/adminapi/user/info', ['permission' => 'user.info', 'uses'=>'AuthUserController@info']);
$api->post('/adminapi/auth/resetPassword', ['permission' => 'auth.reset_password', 'uses'=>'AuthUserController@resetPassword']);
$api->get('/adminapi/user/listByPage', ['permission' => 'user.list_by_page', 'uses'=>'AuthUserController@listByPage']);
$api->post('/adminapi/user/disable/{id}', ['permission' => 'user.disable', 'uses'=>'AuthUserController@changeUserStatus']);
$api->post('/adminapi/user/enable/{id}', ['permission' => 'user.enable', 'uses'=>'AuthUserController@changeUserStatus']);
$api->post('/adminapi/user/delByIds', ['permission' => 'user.del_by_ids', 'uses'=>'AuthUserController@delUserByIds']);
});
//用户登陆
$api->group(['namespace'=>'App\Http\V1\Auth'], function($api) {
$api->post('/adminapi/auth/login', ['uses'=>'AuthorizationController@login']);
$api->group(['namespace'=>'App\Http\Controllers\V1\Auth'], function($api) {
$api->post('/adminapi/auth/login', ['uses'=>'AuthUserController@login']);
});
//用户登出
$api->group(['namespace'=>'App\Http\V1\Auth','middleware' => ['superadmin']], function($api) {
$api->get('/adminapi/auth/logout', ['uses'=>'AuthorizationController@logout']);
$api->group(['namespace'=>'App\Http\Controllers\V1\Auth','middleware' => ['superadmin']], function($api) {
$api->get('/adminapi/auth/logout', ['uses'=>'AuthUserController@logout']);
});
});
......
<?php
/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It is a breeze. Simply tell Lumen the URIs it should respond to
| and give it the Closure to call when that URI is requested.
|
*/
$api->version('v1', function($api) {
$api->group(['namespace'=>'App\Http\Controllers\V1','middleware' => ['api.auth','permissions'], 'providers' => 'jwt'], function($api) {
//菜单相关
$api->get('/adminapi/permission/menu/list', ['permission' => 'permission.menu.list', 'uses'=>'PermissionsController@getMenuList']);
$api->post('/adminapi/permission/menu/edit', ['permission' => 'permission.menu.edit', 'uses'=>'PermissionsController@editMenus']);
$api->post('/adminapi/permission/menu/sub_add', ['permission' => 'permission.menu.sub_add', 'uses'=>'PermissionsController@addSubMenus']);
$api->post('/adminapi/permission/menu/del', ['permission' => 'permission.menu.del', 'uses'=>'PermissionsController@deleteMenus']);
$api->get('/adminapi/permission/menu/all', ['permission' => 'permission.menu.all', 'uses'=>'PermissionsController@getAllMenuList']);
//角色相关
$api->get('/adminapi/permission/role/getAllByPage', ['permission' => 'permission.role.get_all_by_page', 'uses'=>'PermissionsController@getAllByPage']);
$api->get('/adminapi/permission/role/getAllList', ['permission' => 'permission.role.get_all_list', 'uses'=>'PermissionsController@getAllList']);
$api->post('/adminapi/permission/role/add', ['permission' => 'permission_role_add', 'uses'=>'PermissionsController@addRole']);
$api->post('/adminapi/permission/role/edit', ['permission' => 'permission.role.edit', 'uses'=>'PermissionsController@editRole']);
$api->post('/adminapi/permission/role/delByIds', ['permission' => 'permission.role.del_by_ids', 'uses'=>'PermissionsController@delByIds']);
$api->post('/adminapi/permission/role/editRolePermission', ['permission' => 'permission.role.edit_role_permission', 'uses'=>'PermissionsController@editRolePermission']);
$api->get('/adminapi/permission/dictData/defaultButtonPermission', ['permission' => 'permission.dict_data.default_button_permission', 'uses'=>'PermissionsController@getDefaultButtonPermission']);
});
});
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment