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
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,
|
||
|
|
];
|
||
|
|
}
|
||
|
|
}
|