diff --git a/app/Http/Controllers/Admin/ParkingCameraController.php b/app/Http/Controllers/Admin/ParkingCameraController.php new file mode 100644 index 0000000..0b2529a --- /dev/null +++ b/app/Http/Controllers/Admin/ParkingCameraController.php @@ -0,0 +1,343 @@ +service = $service; + } + + public function index(Request $request): JsonResponse + { + try { + $query = ParkingCamera::query(); + + if ($request->has('floor_id')) { + $floor_id = $request->input('floor_id'); + if ($floor_id) { + $query->where('floor_id', $floor_id); + } + } + + if ($request->has('number')) { + $number = $request->input('number'); + if ($number) { + $query->where('number', 'like', "%{$number}%"); + } + } + + if ($request->has('parking_space_number')) { + $parking_space_number = $request->input('parking_space_number'); + if ($parking_space_number) { + $cameraIds = ParkingSpaceCamera::getCameraIds( + $parking_space_number + ); + if ($cameraIds) { + $query->whereIn('id', $cameraIds); + } else { + $query->where('id', 0); + } + } + } + + if ($request->has('camera_ip')) { + $camera_ip = $request->input('camera_ip'); + if ($camera_ip) { + $query->where('camera_ip', $camera_ip); + } + } + + if ($request->has('status')) { + $status = $request->input('status'); + if (is_numeric($status)) { + $query->where('status', $status); + } + } + + // 分页 + $page = $request->input('page', 1); + $perPage = $request->input('per_page', 10); + + $columns = [ + 'id', + 'floor_id', + 'number', + 'camera_ip', + 'is_control_lights', + 'type', + 'status', + 'updated_at' + ]; + $isArr = ParkingCameraService::getIsControlLights(); + $typeArr = ParkingCameraService::getType(); + $statusArr = ParkingCameraService::getStatus(); + $total = $query->count(); + $items = $query->latest()->forPage($page, $perPage)->select( + $columns + )->get() + ->each( + function ($item) use ($isArr, $typeArr, $statusArr) { + $item['floor'] = AdminFloor::getName($item['floor_id']); + $item['parking_space_count'] + = ParkingSpaceCamera::getSpaceCount($item['id']); + $item['parking_space_numbers'] + = ParkingSpaceCamera::getParkingSpaceNumber( + $item['id'] + ); + $item['is_control_lights'] + = $isArr[$item['is_control_lights']] ?? ''; + $item['type'] = $typeArr[$item['type']] ?? ''; + $item['status'] = $statusArr[$item['status']] ?? ''; + unset($item['floor_id']); + } + ); + + return $this->responseService->success([ + 'items' => $items, + 'total' => $total, + 'page' => $page, + 'per_page' => $perPage, + 'last_page' => ceil($total / $perPage), + ]); + } catch (Exception $e) { + $m_prefix = __('exception.exception_handler.resource'); + return $this->responseService->systemError( + $m_prefix . ':' . $e->getMessage() + ); + } + } + + public function search(): JsonResponse + { + try { + $data = [ + 'floor_list' => $this->getFloorList(), + 'status_list' => get_select_data(ParkingCameraService::getStatus(), true) + ]; + return $this->responseService->success($data); + } catch (Exception $e) { + $m_prefix = __('exception.exception_handler.resource'); + return $this->responseService->systemError( + $m_prefix . ':' . $e->getMessage() + ); + } + } + + public function create(): JsonResponse + { + try { + $data = $this->getViewData(); + return $this->responseService->success($data); + } catch (Exception $e) { + $m_prefix = __('exception.exception_handler.resource'); + return $this->responseService->systemError( + $m_prefix . ':' . $e->getMessage() + ); + } + } + + #[ArrayShape(['floor_list' => "array", 'attr_list' => "array"])] + private function getViewData(): array + { + return [ + 'floor_list' => $this->getFloorList(), + 'attr_list' => ParkingSpaceAttributes::getData() + ]; + } + + /** + * @return array + */ + private function getFloorList(): array + { + $floor_column = [ + 'id as floor_id', + 'name as floor_name' + ]; + return AdminFloorService::getSelectList( + 1, + $floor_column + ); + } + + /** + * @param Request $request + * @return JsonResponse + * @throws CustomException + * @throws ValidationException + */ + public function store(Request $request): JsonResponse + { + try { + $this->saveValidator($request->all()); + $this->service->createModel($request->all()); + return $this->responseService->success( + null, + __('admin.save_succeeded') + ); + } catch (ValidationException|CustomException $e) { + throw $e; + } catch (Exception $e) { + return $this->responseService->systemError( + __('exception.parking_camera.create_failed') . ':' + . $e->getMessage() + ); + } + } + + /** + * @param array $data + * @param int $id + * @return void + * @throws ValidationException + */ + protected function saveValidator(array $data, int $id = 0): void + { + $rules = [ + 'number' => 'required|max:50', + 'server_ip' => 'required|max:15', + 'camera_ip' => 'required|max:15', + 'floor_id' => 'required|numeric', + 'parking_space_data' => 'array' + ]; + $messages = [ + 'name.required' => __( + 'validation.parking_camera.n_empty' + ), + 'name.max' => __('validation.parking_camera.n_max'), + 'server_ip.required' => __( + 'validation.parking_camera.s_empty' + ), + 'server_ip.max' => __('validation.parking_camera.s_max'), + 'camera_ip.required' => __( + 'validation.parking_camera.c_empty' + ), + 'camera_ip.max' => __('validation.parking_camera.c_max'), + 'floor_id.required' => __('validation.map.f_empty'), + 'floor_id.numeric' => __('validation.map.f_number'), + 'parking_space_data.array' => __( + 'validation.parking_camera.p_array' + ) + ]; + if ($id) { + $this->validateId($id, ParkingCamera::class); + } + $validator = Validator::make($data, $rules, $messages); + + if ($validator->fails()) { + throw new ValidationException($validator); + } + } + + public function edit(string $id): JsonResponse + { + try { + $this->validateId($id, ParkingCamera::class); + $data = $this->getViewData(); + $item = ParkingCamera::query()->findOrFail($id); + $item['parking_space_data'] = ParkingSpaceCamera::getData($id, 1); + $data['item'] = $item; + return $this->responseService->success($data); + } catch (Exception $e) { + return $this->responseService->systemError( + __('exception.get_data_failed') . ':' . $e->getMessage() + ); + } + } + + /** + * 更新 + * @param Request $request + * @param string $id + * @return JsonResponse + * @throws CustomException + * @throws ValidationException + */ + public function update(Request $request, string $id): JsonResponse + { + try { + $this->saveValidator($request->all(), $id); + $this->service->updateModel($request->all(), $id); + return $this->responseService->success( + null, + __('admin.update_succeeded') + ); + } catch (ValidationException|CustomException $e) { + throw $e; + } catch (Exception $e) { + return $this->responseService->systemError( + __('exception.parking_camera.update_failed') . ':' + . $e->getMessage() + ); + } + } + + /** + * @param string $id + * @return JsonResponse + * @throws ValidationException + */ + public function destroy(string $id): JsonResponse + { + try { + $this->validateId($id, ParkingCamera::class); + $this->service->deleteModel($id); + return $this->responseService->success( + null, + __('admin.delete_succeeded') + ); + } catch (ValidationException $e) { + throw $e; + } catch (Exception $e) { + return $this->responseService->systemError( + __('exception.parking_camera.destroy_failed') . ':' + . $e->getMessage() + ); + } + } + + /** + * @return JsonResponse + * @throws InvalidArgumentException + */ + public function rule(): JsonResponse + { + try { + return $this->responseService->success( + $this->methodShow('parkingCamera') + ); + } catch (Exception $e) { + return $this->responseService->systemError( + __('exception.get_data_failed') . ':' . $e->getMessage() + ); + } + } +} diff --git a/app/Models/AdminFloorRegion.php b/app/Models/AdminFloorRegion.php index 0cfb319..35867c0 100644 --- a/app/Models/AdminFloorRegion.php +++ b/app/Models/AdminFloorRegion.php @@ -25,7 +25,7 @@ class AdminFloorRegion extends Model */ public static function getFloorRegion(int $floor_id): array { - $columns = ['name']; + $columns = ['id','name']; return self::query()->where('floor_id', $floor_id)->select($columns) ->get()->toArray(); } diff --git a/app/Models/ParkingCamera.php b/app/Models/ParkingCamera.php new file mode 100644 index 0000000..31c0fa4 --- /dev/null +++ b/app/Models/ParkingCamera.php @@ -0,0 +1,39 @@ +toArray(); } + + public static function getValueId($number): string + { + return self::query()->where('number', $number)->value('id'); + } } diff --git a/app/Models/ParkingSpaceCamera.php b/app/Models/ParkingSpaceCamera.php new file mode 100644 index 0000000..cd58806 --- /dev/null +++ b/app/Models/ParkingSpaceCamera.php @@ -0,0 +1,90 @@ + $camera_id, + 'space_index' => $index, + 'space_id' => $item['space_id'], + 'control_lights_ip' => $item['control_lights_ip'], + 'light_index' => $item['light_index'] ?? 0 + ]; + $index += 1; + } + return self::insert($createData); + } + + public static function getData($camera_id, $is_space = 0): array + { + $data = self::query()->where('camera_id', $camera_id)->orderBy( + 'space_index' + )->select()->get()->toArray(); + if ($is_space) { + foreach ($data as &$item) { + $space = ParkingSpace::query()->findOrFail( + $item['space_id'], + ['number', 'space_attr_id'] + ); + $item['space_number'] = $space['number']; + $item['space_attr_id'] = $space['space_attr_id']; + unset($item['space_id'], $item['id'], $item['camera_id']); + } + } + return $data; + } + + public static function getCameraIds($parking_space_number): Collection|array + { + $space_id = ParkingSpace::getValueId($parking_space_number); + if ($space_id) { + return self::query()->where('space_id', $space_id)->pluck( + 'camera_id' + ); + } + return []; + } + + public static function getParkingSpaceNumber( + $camera_id, + $is_implode = 1 + ): string|array { + $space_ids = self::query()->where('camera_id', $camera_id)->pluck( + 'space_id' + ); + $space_number_arr = []; + foreach ($space_ids as $space_id) { + $space_number_arr[] = ParkingSpace::getNumber($space_id); + } + return $is_implode ? implode(',', $space_number_arr) + : $space_number_arr; + } + + public static function getSpaceCount($camera_id): int + { + return self::query()->where('camera_id', $camera_id)->count(); + } +} diff --git a/app/Services/ParkingCameraService.php b/app/Services/ParkingCameraService.php new file mode 100644 index 0000000..ff9f8b9 --- /dev/null +++ b/app/Services/ParkingCameraService.php @@ -0,0 +1,259 @@ + 'flat_garage']; + private static array $isControlLightsArr = ['no', 'yes']; + + public function __construct(OperationLogService $logService) + { + parent::__construct($logService); + $this->logService->menuTitle = 'camera_management'; + } + + /** + * @return array|string[] + */ + public static function getStatus(): array + { + $statusArr = self::$statusArr; + foreach ($statusArr as $key => $value) { + $statusArr[$key] = __('admin.' . $value); + } + return $statusArr; + } + + /** + * @return array|string[] + */ + public static function getType(): array + { + $typeArr = self::$typeArr; + foreach ($typeArr as $key => $value) { + $typeArr[$key] = __('service.parking_camera.' . $value); + } + return $typeArr; + } + + /** + * @return array|string[] + */ + public static function getIsControlLights(): array + { + $arr = self::$isControlLightsArr; + foreach ($arr as $key => $value) { + $arr[$key] = __('service.reservation.' . $value); + } + return $arr; + } + + /** + * 创建车位相机 + * @param array $data + * @return Builder|Model + * @throws CustomException + */ + public function createModel(array $data): Builder|Model + { + try { + DB::beginTransaction(); + $parking_space_data = $data['parking_space_data']; + + if (ParkingCamera::query()->where('number', $data['number']) + ->exists() + ) { + throw new Exception(__('service.parking_camera.number_exists')); + } + + self::validateSpaceData($parking_space_data); + + $model = ParkingCamera::query()->create([ + 'number' => $data['number'], + 'camera_ip' => $data['camera_ip'], + 'server_ip' => $data['server_ip'], + 'floor_id' => $data['floor_id'] ?? 0, + 'floor_region_id' => $data['floor_region_id'] ?? 0, + 'is_control_lights' => $data['is_control_lights'] ?? 1, + 'is_external' => $data['is_external'] ?? 0, + 'built_in_light' => $data['built_in_light'] ?? 0, + 'off_light' => $data['off_light'] ?? 0, + 'remark' => $data['remark'] ?? '', + 'created_at' => get_datetime() + ]); + + $this->logService->logCreated($model, 'parking_camera.create'); + + $this->addSpaceCamera($model->id, $parking_space_data); + + DB::commit(); + return $model; + } catch (Exception $e) { + DB::rollBack(); + throw $e; + } + } + + /** + * 验证车位控灯相机数据 + * @param $data + * @return void + * @throws CustomException + */ + private function validateSpaceData(&$data): void + { + foreach ($data as &$item) { + $control_lights_ip = $item['control_lights_ip'] ?? ''; + $space_attr_id = $item['space_attr_id'] ?? ''; + if (empty($control_lights_ip)) { + throw new CustomException( + __('validation.parking_camera.lights_ip_empty') + ); + } + if (strlen($control_lights_ip) > 15) { + throw new CustomException( + __('validation.parking_camera.lights_ip_max') + ); + } + $space_id = ParkingSpace::getValueId($item['space_number']); + if (!$space_id && $space_attr_id) { + // 创建车位 + $spaceData = [ + 'floor_id' => $data['floor_id'], + 'number' => $item['space_number'], + 'space_attr_id' => $space_attr_id + ]; + (new ParkingSpaceService($this->logService))->create( + $spaceData + ); + $space_id = ParkingSpace::getValueId($item['space_number']); + } elseif ($space_id && $space_attr_id) { + // 更新车位属性 + (new ParkingSpaceService($this->logService))->updateAttr( + $space_id, + $space_attr_id + ); + } + // 获取车位id + $item['space_id'] = $space_id; + } + } + + private function addSpaceCamera($camera_id, $data) + { + ParkingSpaceCamera::createModel($data, $camera_id); + $AdminRoleMenuData = ParkingSpaceCamera::getData($camera_id); + $this->logService->logCreatedData( + new ParkingSpaceCamera(), + 'parking_camera.create_space_camera', + $AdminRoleMenuData + ); + } + + // 创建车位空灯数据 + + /** + * 更新车位相机 + * @param array $data + * @param string $id + * @return Builder|Model + * @throws CustomException + */ + public function updateModel(array $data, string $id): Builder|Model + { + try { + DB::beginTransaction(); + $parking_space_data = $data['parking_space_data']; + + $existsWhere = [ + ['number', '=', $data['number']], + ['id', '<>', $id] + ]; + if (ParkingCamera::query()->where($existsWhere)->exists()) { + throw new Exception(__('service.parking_camera.number_exists')); + } + self::validateSpaceData($parking_space_data); + + // 更新 + $model = ParkingCamera::query()->findOrFail($id); + $oldValues = $model->toArray(); + $model->update([ + 'number' => $data['number'], + 'camera_ip' => $data['camera_ip'], + 'server_ip' => $data['server_ip'], + 'floor_id' => $data['floor_id'] ?? 0, + 'floor_region_id' => $data['floor_region_id'] ?? 0, + 'is_control_lights' => $data['is_control_lights'] ?? 1, + 'is_external' => $data['is_external'] ?? 0, + 'built_in_light' => $data['built_in_light'] ?? 0, + 'off_light' => $data['off_light'] ?? 0, + 'remark' => $data['remark'] ?? '', + 'updated_at' => get_datetime() + ]); + + $this->logService->logUpdated( + $model, + $oldValues, + 'parking_camera.update' + ); + + // 删除再添加 + $this->delAdminRoleMenu($id); + $this->addSpaceCamera($id, $parking_space_data); + + DB::commit(); + return $model; + } catch (Exception $e) { + DB::rollBack(); + throw $e; + } + } + + // 删除车位空灯数据 + + private function delAdminRoleMenu(int $camera_id): void + { + $oldAdminRoleMenu = ParkingSpaceCamera::getData($camera_id); + $this->logService->logDeletedData( + new ParkingSpaceCamera(), + 'parking_camera.delete_space_camera', + $oldAdminRoleMenu + ); + ParkingSpaceCamera::query()->where('camera_id', $camera_id)->delete(); + } + + // 删除 + public function deleteModel(int $id): bool + { + try { + DB::beginTransaction(); + + $model = ParkingCamera::query()->findOrFail($id); + + $this->logService->logDeleted($model, 'parking_camera.delete'); + + $model->delete(); + + $this->delAdminRoleMenu($id); + + DB::commit(); + return true; + } catch (Exception $e) { + DB::rollBack(); + throw $e; + } + } +} diff --git a/app/Services/ParkingSpaceService.php b/app/Services/ParkingSpaceService.php index ce3d60f..a28562b 100644 --- a/app/Services/ParkingSpaceService.php +++ b/app/Services/ParkingSpaceService.php @@ -9,6 +9,7 @@ use App\Models\ParkingSpaceAttributes; use App\Models\ParkingSpaceType; use Exception; use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\DB; class ParkingSpaceService extends BaseService @@ -149,6 +150,63 @@ class ParkingSpaceService extends BaseService } } + /** + * @param $data + * @return Builder|Model + * @throws Exception + */ + public function createModel($data): Builder|Model + { + try { + DB::beginTransaction(); + if (ParkingSpace::query()->where('number', $data['number']) + ->exists() + ) { + throw new Exception(__('service.parking_space.number_exists')); + } + $model = $this->create($data); + DB::commit(); + return $model; + } catch (Exception $e) { + DB::rollBack(); + throw $e; + } + } + + public function create($data): Builder|Model + { + $model = ParkingSpace::query()->create([ + 'floor_id' => $data['floor_id'], + 'number' => $data['number'], + 'space_attr_id' => $data['space_attr_id'], + 'license_plate_id' => $data['license_plate_id'] ?? 0, + 'status' => $data['status'] ?? 0, + 'space_type_id' => $data['space_type_id'] ?? 0, + 'operation_type' => $data['operation_type'] ?? 0, + 'created_at' => get_datetime() + ]); + $this->logService->logCreated($model, 'parking_space.create'); + return $model; + } + + // 更新车位属性 + public function updateAttr($id, $space_attr_id) + { + $model = ParkingSpace::query()->findOrFail($id); + $oldValues = $model->toArray(); + if ($space_attr_id != $oldValues['space_attr_id']) { + $model->update([ + 'space_attr_id' => $space_attr_id, + 'updated_at' => get_datetime() + ]); + $this->logService->logUpdated( + $model, + $oldValues, + 'space_attributes.update' + ); + } + } + // 获取车位列表 public static function getSelectList($floor_id): array { diff --git a/database/migrations/2026_04_23_143449_create_parking_camera_table.php b/database/migrations/2026_04_23_143449_create_parking_camera_table.php new file mode 100644 index 0000000..90d5aee --- /dev/null +++ b/database/migrations/2026_04_23_143449_create_parking_camera_table.php @@ -0,0 +1,43 @@ +id(); + $table->string('number', 50)->default('')->comment('设备编号'); + $table->string('camera_ip', 15)->default('')->comment('相机ip地址'); + $table->string('server_ip', 15)->default('')->comment('服务器ip地址'); + $table->integer('floor_id')->default(0)->comment('楼层id'); + $table->integer('floor_region_id')->default(0)->comment('楼层区域id'); + $table->tinyInteger('is_control_lights')->default(1)->comment('是否控灯'); + $table->tinyInteger('is_external')->default(0)->comment('是否有外接指示灯'); + $table->tinyInteger('built_in_light')->default(0)->comment('内置灯映射'); + $table->tinyInteger('off_light')->default(0)->comment('关闭内置灯'); + $table->string('remark', 255)->default('')->comment('备注'); + $table->tinyInteger('type')->default(1)->comment('相机类型'); + $table->tinyInteger('status')->default(0)->comment('通讯状态 0离线 1在线'); + $table->index('floor_id'); + $table->innoDb(); + $table->comment('车位相机'); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('parking_camera'); + } +}; diff --git a/database/migrations/2026_04_23_143449_create_parking_information_table.php b/database/migrations/2026_04_23_143449_create_parking_information_table.php index 5c86984..b8a9397 100644 --- a/database/migrations/2026_04_23_143449_create_parking_information_table.php +++ b/database/migrations/2026_04_23_143449_create_parking_information_table.php @@ -18,6 +18,7 @@ return new class extends Migration $table->integer('license_plate_id')->default('')->comment('车牌id'); $table->integer('space_type_id')->default('')->comment('车位类型id'); $table->timestamp('entry_time')->comment('驶入时间'); + $table->innoDb(); $table->timestamps(); $table->softDeletes(); }); @@ -28,6 +29,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('parking_electronic_map'); + Schema::dropIfExists('parking_information'); } }; diff --git a/database/migrations/2026_04_23_143449_create_parking_space_camera_table.php b/database/migrations/2026_04_23_143449_create_parking_space_camera_table.php new file mode 100644 index 0000000..e82ecc6 --- /dev/null +++ b/database/migrations/2026_04_23_143449_create_parking_space_camera_table.php @@ -0,0 +1,35 @@ +id(); + $table->integer('camera_id')->comment('车位相机id'); + $table->integer('space_id')->default('')->comment('车位id'); + $table->integer('space_index')->default(1)->comment('车位信息索引'); + $table->string('control_lights_ip', 15)->comment('控灯相机IP'); + $table->tinyInteger('light_index')->default(0)->comment('映射相机指示灯索引'); + $table->index('camera_id'); + $table->index('space_id'); + $table->innoDb(); + $table->comment('车位相机关联车位'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('parking_space_camera'); + } +}; diff --git a/resources/lang/en/admin.php b/resources/lang/en/admin.php index ad32c5c..e37c39b 100644 --- a/resources/lang/en/admin.php +++ b/resources/lang/en/admin.php @@ -2,6 +2,7 @@ return [ 'online' => 'Online', + 'offline' => 'offline', 'login' => 'Login', 'logout' => 'Logout', 'setting' => 'Setting', diff --git a/resources/lang/zh-CN/admin.php b/resources/lang/zh-CN/admin.php index 28678cd..5d08d01 100644 --- a/resources/lang/zh-CN/admin.php +++ b/resources/lang/zh-CN/admin.php @@ -2,6 +2,7 @@ return [ 'online' => '在线', + 'offline' => '离线', 'login' => '登录', 'logout' => '登出', 'setting' => '设置', diff --git a/resources/lang/zh-CN/exception.php b/resources/lang/zh-CN/exception.php index c89aa9a..98fe999 100644 --- a/resources/lang/zh-CN/exception.php +++ b/resources/lang/zh-CN/exception.php @@ -52,17 +52,22 @@ return [ 'update_failed' => '更新车位类型失败', 'destroy_failed' => '删除车位类型失败' ], - 'license_plate' => [ + 'license_plate' => [ 'create_failed' => '创建车牌号码失败', 'update_failed' => '更新车牌号码失败', 'destroy_failed' => '删除车牌号码失败', 'clear_failed' => '清除车牌号码失败' ], - 'parking_space' => [ + 'parking_space' => [ 'update_type_failed' => '修改车位类型失败', 'update_attr_failed' => '修改车位属性失败' ], - 'parking_information' => [ + 'parking_information' => [ 'create_failed' => '新增失败' + ], + 'parking_camera' => [ + 'create_failed' => '新增失败', + 'update_failed' => '更新失败', + 'destroy_failed' => '删除失败' ] ]; diff --git a/resources/lang/zh-CN/log.php b/resources/lang/zh-CN/log.php index 096f5e5..c016c6d 100644 --- a/resources/lang/zh-CN/log.php +++ b/resources/lang/zh-CN/log.php @@ -1,63 +1,74 @@ '登录平台', - 'logout' => '注销', - 'config' => [ + 'login' => '登录平台', + 'logout' => '注销', + 'config' => [ 'update' => '系统配置更新' ], - 'admin_floor' => [ - 'create' => '创建楼层', - 'update' => '更新楼层', - 'delete' => '删除楼层', + 'admin_floor' => [ + 'create' => '创建楼层', + 'update' => '更新楼层', + 'delete' => '删除楼层', 'region_create' => '创建楼层关联区域', 'region_delete' => '删除角色关联菜单', ], - 'role' => [ - 'create' => '创建角色', - 'update' => '更新角色', - 'delete' => '删除角色', + 'role' => [ + 'create' => '创建角色', + 'update' => '更新角色', + 'delete' => '删除角色', 'menu_delete' => '删除角色关联菜单', 'menu_create' => '创建角色关联菜单' ], - 'translation' => [ + 'translation' => [ 'create' => '创建翻译', 'update' => '更新翻译', 'delete' => '删除翻译' ], - 'admin_user' => [ - 'create' => '创建用户', - 'update' => '更新用户', - 'delete' => '更新用户', + 'admin_user' => [ + 'create' => '创建用户', + 'update' => '更新用户', + 'delete' => '更新用户', 'role_create' => '创建用户关联角色', 'role_update' => '更新用户关联角色', 'role_delete' => '删除用户关联角色' ], - 'license_plate' => [ + 'license_plate' => [ 'create' => '创建车牌号码', 'update' => '更新车牌号码', 'delete' => '删除车牌号码' ], - 'space_attributes' => [ + 'space_attributes' => [ 'create' => '创建车位属性', 'update' => '更新车位属性', 'delete' => '删除车位属性' ], - 'space_type' => [ + 'space_type' => [ 'create' => '创建车位类型', 'update' => '更新车位类型', 'delete' => '删除车位类型' ], - 'vip_list' => [ + 'vip_list' => [ 'create' => '创建VIP名单', 'update' => '更新VIP名单', 'delete' => '删除VIP名单' ], - 'map' => [ + 'map' => [ 'save' => '绘制电子地图保存' ], 'parking_information' => [ 'create' => '创建车位资讯', 'delete' => '更新车位资讯', 'clear' => '清除车位资讯' + ], + 'parking_camera' => [ + 'create' => '创建车位相机', + 'update' => '更新车位相机', + 'delete' => '删除车位相机', + 'create_space_camera' => '创建车位控灯相机', + 'delete_space_camera' => '删除车位控灯相机' + ], + 'parking_space' => [ + 'create' => '创建车位', ] ]; diff --git a/resources/lang/zh-CN/service.php b/resources/lang/zh-CN/service.php index 2173f53..d4057c4 100644 --- a/resources/lang/zh-CN/service.php +++ b/resources/lang/zh-CN/service.php @@ -50,9 +50,14 @@ return [ 'land' => '低', 'no_cars' => '车位状态无车更新有车', 'yes_cars' => '车位状态有车更新无车', - 'number_update' => '车牌号更新' + 'number_update' => '车牌号更新', + 'number_exists' => '车位号码已存在' ], 'parking_information' => [ 'not_default' => '未设置默认车位类型' + ], + 'parking_camera' => [ + 'number_exists' => '设备编号已存在', + 'flat_garage' => '平面车库' ] ]; diff --git a/resources/lang/zh-TW/admin.php b/resources/lang/zh-TW/admin.php index 1905e0b..75bd0a9 100644 --- a/resources/lang/zh-TW/admin.php +++ b/resources/lang/zh-TW/admin.php @@ -2,6 +2,7 @@ return [ 'online' => '在線', + 'offline' => '離線', 'login' => '登錄', 'logout' => '登出', 'setting' => '設置', diff --git a/routes/admin/api.php b/routes/admin/api.php index 8fa20ad..23d9f79 100644 --- a/routes/admin/api.php +++ b/routes/admin/api.php @@ -20,6 +20,7 @@ use App\Http\Controllers\Admin\UserController; use Illuminate\Support\Facades\Route; use App\Http\Controllers\Admin\ParkingInformationController; use App\Http\Controllers\Admin\ParkingSpaceCatMapController; +use App\Http\Controllers\Admin\ParkingCameraController; Route::group(['prefix' => 'admin'], function () { @@ -102,6 +103,15 @@ Route::group(['prefix' => 'admin'], function () { Route::get('/operationLog/index', [OperationLogController::class, 'index']); Route::get('/operationLog/search', [OperationLogController::class, 'search']); Route::get('/operationLog/directory/{id}', [OperationLogController::class, 'getSubDirectoryList']); + // 车位相机管理 + Route::get('/parkingCamera', [ParkingCameraController::class, 'index']); + Route::get('/parkingCamera/search', [ParkingCameraController::class, 'search']); + Route::get('/parkingCamera/create', [ParkingCameraController::class, 'create']); + Route::post('/parkingCamera', [ParkingCameraController::class, 'store']); + Route::get('/parkingCamera/edit/{id}', [ParkingCameraController::class, 'edit']); + Route::put('/parkingCamera/{id}', [ParkingCameraController::class, 'update']); + Route::delete('/parkingCamera/{id}', [ParkingCameraController::class, 'destroy']); + Route::get('/parkingCamera/rule', [ParkingCameraController::class, 'rule']); // 系统总配置 Route::get('/config/index', [ConfigController::class, 'index']); @@ -114,6 +124,7 @@ Route::group(['prefix' => 'admin'], function () { Route::delete('/floors/{id}', [FloorController::class, 'destroy']); Route::get('/floors/rule', [FloorController::class, 'rule']); Route::get('/floors/search', [FloorController::class, 'search']); + Route::get('/floors/floorRegionList', [FloorController::class, 'floorRegionList']); // 图片上传 Route::post('/uploadImage', [UploadController::class, 'uploadImage']); // 翻译