MenuController.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Authority;
  4. use App\Components\AsyncResponse;
  5. use App\Menu;
  6. use App\Services\common\BatchUpdateService;
  7. use Illuminate\Support\Facades\DB;
  8. use Illuminate\Support\Facades\Gate;
  9. class MenuController extends Controller
  10. {
  11. use AsyncResponse;
  12. /**
  13. * Display a listing of the resource.
  14. *
  15. * @return \Illuminate\View\View
  16. */
  17. public function index()
  18. {
  19. if (!Gate::allows('基础设置-菜单')){return view("exception.authority"); }
  20. return \view("maintenance.menu.index",["menus"=>Menu::query()->orderByRaw("level DESC,sequence")->get()]);
  21. }
  22. public function update()
  23. {
  24. $this->gate("基础设置-菜单-编辑");
  25. $update = [];
  26. $mapping = app("MenuService")->getMenuAndAuthorityMapping();
  27. $authorityUpdate = [];
  28. if (request()->has("parent_id")){
  29. $update["parent_id"] = request("parent_id");
  30. $authorityUpdate["parent_id"] = request("parent_id") ? ($mapping[request("parent_id")] ?? null) : null;
  31. }
  32. if (request()->has("level"))$update["level"] = request("level");
  33. if (request()->has("name")){
  34. $update["name"] = request("name");
  35. $authorityUpdate["name"] = $mapping[request("name")];
  36. }
  37. if (request()->has("font"))$update["font"] = request("font");
  38. if (request()->has("font_style"))$update["font_style"] = request("font_style");
  39. if (request()->has("route"))$update["route"] = request("route");
  40. if (request()->has("diff")){
  41. $diff = request("diff"); //此处需要查询出模型 ->get()->each()来进行update操作以确保观察者检测到 下面同理
  42. Menu::query()->whereIn("id",request("child"))->get()->each(function ($menu)use($diff){
  43. $menu->update(["level"=>DB::raw("level - {$diff}")]);
  44. });
  45. }
  46. if ($update){
  47. Menu::query()->where("id",request("id"))->first()->update($update);
  48. app("MenuService")->setMenu();//重建菜单缓存
  49. if ($authorityUpdate && ($mapping[request("id")] ?? null)){
  50. Authority::query()->where("id",$mapping[request("id")])->first()->update($authorityUpdate);
  51. app("AuthorityService")->removeAllAuth();//移除所有用户权限缓存,这将在用户下次访问时重新建立
  52. }
  53. }
  54. $this->success();
  55. }
  56. public function sort()
  57. {
  58. $this->gate("基础设置-菜单-编辑");
  59. app(BatchUpdateService::class)->batchUpdate("menus",request("update"));
  60. app("MenuService")->setMenu();//重建菜单缓存
  61. $this->success();
  62. }
  63. //菜单更新时 刷掉全部菜单权限缓存 录入时刷掉超管权限 与 附加菜单缓存
  64. public function save()
  65. {
  66. $id = request("id");
  67. $mapping = app("MenuService")->getMenuAndAuthorityMapping();
  68. if ($id){
  69. $this->gate("基础设置-菜单-编辑");
  70. Menu::query()->where("id",$id)->first()->update([
  71. "name" => request("name"),
  72. "route" => request("route"),
  73. "font" => request("font"),
  74. "font_style" => request("font_style"),
  75. ]);
  76. if ($mapping[$id] ?? false){
  77. $authority = Authority::query()->where("id",$mapping[$id])->first();
  78. if ($authority->name != request("name"))$authority->update(["name"=>request("name")]);
  79. app("AuthorityService")->removeAllAuth();
  80. }
  81. app("MenuService")->setMenu();//重建菜单缓存
  82. $this->success();
  83. }
  84. $this->gate("基础设置-菜单-录入");
  85. $menu = Menu::query()->create([
  86. "name" => request("name"),
  87. "route" => request("route"),
  88. "font" => request("font"),
  89. "font_style" => request("font_style"),
  90. "parent_id" => request("parent_id"),
  91. "level" => request("level"),
  92. ]);
  93. //增加菜单权限
  94. Authority::query()->create([
  95. 'name' => $menu->name,
  96. 'parent_id' => $mapping[$menu->parent_id] ?? null,
  97. 'alias_name' => app("MenuService")->getUniqueName($menu),
  98. ]);
  99. app("AuthorityService")->removeAdminAuth();//刷掉超管权限缓存
  100. app("MenuService")->appendMenu($menu);//为菜单总缓存附加
  101. $this->success($menu);
  102. }
  103. public function delete()
  104. {
  105. $this->gate("基础设置-菜单-删除");
  106. $ids = request("ids");
  107. $authIds = [];
  108. $mapping = app("MenuService")->getMenuAndAuthorityMapping();
  109. foreach ($ids as $id)if (isset($mapping[$id]))$authIds[] = $mapping[$id];
  110. Menu::query()->whereIn("id",$ids)->get()->each(function ($menu){$menu->delete();});
  111. app("MenuService")->setMenu();//重建菜单缓存
  112. if ($authIds){
  113. DB::table("authority_role")->whereIn("id_authority",$authIds)->delete();
  114. Authority::query()->whereIn("id",$authIds)->get()->each(function ($auth){$auth->delete();});
  115. app("AuthorityService")->removeAllAuth();//移除所有用户权限缓存,这将在用户下次访问时重新建立
  116. }
  117. $this->success();
  118. }
  119. public function get()
  120. {
  121. return app("MenuService")->getVisibleFunctionList();
  122. }
  123. }