| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <?php
- namespace App\Http\Controllers;
- use App\Authority;
- use App\Components\AsyncResponse;
- use App\Menu;
- use App\Services\common\BatchUpdateService;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Gate;
- class MenuController extends Controller
- {
- use AsyncResponse;
- /**
- * Display a listing of the resource.
- *
- * @return \Illuminate\View\View
- */
- public function index()
- {
- if (!Gate::allows('基础设置-菜单')){return view("exception.authority"); }
- return \view("maintenance.menu.index",["menus"=>Menu::query()->orderByRaw("level DESC,sequence")->get()]);
- }
- public function update()
- {
- $this->gate("基础设置-菜单-编辑");
- $update = [];
- $mapping = app("MenuService")->getMenuAndAuthorityMapping();
- $authorityUpdate = [];
- if (request()->has("parent_id")){
- $update["parent_id"] = request("parent_id");
- $authorityUpdate["parent_id"] = request("parent_id") ? ($mapping[request("parent_id")] ?? null) : null;
- }
- if (request()->has("level"))$update["level"] = request("level");
- if (request()->has("name")){
- $update["name"] = request("name");
- $authorityUpdate["name"] = $mapping[request("name")];
- }
- if (request()->has("font"))$update["font"] = request("font");
- if (request()->has("font_style"))$update["font_style"] = request("font_style");
- if (request()->has("route"))$update["route"] = request("route");
- if (request()->has("diff")){
- $diff = request("diff"); //此处需要查询出模型 ->get()->each()来进行update操作以确保观察者检测到 下面同理
- Menu::query()->whereIn("id",request("child"))->get()->each(function ($menu)use($diff){
- $menu->update(["level"=>DB::raw("level - {$diff}")]);
- });
- }
- if ($update){
- Menu::query()->where("id",request("id"))->first()->update($update);
- app("MenuService")->setMenu();//重建菜单缓存
- if ($authorityUpdate && ($mapping[request("id")] ?? null)){
- Authority::query()->where("id",$mapping[request("id")])->first()->update($authorityUpdate);
- app("AuthorityService")->removeAllAuth();//移除所有用户权限缓存,这将在用户下次访问时重新建立
- }
- }
- $this->success();
- }
- public function sort()
- {
- $this->gate("基础设置-菜单-编辑");
- app(BatchUpdateService::class)->batchUpdate("menus",request("update"));
- app("MenuService")->setMenu();//重建菜单缓存
- $this->success();
- }
- //菜单更新时 刷掉全部菜单权限缓存 录入时刷掉超管权限 与 附加菜单缓存
- public function save()
- {
- $id = request("id");
- $mapping = app("MenuService")->getMenuAndAuthorityMapping();
- if ($id){
- $this->gate("基础设置-菜单-编辑");
- Menu::query()->where("id",$id)->first()->update([
- "name" => request("name"),
- "route" => request("route"),
- "font" => request("font"),
- "font_style" => request("font_style"),
- ]);
- if ($mapping[$id] ?? false){
- $authority = Authority::query()->where("id",$mapping[$id])->first();
- if ($authority->name != request("name"))$authority->update(["name"=>request("name")]);
- app("AuthorityService")->removeAllAuth();
- }
- app("MenuService")->setMenu();//重建菜单缓存
- $this->success();
- }
- $this->gate("基础设置-菜单-录入");
- $menu = Menu::query()->create([
- "name" => request("name"),
- "route" => request("route"),
- "font" => request("font"),
- "font_style" => request("font_style"),
- "parent_id" => request("parent_id"),
- "level" => request("level"),
- ]);
- //增加菜单权限
- Authority::query()->create([
- 'name' => $menu->name,
- 'parent_id' => $mapping[$menu->parent_id] ?? null,
- 'alias_name' => app("MenuService")->getUniqueName($menu),
- ]);
- app("AuthorityService")->removeAdminAuth();//刷掉超管权限缓存
- app("MenuService")->appendMenu($menu);//为菜单总缓存附加
- $this->success($menu);
- }
- public function delete()
- {
- $this->gate("基础设置-菜单-删除");
- $ids = request("ids");
- $authIds = [];
- $mapping = app("MenuService")->getMenuAndAuthorityMapping();
- foreach ($ids as $id)if (isset($mapping[$id]))$authIds[] = $mapping[$id];
- Menu::query()->whereIn("id",$ids)->get()->each(function ($menu){$menu->delete();});
- app("MenuService")->setMenu();//重建菜单缓存
- if ($authIds){
- DB::table("authority_role")->whereIn("id_authority",$authIds)->delete();
- Authority::query()->whereIn("id",$authIds)->get()->each(function ($auth){$auth->delete();});
- app("AuthorityService")->removeAllAuth();//移除所有用户权限缓存,这将在用户下次访问时重新建立
- }
- $this->success();
- }
- public function get()
- {
- return app("MenuService")->getVisibleFunctionList();
- }
- }
|