2026_11_11_140000_add_simulation_admin_menus.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php
  2. use Illuminate\Database\Migrations\Migration;
  3. use Illuminate\Support\Facades\DB;
  4. use Illuminate\Support\Facades\Schema;
  5. /**
  6. * 模拟管理菜单及按钮权限。菜单 uri 等于后台前端的路由 name;按钮 uri 等于接口路径(或路由指定的 permission_uri)。
  7. * 每个写接口都有按钮行:没有按钮行的接口不做角色校验。
  8. */
  9. return new class extends Migration {
  10. private const PARENT = 'SimulationManagement';
  11. /** 菜单 uri => [标题, [按钮 uri => 标题]] */
  12. private const MENUS = [
  13. 'SimulationOverview' => ['模拟概览', ['admin/simulation/overview' => '查看']],
  14. 'SimulationMembers' => ['模拟会员', ['admin/simulation/members' => '查看', 'admin/simulation/members/create' => '创建会员',
  15. 'admin/simulation/members/banned' => '封禁/解封', 'admin/simulation/members/login' => '模拟登录', 'admin/simulation/members/logout' => '模拟退出']],
  16. 'SimulationFunds' => ['模拟资金', ['admin/simulation/funds' => '查看', 'admin/simulation/funds/recharge' => '模拟充值',
  17. 'admin/simulation/funds/withdraw' => '模拟提现', 'admin/simulation/funds/withdraw/audit' => '提现审核', 'admin/simulation/funds/adjust' => '人工调账',
  18. 'admin/simulation/funds/freeze' => '冻结', 'admin/simulation/funds/unfreeze' => '解冻']],
  19. 'SimulationBets' => ['模拟注单', ['admin/simulation/bets' => '查看', 'admin/simulation/bets/lottery' => '彩票下注', 'admin/simulation/bets/sport' => '体育下注', 'admin/simulation/bets/third' => '第三方游戏下注',
  20. 'admin/simulation/bets/sport/settle' => '体育结算', 'admin/simulation/bets/sport/cancel' => '体育撤单']],
  21. 'SimulationTasks' => ['自动任务', ['admin/simulation/tasks' => '查看', 'admin/simulation/tasks/templates' => '保存模板',
  22. 'admin/simulation/tasks/templates/delete' => '删除模板', 'admin/simulation/tasks/runs' => '启动任务', 'admin/simulation/tasks/quick-start' => '一键启动', 'admin/simulation/tasks/runs/status' => '暂停/继续/停止']],
  23. 'SimulationReports' => ['模拟报表', ['admin/simulation/reports' => '查看', 'admin/simulation/reports/refresh' => '立即刷新']],
  24. 'SimulationLogs' => ['操作日志', ['admin/simulation/logs' => '查看']],
  25. 'SimulationSettings' => ['模拟设置', ['admin/simulation/settings' => '查看', 'admin/simulation/settings/save' => '保存设置', 'admin/simulation/reset' => '重置模拟数据']],
  26. ];
  27. public function up(): void
  28. {
  29. if (!Schema::hasTable('menus')) return;
  30. $parentId = $this->upsert(self::PARENT, ['parent_id' => 0, 'title' => '模拟管理', 'type' => 1, 'sort' => 99, 'permission_name' => 'simulation']);
  31. $sort = 0;
  32. foreach (self::MENUS as $uri => [$title, $buttons]) {
  33. $menuId = $this->upsert($uri, ['parent_id' => $parentId, 'title' => $title, 'type' => 1, 'sort' => $sort++, 'permission_name' => 'simulation.' . $uri]);
  34. $order = 0;
  35. foreach ($buttons as $buttonUri => $buttonTitle) {
  36. $this->upsert($buttonUri, ['parent_id' => $menuId, 'title' => $title . '-' . $buttonTitle, 'type' => 2, 'sort' => $order++,
  37. 'permission_name' => str_replace('/', '.', $buttonUri)]);
  38. }
  39. }
  40. }
  41. private function upsert(string $uri, array $values): int
  42. {
  43. $now = date('Y-m-d H:i:s');
  44. $existing = DB::table('menus')->where('uri', $uri)->first(['id']);
  45. if ($existing) {
  46. DB::table('menus')->where('id', $existing->id)->update($values + ['status' => 1, 'updated_at' => $now]);
  47. return (int) $existing->id;
  48. }
  49. return (int) DB::table('menus')->insertGetId($values + ['uri' => $uri, 'icon' => null, 'status' => 1, 'created_at' => $now, 'updated_at' => $now]);
  50. }
  51. public function down(): void
  52. {
  53. if (!Schema::hasTable('menus')) return;
  54. $uris = [self::PARENT];
  55. foreach (self::MENUS as $uri => [, $buttons]) $uris = array_merge($uris, [$uri], array_keys($buttons));
  56. $ids = DB::table('menus')->whereIn('uri', $uris)->pluck('id');
  57. if (Schema::hasTable('role_menu')) DB::table('role_menu')->whereIn('menu_id', $ids)->delete();
  58. DB::table('menus')->whereIn('id', $ids)->delete();
  59. }
  60. };