accessService()->bootstrapDefaults(); return api_success([ 'cards' => [ [ 'title' => '管理员数量', 'value' => (int)Db::name('admin_users')->count(), 'desc' => '当前后台管理员账号总数', ], [ 'title' => '启用角色', 'value' => (int)Db::name('admin_roles')->where('status', 'enabled')->count(), 'desc' => '当前启用中的角色数量', ], [ 'title' => '权限点', 'value' => (int)Db::name('admin_permissions')->count(), 'desc' => '后台模块当前可分配的权限点数量', ], [ 'title' => '角色授权', 'value' => (int)Db::name('admin_role_permissions')->count(), 'desc' => '角色与权限的关联配置总数', ], ], ]); } public function admins(Request $request) { $this->accessService()->bootstrapDefaults(); $rows = Db::name('admin_users') ->order('id', 'desc') ->select() ->toArray(); $list = array_map(function (array $item) { $roleIds = Db::name('admin_role_relations')->where('admin_user_id', $item['id'])->column('role_id'); $roles = $roleIds ? Db::name('admin_roles')->whereIn('id', $roleIds)->column('name') : []; return [ 'id' => (int)$item['id'], 'name' => $item['name'], 'mobile' => $item['mobile'], 'email' => $item['email'], 'status' => $item['status'], 'status_text' => $this->accessService()->statusText($item['status']), 'role_ids' => array_map('intval', $roleIds), 'role_names' => array_values($roles), 'last_login_at' => $item['last_login_at'], 'created_at' => $item['created_at'], ]; }, $rows); return api_success(['list' => $list]); } public function roles(Request $request) { $this->accessService()->bootstrapDefaults(); $rows = Db::name('admin_roles') ->order('id', 'asc') ->select() ->toArray(); $list = array_map(function (array $item) { $permissionIds = Db::name('admin_role_permissions')->where('role_id', $item['id'])->column('permission_id'); $permissions = $permissionIds ? Db::name('admin_permissions')->whereIn('id', $permissionIds)->column('name') : []; return [ 'id' => (int)$item['id'], 'name' => $item['name'], 'code' => $item['code'], 'status' => $item['status'], 'status_text' => $this->accessService()->statusText($item['status']), 'permission_ids' => array_map('intval', $permissionIds), 'permission_names' => array_values($permissions), 'admin_count' => (int)Db::name('admin_role_relations')->where('role_id', $item['id'])->count(), 'created_at' => $item['created_at'], ]; }, $rows); return api_success(['list' => $list]); } public function permissions(Request $request) { $this->accessService()->bootstrapDefaults(); $rows = Db::name('admin_permissions') ->order('module', 'asc') ->order('id', 'asc') ->select() ->toArray(); return api_success([ 'list' => array_map(fn (array $item) => [ 'id' => (int)$item['id'], 'name' => $item['name'], 'code' => $item['code'], 'module' => $item['module'], 'action' => $item['action'], 'module_text' => $this->accessService()->moduleText($item['module']), ], $rows), ]); } public function saveAdmin(Request $request) { $this->accessService()->bootstrapDefaults(); $id = (int)$request->input('id', 0); $name = trim((string)$request->input('name', '')); $mobile = trim((string)$request->input('mobile', '')); $email = trim((string)$request->input('email', '')); $password = trim((string)$request->input('password', '')); $status = trim((string)$request->input('status', 'enabled')); $roleIds = $this->normalizeIds((array)$request->input('role_ids', [])); if ($name === '' || $mobile === '') { return api_error('管理员姓名和手机号不能为空', 422); } $now = date('Y-m-d H:i:s'); Db::startTrans(); try { if ($id > 0) { $admin = Db::name('admin_users')->where('id', $id)->find(); if (!$admin) { Db::rollback(); return api_error('管理员不存在', 404); } $exists = Db::name('admin_users') ->where('mobile', $mobile) ->where('id', '<>', $id) ->find(); if ($exists) { Db::rollback(); return api_error('管理员手机号已存在', 422); } Db::name('admin_users')->where('id', $id)->update([ 'name' => $name, 'mobile' => $mobile, 'email' => $email, 'password' => $password !== '' ? password_hash($password, PASSWORD_BCRYPT) : $admin['password'], 'status' => $status !== '' ? $status : 'enabled', 'updated_at' => $now, ]); $adminId = $id; } else { $exists = Db::name('admin_users')->where('mobile', $mobile)->find(); if ($exists) { Db::rollback(); return api_error('管理员手机号已存在', 422); } $adminId = (int)Db::name('admin_users')->insertGetId([ 'name' => $name, 'mobile' => $mobile, 'email' => $email, 'password' => password_hash($password !== '' ? $password : 'Admin@123456', PASSWORD_BCRYPT), 'status' => $status !== '' ? $status : 'enabled', 'last_login_at' => null, 'created_at' => $now, 'updated_at' => $now, ]); } Db::name('admin_role_relations')->where('admin_user_id', $adminId)->delete(); foreach ($roleIds as $roleId) { Db::name('admin_role_relations')->insert([ 'admin_user_id' => $adminId, 'role_id' => $roleId, 'created_at' => $now, ]); } Db::commit(); } catch (\Throwable $e) { Db::rollback(); return api_error('管理员保存失败', 500, [ 'detail' => $e->getMessage(), ]); } return api_success(['id' => $adminId], '管理员已保存'); } public function saveRole(Request $request) { $this->accessService()->bootstrapDefaults(); $id = (int)$request->input('id', 0); $name = trim((string)$request->input('name', '')); $code = trim((string)$request->input('code', '')); $status = trim((string)$request->input('status', 'enabled')); $permissionIds = $this->normalizeIds((array)$request->input('permission_ids', [])); if ($name === '' || $code === '') { return api_error('角色名称和编码不能为空', 422); } $now = date('Y-m-d H:i:s'); Db::startTrans(); try { if ($id > 0) { $role = Db::name('admin_roles')->where('id', $id)->find(); if (!$role) { Db::rollback(); return api_error('角色不存在', 404); } $exists = Db::name('admin_roles') ->where('code', $code) ->where('id', '<>', $id) ->find(); if ($exists) { Db::rollback(); return api_error('角色编码已存在', 422); } Db::name('admin_roles')->where('id', $id)->update([ 'name' => $name, 'code' => $code, 'status' => $status !== '' ? $status : 'enabled', 'updated_at' => $now, ]); $roleId = $id; } else { $exists = Db::name('admin_roles')->where('code', $code)->find(); if ($exists) { Db::rollback(); return api_error('角色编码已存在', 422); } $roleId = (int)Db::name('admin_roles')->insertGetId([ 'name' => $name, 'code' => $code, 'status' => $status !== '' ? $status : 'enabled', 'created_at' => $now, 'updated_at' => $now, ]); } Db::name('admin_role_permissions')->where('role_id', $roleId)->delete(); foreach ($permissionIds as $permissionId) { Db::name('admin_role_permissions')->insert([ 'role_id' => $roleId, 'permission_id' => $permissionId, 'created_at' => $now, ]); } Db::commit(); } catch (\Throwable $e) { Db::rollback(); return api_error('角色保存失败', 500, [ 'detail' => $e->getMessage(), ]); } return api_success(['id' => $roleId], '角色已保存'); } private function normalizeIds(array $values): array { return array_values(array_unique(array_filter(array_map('intval', $values), fn (int $item) => $item > 0))); } private function accessService(): AdminAccessService { return new AdminAccessService(); } }