liutk 2026-02-21 21:45:07 +08:00
parent c77fed7b65
commit e9d9633f42
7 changed files with 140 additions and 4 deletions

View File

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Traits\PaginatorTrait;
use App\Models\Ad;
use App\Models\Filters\AdFilter;
use App\Http\Resources\AdResource;
class AdController extends Controller
{
use PaginatorTrait;
public function index(Request $request){
$query = Ad::filter($request->all(), AdFilter::class)->sort();
$list = $query->paginate($this->resolvePerPage('per_page', 20));
return $this->json(AdResource::collection($list));
}
}

View File

@ -2,11 +2,13 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Traits\JsonResponse;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController; use Illuminate\Routing\Controller as BaseController;
class Controller extends BaseController class Controller extends BaseController
{ {
use AuthorizesRequests, ValidatesRequests; use AuthorizesRequests, DispatchesJobs, ValidatesRequests, JsonResponse;
} }

View File

@ -0,0 +1,22 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class AdResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
return [
'resource_url' => $this->resource_url,
'jump_type' => $this->jump_type,
'jump_config' => $this->jump_config,
];
}
}

View File

@ -49,8 +49,8 @@ class Ad extends Model
{ {
return [ return [
self::TYPE_WEB => '网页跳转', self::TYPE_WEB => '网页跳转',
self::TYPE_APP => '应用跳转', // self::TYPE_APP => '应用跳转',
self::TYPE_MINI => '小程序跳转', // self::TYPE_MINI => '小程序跳转',
self::TYPE_OFF => '无跳转', self::TYPE_OFF => '无跳转',
]; ];
} }

View File

@ -0,0 +1,57 @@
<?php
namespace App\Traits;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
use Illuminate\Support\Facades\Auth;
trait JsonResponse
{
public function json($data, $code = 200, $message = '')
{
$meta = null;
if ($data instanceof AnonymousResourceCollection) {
$resource = $data->resource;
if ($resource instanceof LengthAwarePaginator) {
$meta = [
'current_page' => $resource->currentPage(),
'last_page' => $resource->lastPage(),
'per_page' => $resource->perPage(),
'total' => $resource->total(),
];
}
}
$result = ['data' => $data, 'code' => $code, 'message' => $message];
if ($meta) {
$result['meta'] = $meta;
}
return response()->json($result);
}
public function success($message = '', $data = null)
{
return $this->json($data, 200, $message);
}
public function error($message = '', $code = 400, $data = null)
{
return $this->json($data, $code, $message);
}
public function include($include = [], $key = 'include')
{
$request = request();
if ($request->filled($key)) {
$include1 = $request->input($key);
$include1 = is_array($include1) ? $include1 : explode(',', $include1);
$include = array_merge($include, $include1);
}
return $include;
}
protected function user($guard = null)
{
return Auth::guard($guard)->user();
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace App\Traits;
trait PaginatorTrait
{
/**
* 解析每页显示的条数
*
* @param string $perPageName
* @param int $default
* @param int|null $max
* @return int
*/
public function resolvePerPage(string $perPageName = 'per_page', int $default = 20, ?int $max = null): int
{
$perPage = (int) request()->input($perPageName);
if ($perPage >= 1) {
if ($max !== null && $max >= 1 && $perPage >= $max) {
return $max;
}
return $perPage;
}
return $default;
}
}

View File

@ -17,3 +17,7 @@ use Illuminate\Support\Facades\Route;
Route::middleware('auth:sanctum')->get('/user', function (Request $request) { Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user(); return $request->user();
}); });
Route::middleware('api')->group(function () {
Route::get('/ads', [App\Http\Controllers\Api\AdController::class, 'index']);
});