[ 'name' => '主页', 'icon' => 'line-md:home-twotone-alt', 'uri' => '/dashboard', 'is_home' => 1, 'children' => [ 'cockpit' => '驾驶舱', ], 'order' => 1, ], /* |-------------------------------------------------------------------------- | 门店管理 |-------------------------------------------------------------------------- */ 'store' => [ 'name' => '门店管理', 'icon' => 'material-symbols:store-outline', 'uri' => '/store', 'order' =>2, 'children' => [ 'stores' => [ 'name' => '门店列表', 'icon' => 'ic:outline-storefront', 'uri' => '/store/stores', 'resource' => true, 'order' => 1, ], 'employees' => [ 'name' => '店员管理', 'icon' => 'ic:baseline-people-outline', 'uri' => '/store/employees', 'resource' => ['list', 'create', 'delete'], 'order' => 2, ], 'categories' => [ 'name' => '门店分类', 'icon' => 'tabler:category', 'uri' => '/store/categories?parent_key=store_category', 'resource' => true, 'order' => 3, ], 'levels' => [ 'name' => '门店等级', 'icon' => 'carbon:skill-level', 'uri' => '/store/levels?parent_key=store_level', 'resource' => true, 'order' => 4, ], 'business' => [ 'name' => '经营类别', 'icon' => 'mingcute:certificate-line', 'uri' => '/store/business?parent_key=store_business', 'resource' => true, 'order' => 5, ], 'devices' => [ 'name' => '彩票机管理', 'icon' => 'streamline:money-cashier-shop-shopping-pay-payment-cashier-store-cash-register-machine', 'uri' => '/store/devices', 'resource' => true, 'order' => 6, ], 'lottery-types' => [ 'name' => '彩种类型', 'icon' => 'mingcute:sunflower-line', 'uri' => '/store/lottery-types?parent_key=lottery_type', 'resource' => true, 'order' => 7, ], 'store-profit-ratio-logs' => [ 'name' => '佣金比例日志', 'icon' => 'mingcute:document-3-line', 'uri' => '/store/store-profit-ratio-logs', 'resource' => ['list'], 'order' => 9, ], ], ], /* |-------------------------------------------------------------------------- | 人事管理 |-------------------------------------------------------------------------- */ 'hr' => [ 'name' => '人事管理', 'icon' => 'material-symbols:deployed-code-account-outline', 'uri' => '/hr', 'order' => 3, 'children' => [ 'employees' => [ 'name' => '员工管理', 'icon' => 'material-symbols:user-attributes-outline', 'uri' => '/hr/employees', 'resource' => true, 'children' => [ 'leave' => '离职', ], 'order' => 1, ], 'jobs' => [ 'name' => '职位管理', 'icon' => 'material-symbols:frame-person-outline-sharp', 'uri' => '/hr/jobs?parent_key=job', 'resource' => true, 'order' => 2, ], 'rests' => [ 'name' => '休息日管理', 'icon' => 'material-symbols-light:timelapse-outline-rounded', 'uri' => '/hr/rests', 'resource' => ['list', 'create', 'delete'], 'order' => 3, ], 'signs' => [ 'name' => '考勤打卡', 'icon' => 'material-symbols:calendar-clock-outline', 'uri' => '/hr/signs', 'resource' => ['list', 'view', 'delete'], 'order' => 4, ], 'repairs' => [ 'name' => '补卡申请', 'icon' => 'mdi:table-clock', 'uri' => '/hr/repairs', 'resource' => true, 'order' => 5, ], 'holiday' => [ 'name' => '请假申请', 'icon' => 'ic:outline-more-time', 'uri' => '/hr/holiday', 'resource' => true, 'order' => 6, ], 'overtime' => [ 'name' => '加班申请', 'icon' => 'ic:round-add-alarm', 'uri' => '/hr/overtime', 'resource' => true, 'order' => 7, ], 'business' => [ 'name' => '出差报备', 'icon' => 'material-symbols:car-tag-outline', 'uri' => '/hr/business', 'resource' => true, 'order' => 8, ], 'promotion' => [ 'name' => '升职申请', 'icon' => 'fluent:people-star-32-regular', 'uri' => '/hr/promotion', 'resource' => true, 'order' => 9, ], ], ], /* |-------------------------------------------------------------------------- | 计划任务 |-------------------------------------------------------------------------- */ 'plan' => [ 'name' => '任务计划', 'icon' => 'mingcute:send-plane-line', 'uri' => '/plan', 'order' => 4, 'children' => [ 'plans' => [ 'name' => '任务计划', 'icon' => 'tdesign:task', 'uri' => '/plan/plans', 'resource' => true, 'children' => [ 'publish' => '发布', 'task_create' => '创建任务', 'task_view' => '查看任务', 'task_update' => '编辑任务', 'task_delete' => '删除任务', ], ], 'calendars' => [ 'name' => '任务日程', 'icon' => 'material-symbols:calendar-month-outline', 'uri' => '/plan/calendars', 'resource' => false, 'children' => [ 'index' => '任务日程', ], ], ], ], /* |-------------------------------------------------------------------------- | 投诉意见 |-------------------------------------------------------------------------- */ 'complaint' => [ 'name' => '投诉意见', 'icon' => 'mdi:star-four-points-box-outline', 'uri' => '/complaint', 'order' => 5, 'children' => [ 'complaints' => [ 'name' => '举报投诉', 'icon' => 'pixelarticons:list-box', 'uri' => '/complaint/complaints', 'resource' => ['list', 'view'], 'children' => [ 'start' => '开始', 'complete' => '完成', ], ], 'feedback' => [ 'name' => '意见箱', 'icon' => 'tabler:box', 'uri' => '/complaint/feedback', 'resource' => ['list', 'delete'], 'children' => [], ], ], ], /* |-------------------------------------------------------------------------- | 财务报表 |-------------------------------------------------------------------------- */ 'finance' => [ 'name' => '财务报表', 'icon' => 'material-symbols:finance-mode', 'uri' => '/finance', 'order' => 6, 'children' => [ 'ledgers' => [ 'name' => '上报数据', 'icon' => 'mdi:database', 'uri' => '/finance/ledgers', 'resource' => ['list', 'update', 'view'], 'children' => [ 'update_ledger_amount' => '编辑总账金额', ], ], 'commission_incomes' => [ 'name' => '佣金收入', 'icon' => 'ri:money-cny-circle-line', 'uri' => '/finance/commission-incomes', 'resource' => false, 'children' => [ 'index' => '佣金收入', ], ], 'reimbursements' => [ 'name' => '收支报销', 'icon' => 'ri:money-cny-circle-fill', 'uri' => '/finance/reimbursements', 'resource' => ['list', 'view'], 'children' => [], ], 'sales_statistics' => [ 'name' => '销售统计', 'icon' => 'ri:bar-chart-2-line', 'uri' => '/finance/sales-statistics', 'resource' => false, 'children' => [ 'index' => '销售统计', ], ], 'store_statistics' => [ 'name' => '门店统计', 'icon' => 'material-symbols:store-rounded', 'uri' => '/finance/store-statistics', 'resource' => false, 'children' => [ 'index' => '门店统计', ], ], 'store_master_commissions' => [ 'name' => '店长提成', 'icon' => 'icon-park-outline:paper-money', 'uri' => '/finance/store-master-commissions', 'resource' => true, 'children' => [], ], ], ], 'train' => [ 'name' => '培训管理', 'icon' => 'solar:people-nearby-broken', 'uri' => '/train', 'order' => 7, 'children' => [ 'books' => [ 'name' => '课件管理', 'icon' => 'material-symbols:library-books-outline-rounded', 'uri' => '/train/books', 'resource' => true, ], 'questions' => [ 'name' => '题库管理', 'icon' => 'ph:books-duotone', 'uri' => '/train/questions', 'resource' => true, ], 'examinations' => [ 'name' => '考试管理', 'icon' => 'material-symbols:checkbook-outline', 'uri' => '/train/examinations', 'resource' => true, 'children' => [ 'publish' => '生成考卷', 'cancel' => '取消考试', ] ], 'papers' => [ 'name' => '考试结果', 'icon' => 'icon-park-outline:upload-logs', 'uri' => '/train/papers', 'resource' => ['list', 'view'] ], ] ], 'agreement' => [ 'name' => '合同管理', 'icon' => 'flowbite:inbox-full-outline', 'uri' => '/agreement', 'resource' => true, 'children' => [ 'download' => '打包下载', ] ], 'app_versions' => [ 'name' => 'App版本管理', 'icon' => 'ic:twotone-app-shortcut', 'uri' => '/app-versions', 'resource' => true, 'children' => [] ], /* |-------------------------------------------------------------------------- | 系统管理 |-------------------------------------------------------------------------- */ 'system' => [ 'name' => '系统管理', 'icon' => 'material-symbols:settings-outline', 'uri' => '/system', 'children' => [ 'admin_users' => [ 'name' => '账号管理', 'icon' => 'ph:user-gear', 'uri' => '/system/admin_users', 'resource' => ['list', 'update'], 'children' => ['change_password' => '修改密码'], ], 'admin_roles' => [ 'name' => '角色管理', 'icon' => 'carbon:user-role', 'uri' => '/system/admin_roles', 'resource' => ['list', 'create', 'update', 'delete'], 'children' => [ 'set_menus' => '设置菜单', 'set_permissions' => '设置权限', ], ], 'admin_permissions' => [ 'name' => '权限管理', 'icon' => 'fluent-mdl2:permissions', 'uri' => '/system/admin_permissions', 'resource' => ['list', 'create', 'update', 'delete'], 'children' => [], ], 'admin_menus' => [ 'name' => '菜单管理', 'icon' => 'ant-design:menu-unfold-outlined', 'uri' => '/system/admin_menus', 'resource' => ['list', 'create', 'update', 'delete'], 'children' => [], ], 'settings' => [ 'name' => '系统设置', 'icon' => 'akar-icons:settings-horizontal', 'uri' => '/system/settings', 'resource' => true, 'children' => [], ], 'keywords' => [ 'name' => '数据字典', 'icon' => 'ph:codesandbox-logo-light', 'uri' => '/system/keywords', 'resource' => ['list', 'create', 'update', 'delete'], 'children' => [], ], 'workflows' => [ 'name' => '审核流程', 'icon' => 'carbon:flow-data', 'uri' => '/system/workflows', 'resource' => true, ], ], ], ]; $this->handleAdminMenus($data); $this->handleAdminPermissions($data); } public function handleAdminMenus(array $data, ?AdminMenu $parent = null): void { $sort = 0; foreach ($data as $slug => $node) { if (! is_array($node) || ! array_key_exists('uri', $node)) { continue; } $sort++; /** @var \Slowlyo\OwlAdmin\Models\AdminMenu */ $menu = AdminMenu::updateOrCreate([ 'slug' => ($parent->slug ?? 'admin').'.'.$slug, ], [ 'parent_id' => $parent->id ?? 0, 'order' => $sort, 'title' => $node['name'], 'icon' => $node['icon'], 'url' => $node['uri'], 'url_type' => $node['uri_type'] ?? 1, 'visible' => $node['visible'] ?? 1, 'is_home' => $node['is_home'] ?? 0, 'is_full' => $node['is_full'] ?? 0, ]); $this->handleAdminMenus($node['children'] ?? [], $menu); } } protected function handleAdminPermissions(array $data, ?AdminPermission $parent = null) { foreach ($data as $slug => $node) { $permission = AdminPermission::updateOrCreate([ 'slug' => ($parent->slug ?? 'admin').'.'.$slug, ], [ 'parent_id' => $parent->id ?? 0, 'name' => is_array($node) ? $node['name'] : $node, ]); if (! is_array($node)) { continue; } // 资源路由权限 if (array_key_exists('resource', $node)) { $resourceAbilities = []; if (is_array($node['resource'])) { $resourceAbilities = $node['resource']; } elseif ($node['resource'] === true) { $resourceAbilities = array_keys($this->resourceAbilityMap()); } foreach ($resourceAbilities as $resourceAbility) { AdminPermission::updateOrCreate([ 'slug' => $permission->slug.'.'.$resourceAbility, ], [ 'parent_id' => $permission->id, 'name' => $this->resourceAbilityMap()[$resourceAbility], ]); } } $this->handleAdminPermissions($node['children'] ?? [], $permission); } } protected function resourceAbilityMap(): array { return [ 'list' => '列表', 'create' => '新增', 'update' => '编辑', 'delete' => '删除', 'view' => '查看', ]; } }