request->get('page', 1)); $limit = min(50, max(1, (int) $this->request->get('limit', 20))); $query = User::alias('u') ->leftJoin('membership_levels ml', 'u.membership_level_id = ml.id') ->field('u.id,u.username,u.email,u.nickname,u.role,u.status,u.membership_level_id,u.created_at,u.last_login_at,ml.name as membership_name') ->order('u.id', 'desc'); $total = (clone $query)->count(); $list = $query->page($page, $limit)->select(); return $this->success(['list' => $list, 'total' => $total]); } public function updateUser($id) { $input = $this->request->put(); $allowed = ['nickname', 'role', 'status', 'membership_level_id']; $data = []; foreach ($allowed as $field) { if (array_key_exists($field, $input)) { $data[$field] = $input[$field]; } } if (empty($data)) { return $this->error('无更新内容'); } User::where('id', $id)->update($data); return $this->success(null, '更新成功'); } public function conversations() { $page = max(1, (int) $this->request->get('page', 1)); $limit = min(50, max(1, (int) $this->request->get('limit', 20))); $userId = $this->request->get('user_id'); $query = ConversationModel::alias('c') ->join('users u', 'c.user_id = u.id') ->whereNull('c.deleted_at') ->field('c.*,u.username,u.email') ->order('c.updated_at', 'desc'); if ($userId) { $query->where('c.user_id', $userId); } return $this->success($query->page($page, $limit)->select()); } public function stats() { return $this->success([ 'users' => User::count(), 'conversations' => ConversationModel::whereNull('deleted_at')->count(), 'messages' => Message::count(), 'today_messages' => (int) UserDailyStat::where('stat_date', date('Y-m-d'))->sum('message_count'), ]); } public function settings() { $rows = SystemSetting::select(); $settings = []; foreach ($rows as $row) { $decoded = json_decode($row->setting_value, true); $settings[$row->setting_key] = [ 'value' => json_last_error() === JSON_ERROR_NONE ? $decoded : $row->setting_value, 'description' => $row->description, ]; } return $this->success($settings); } public function updateSettings() { $input = $this->request->put(); foreach ($input as $key => $value) { SettingsService::set($key, $value); } return $this->success(null, '设置已更新'); } public function models() { $list = AiModel::field('id,name,model_id,api_base_url,max_tokens,temperature,is_default,enabled,sort_order') ->order('sort_order') ->select(); return $this->success($list); } public function createModel() { $input = $this->request->post(); $model = AiModel::create([ 'name' => $input['name'], 'model_id' => $input['model_id'], 'api_base_url' => $input['api_base_url'] ?? 'https://api.openai.com/v1', 'api_key' => $input['api_key'], 'max_tokens' => $input['max_tokens'] ?? 4096, 'temperature' => $input['temperature'] ?? 0.7, 'is_default' => (int) ($input['is_default'] ?? 0), 'enabled' => (int) ($input['enabled'] ?? 1), 'sort_order' => $input['sort_order'] ?? 0, ]); if (!empty($input['is_default'])) { AiModel::where('id', '<>', $model->id)->update(['is_default' => 0]); } return $this->success(['id' => $model->id], '创建成功'); } public function updateModel($id) { $input = $this->request->put(); $allowed = ['name', 'model_id', 'api_base_url', 'api_key', 'max_tokens', 'temperature', 'is_default', 'enabled', 'sort_order']; $data = []; foreach ($allowed as $field) { if (array_key_exists($field, $input)) { $data[$field] = $input[$field]; } } if (empty($data)) { return $this->error('无更新内容'); } AiModel::where('id', $id)->update($data); if (!empty($input['is_default'])) { AiModel::where('id', '<>', $id)->update(['is_default' => 0]); } return $this->success(null, '更新成功'); } public function deleteModel($id) { AiModel::destroy($id); return $this->success(null, '删除成功'); } public function memberships() { $levels = MembershipLevel::order('sort_order')->select(); return $this->success($levels); } public function updateMembership($id) { $input = $this->request->put(); $data = []; foreach (['name', 'max_conversations', 'max_messages_per_day', 'max_upload_size_mb', 'sort_order'] as $field) { if (isset($input[$field])) { $data[$field] = $input[$field]; } } if (isset($input['permissions'])) { $data['permissions'] = $input['permissions']; } if (isset($input['allowed_models'])) { $data['allowed_models'] = $input['allowed_models']; } if (empty($data)) { return $this->error('无更新内容'); } MembershipLevel::where('id', $id)->update($data); return $this->success(null, '更新成功'); } }