You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

124 lines
4.2 KiB

2 weeks ago
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Teacher;
use App\Models\University;
use App\Support\ApiResponse;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class UniversityController extends Controller
{
use ApiResponse;
public function index(Request $request): JsonResponse
{
$query = University::query()->where('status', 1);
if ($kw = $request->query('keyword')) {
$query->where(function ($q) use ($kw) {
$q->where('name', 'like', "%{$kw}%")
->orWhere('city', 'like', "%{$kw}%")
->orWhere('province', 'like', "%{$kw}%")
->orWhere('latitude', 'like', "%{$kw}%")
->orWhere('longitude', 'like', "%{$kw}%");
});
}
if ($request->filled('city')) {
$query->where('city', 'like', '%'.$request->query('city').'%');
}
if ($request->filled('region')) {
$region = $request->query('region');
$query->where(function ($q) use ($region) {
$q->where('city', 'like', "%{$region}%")
->orWhere('province', 'like', "%{$region}%");
});
}
$paginator = $query
->orderBy('name')
->paginate((int) $request->query('page_size', $request->boolean('simple') ? 50 : 20))
->withQueryString();
$paginator->getCollection()->transform(fn (University $u) => $this->serialize($u));
return $this->paginated($paginator);
}
public function store(Request $request): JsonResponse
{
$data = $request->validate([
'name' => ['required', 'string', 'max:255'],
'province' => ['nullable', 'string', 'max:64'],
'city' => ['nullable', 'string', 'max:64'],
'latitude' => ['nullable', 'numeric', 'between:-90,90'],
'longitude' => ['nullable', 'numeric', 'between:-180,180'],
'address' => ['nullable', 'string', 'max:512'],
'remark' => ['nullable', 'string'],
]);
$row = University::query()->create([
'name' => $data['name'],
'province' => $data['province'] ?? null,
'city' => $data['city'] ?? null,
'latitude' => $data['latitude'] ?? null,
'longitude' => $data['longitude'] ?? null,
'address' => $data['address'] ?? null,
'remark' => $data['remark'] ?? null,
'status' => 1,
]);
return $this->ok($this->serialize($row), '已创建');
}
public function update(Request $request, int $university): JsonResponse
{
$row = University::query()->where('status', 1)->findOrFail($university);
$data = $request->validate([
'name' => ['sometimes', 'string', 'max:255'],
'province' => ['nullable', 'string', 'max:64'],
'city' => ['nullable', 'string', 'max:64'],
'latitude' => ['sometimes', 'numeric', 'between:-90,90'],
'longitude' => ['sometimes', 'numeric', 'between:-180,180'],
'address' => ['nullable', 'string', 'max:512'],
'remark' => ['nullable', 'string'],
]);
$row->fill($data);
$row->save();
return $this->ok($this->serialize($row->fresh()), '已保存');
}
public function destroy(int $university): JsonResponse
{
$row = University::query()->findOrFail($university);
if (Teacher::query()->where('university_id', $row->id)->exists()) {
return $this->fail('该高校下仍有老师,无法删除', 422);
}
$row->delete();
return $this->ok(null, '已删除');
}
/**
* @return array<string, mixed>
*/
protected function serialize(University $u): array
{
return [
'id' => $u->id,
'name' => $u->name,
'province' => $u->province,
'city' => $u->city,
'latitude' => $u->latitude !== null ? (float) $u->latitude : null,
'longitude' => $u->longitude !== null ? (float) $u->longitude : null,
'address' => $u->address,
'remark' => $u->remark,
];
}
}