From 3bbb1a5cc0af22dc97b6e8b8f3be9491da4fb351 Mon Sep 17 00:00:00 2001 From: "allen.yan" Date: Thu, 22 May 2025 10:08:34 +0800 Subject: [PATCH] =?UTF-8?q?Room=20=E5=8A=A0=E5=85=A5=20is=5Fonline=20?= =?UTF-8?q?=E4=BE=86=E5=8D=80=E5=88=A5=E5=86=8D=E4=B8=8D=E5=86=8D=E7=B7=9A?= =?UTF-8?q?=E4=B8=8A=20=E8=AA=BF=E6=95=B4=20FavoriteSongs=20=E8=B3=87?= =?UTF-8?q?=E6=96=99=E5=A1=9E=E5=80=BC=E6=94=B9=E7=94=A8seeder=20=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=20user=5Fsong=20table=20/api/room/receiveRegister=20?= =?UTF-8?q?=E8=AA=BF=E6=95=B4=E9=82=8F=E8=BC=AF=20room=E4=BB=8B=E9=9D=A2?= =?UTF-8?q?=20=E9=96=8B=E9=97=9C=E5=8C=85=E5=B8=B3=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E8=AA=BF=E6=95=B4=20=E5=AF=AB=E5=85=A5=E5=BF=83=E8=B7=B3?= =?UTF-8?q?=E5=B0=81=E5=8C=85=2020250522?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 10244 -> 10244 bytes app/Enums/RoomStatus.php | 4 +- .../Controllers/RoomControlController.php | 107 ++++++++++++++---- .../Requests/ReceiveRoomRegisterRequest.php | 12 +- .../Requests/ReceiveRoomStatusRequest.php | 37 ++++++ .../Requests/SendRoomSwitchCommandRequest.php | 2 +- app/Livewire/Admin/RoomDetailModal.php | 71 +++++++++++- app/Models/MachineStatus.php | 17 +++ app/Models/Room.php | 2 + app/Services/ApiClient.php | 41 +++++++ ...4_23_052656_create_FavoriteSongs_table.php | 8 -- ...25_04_23_052656_create_user_song_table.php | 34 ++++++ .../2025_05_06_055307_create_rooms_table.php | 3 +- ...1_170205_create_machine_statuses_table.php | 33 ++++++ database/seeders/DatabaseSeeder.php | 1 + database/seeders/FavoriteSongsSeeder.php | 23 ++++ resources/lang/zh-tw/enums.php | 3 +- .../views/components/room-card-svr.blade.php | 10 +- .../views/components/room-card.blade.php | 10 +- .../admin/room-detail-modal.blade.php | 12 +- routes/api.php | 3 +- 21 files changed, 380 insertions(+), 53 deletions(-) create mode 100644 app/Http/Requests/ReceiveRoomStatusRequest.php create mode 100644 app/Models/MachineStatus.php create mode 100644 app/Services/ApiClient.php create mode 100644 database/migrations/2025_04_23_052656_create_user_song_table.php create mode 100644 database/migrations/2025_05_21_170205_create_machine_statuses_table.php create mode 100644 database/seeders/FavoriteSongsSeeder.php diff --git a/.DS_Store b/.DS_Store index cf959a303d8d9bfd368abc9bbca0f42b628cc68c..15a302ce922a8b9914077534916f0aaf7a36d788 100644 GIT binary patch delta 871 zcmd_m+e_179LMqRXPdaEoIQ;les24zq0?cr)27q3g%I-uX|=U93e>F_$;{RPk`B-+ zvXbbjpo@aCyoeaaypWQvx+%z;q=8k3P!vS;v~|%{|3H`D_xI}aO13B4NBtb* z0@nUH%D{lv<8v2#ykdeoFeo1LA{-ard0Q@rK>4S;b-e~q;!Q6}|Sa4e`9?2ACFW=nilb2QNc`FO=j_ydr`r_GG%fy)RiYO~o4-}A_{1l*0>Y+I8p%ZkHhUfx~ zP>ROrHr=Irbe|^a0X?Oc^om~78~Q|_=?i^@7I`orA2yVr6lExf8&#-A4Qk;>Bbv~H zR;)oMHewStV+;DQ9SQ8jJ{-YO9K+xuoX2Gh<0?jQ12=IC6PUy!JjV=P;2qv$79TWP zjZS0G7&UfbG_93@YM`;H`7gi);-hJ+gz7L?a;EYeX`r97Se1fOCllw)h0;kY?O3LH zDpbbt=kV1q#&uFL`>S8Un3y&@|3Pz!uF)us(;Z3kke<*q&C)me37v$nK!F_&s1n14 z3M|Zk_$0@2)L|6@lB8LptV0N4Y(NLP5kWKq)1QIah5a~)LrCJV5kokI(-1g=v$!ac huBV4BbsA9mnc~V#=M?|Y38%U;_xDhn{l8e>gI{hz%6R|) delta 1037 zcmeIvOGs2v7zgn0e|_D1Bs(*Xb_H)qYS}bCN>ghrB+Ai*6dN70z$U%aO&i4-Cu(Ei zw5teC4+@e}TeK*uNf$06!9`TKa$}&IpcVzah#nMnnCqrpi)*NfT zzk>@+KbcbQ$=kA7Oz~VXrWc5rY==m9cyn30?r&v*PVS6a=82~Mh}9Pgx0wTBxr;-N zoyDD;4~ESavo{#AqUNq(#01Mw#|m{PDtal~r1Ea9wKsU!?6pf3tWxETS|Dow#V&4TV$?Z4 zq~+I^Eq7Kahf1iH>ggbv)K9~7j&9Hh-K9x-Ofxh~^YoGyXpvsgJNiOj=^K5Af+VCM z6`9C|fz@!M92KZU6>6{>b*M)J_9B3Gbl?DjIEEe^M+i|2;WWI%h~Yf0;3}@+I_}^h z;+ViBrtu8V@dAr@gOB)x&-jU7SW-yIR9uRotX1*_ceO}#qt3?~{uTOy%aYi>tl|!4 z@D%B&&SkICa|#M&OqGUq+~770uJ8%fjwPiA<4JNbTH5tKA{b1lpTRKJ#BdfDa1jERa2X@GiBXJU9Jg^#PT*1eR<>6G;tP6FT0AZ9 PN3wYD3jCL`WrFw(`$O(4 diff --git a/app/Enums/RoomStatus.php b/app/Enums/RoomStatus.php index 74b27ec..72ae246 100644 --- a/app/Enums/RoomStatus.php +++ b/app/Enums/RoomStatus.php @@ -8,7 +8,7 @@ use App\Enums\Traits\HasLabels; * @OA\Schema( * schema="RoomStatus", * type="string", - * enum={"active", "closed", "fire", "error", "maintenance"}, + * enum={"active", "closed", "fire", "maintenance"}, * example="error" * ) */ @@ -19,7 +19,6 @@ enum RoomStatus: string { case Closed = 'closed'; case Fire ='fire'; case Error = 'error'; - case Maintenance = 'maintenance'; // 返回對應的顯示文字 public function labels(): string @@ -29,7 +28,6 @@ enum RoomStatus: string { self::Closed => __('enums.room.status.Closed'), self::Fire => __('enums.room.status.Fire'), self::Error => __('enums.room.status.Error'), - self::Maintenance => __('enums.room.status.Maintenance'), }; } } diff --git a/app/Http/Controllers/RoomControlController.php b/app/Http/Controllers/RoomControlController.php index 9387c47..40693d8 100644 --- a/app/Http/Controllers/RoomControlController.php +++ b/app/Http/Controllers/RoomControlController.php @@ -4,11 +4,13 @@ namespace App\Http\Controllers; use App\Http\Requests\SendRoomSwitchCommandRequest; use App\Http\Requests\ReceiveRoomRegisterRequest; +use App\Http\Requests\ReceiveRoomStatusRequest; use App\Services\TcpSocketClient; use Illuminate\Http\JsonResponse; - +use Illuminate\Support\Facades\Auth; use App\Models\Room; use App\Enums\RoomStatus; +use App\Http\Responses\ApiResponse; /** * @OA\Tag( @@ -25,7 +27,6 @@ class RoomControlController extends Controller * description="依據傳入的 branch_id 與 room_name,知道過來的設備來之於那個IP設備。", * operationId="registerRoomCommand", * tags={"Room Control"}, - * security={{"Authorization":{}}}, * @OA\RequestBody( * required=true, * @OA\JsonContent(ref="#/components/schemas/ReceiveRoomRegisterRequest") @@ -66,19 +67,61 @@ class RoomControlController extends Controller */ public function receiveRegister(ReceiveRoomRegisterRequest $request): JsonResponse { - $validated = $request->validated(); - - $room= Room::where([['branch_id',$validated['branch_id']],['name',$validated['room_name']]])->first(); - if (!$room) { - return \App\Http\Responses\ApiResponse::error("'找不到對應包廂'"); - } - $room->internal_ip = $validated['room_ip']; - $room->port =1000; - $room->touch(); - $room->status=RoomStatus::Closed; - $room->save(); - return \App\Http\Responses\ApiResponse::success($room); + // 1. 驗證帳密(登入用) + $credentials = $request->only('email', 'password'); + if (!Auth::attempt($credentials)) { + return ApiResponse::unauthorized(); + } + + // 2. 取得登入使用者 + $user = Auth::user(); + + // 3. 產生或取得 Token + if (empty($user->api_plain_token)) { + $token = $user->createToken('pc-heartbeat')->plainTextToken; + $user->api_plain_token = $token; + $user->save(); + } else { + $token = $user->api_plain_token; + } + + // 4. 驗證其他註冊欄位 + $validated = $request->validated(); // branch_id, room_name, room_ip + + // 5. 找出對應包廂 + $room = Room::where('branch_id', $validated['branch_id']) + ->where('name', $validated['room_name']) + ->first(); + + if (!$room) { + return ApiResponse::error('找不到對應包廂'); + } + + // 6. 更新包廂資訊 + $room->internal_ip = $request->ip(); + $room->port = 1000; // 預設值 + $room->is_online =1; + $room->status = RoomStatus::Closed; + $room->touch(); // 更新 updated_at + $room->save(); + + // 7. 回傳 token 與包廂資料 + return ApiResponse::success([ + 'token' => $token, + 'room' => $room, + ]); + } + public function StatusReport(ReceiveRoomStatusRequest $request) + { + $data = $request->validate([ + 'hostname' => 'required|string', + 'ip' => 'required|string', + 'cpu' => 'nullable|numeric', + 'memory' => 'nullable|numeric', + 'disk' => 'nullable|numeric', + 'status' => 'required|string', + ]); } /** * @OA\Post( @@ -129,14 +172,36 @@ class RoomControlController extends Controller public function sendSwitch(SendRoomSwitchCommandRequest $request): JsonResponse { $validated = $request->validated(); - $room= Room::where([['branch_id',$validated['branch_id']],['name',$validated['room_name']]])->first(); - $ip = $room->internal_ip; - $port = $room->port; - $data=(substr($room->name, -3) ?? $room->name).",".($validated['command']=='active' ? 'O':'X'); + $room = Room::where([ + ['branch_id', $validated['branch_id']], + ['name', $validated['room_name']], + ])->first(); + + if (!$room) { + return ApiResponse::error('房間不存在'); + } + + // 檢查必要欄位是否缺失或狀態為錯誤 + if (empty($room->internal_ip) || empty($room->port)) { + return ApiResponse::error('房間未設定 IP 或 Port'); + } + + if ($room->status === RoomStatus::Error) { + return ApiResponse::error('房間目前處於錯誤狀態,無法操作'); + } + + $suffix = substr($room->name, -3) ?: $room->name; + $signal = match ($validated['command']) { + 'active' => 'O', + 'closed' => 'X', + 'fire' => 'F', + default => 'X', // fallback 保險起見 + }; + $data = $suffix . "," . $signal; //dd($data); - $client = new TcpSocketClient($ip, $port); + $client = new TcpSocketClient($room->internal_ip, $room->port); try { $response = $client->send($data); @@ -145,13 +210,13 @@ class RoomControlController extends Controller $room->ended_at=$validated['ended_at']; $room->save(); - return \App\Http\Responses\ApiResponse::success($room); + return ApiResponse::success($room); } catch (\Throwable $e) { $room->status=RoomStatus::Error; $room->started_at=null; $room->ended_at=null; $room->save(); - return \App\Http\Responses\ApiResponse::error($e->getMessage()); + return ApiResponse::error($e->getMessage()); } } } diff --git a/app/Http/Requests/ReceiveRoomRegisterRequest.php b/app/Http/Requests/ReceiveRoomRegisterRequest.php index 13fb561..bf416fd 100644 --- a/app/Http/Requests/ReceiveRoomRegisterRequest.php +++ b/app/Http/Requests/ReceiveRoomRegisterRequest.php @@ -7,10 +7,11 @@ use Illuminate\Foundation\Http\FormRequest; /** * @OA\Schema( * schema="ReceiveRoomRegisterRequest", - * required={"branch_id", "room_id", "ip"}, - * @OA\Property(property="branch_id", type="integer", example="5"), - * @OA\Property(property="room_name", type="string", example="pc102"), - * @OA\Property(property="room_ip", type="string", example="192.168.x.x"), + * required={"branch_id", "room_name", "email" ,"password"}, + * @OA\Property(property="branch_id", type="integer", example="1"), + * @OA\Property(property="room_name", type="string", example="102"), + * @OA\Property(property="email", type="string", example="XX@gmail.com"), + * @OA\Property(property="password", type="string", example="XXX"), * ) */ class ReceiveRoomRegisterRequest extends ApiRequest @@ -25,7 +26,8 @@ class ReceiveRoomRegisterRequest extends ApiRequest return [ 'branch_id' => 'required|integer|exists:branches,id', 'room_name' => 'required|string', - 'room_ip' => 'nullable|ip', + 'email' => 'required|email', + 'password' => 'required', ]; } } diff --git a/app/Http/Requests/ReceiveRoomStatusRequest.php b/app/Http/Requests/ReceiveRoomStatusRequest.php new file mode 100644 index 0000000..81887f2 --- /dev/null +++ b/app/Http/Requests/ReceiveRoomStatusRequest.php @@ -0,0 +1,37 @@ +|string> + */ + public function rules(): array + { + return [ + 'hostname' => 'required|string', + 'ip' => 'required|string', + 'cpu' => 'nullable|numeric', + 'memory' => 'nullable|numeric', + 'disk' => 'nullable|numeric', + 'status' => 'required|string', + ]; + } +} diff --git a/app/Http/Requests/SendRoomSwitchCommandRequest.php b/app/Http/Requests/SendRoomSwitchCommandRequest.php index e002345..ba5a533 100644 --- a/app/Http/Requests/SendRoomSwitchCommandRequest.php +++ b/app/Http/Requests/SendRoomSwitchCommandRequest.php @@ -7,7 +7,7 @@ use Illuminate\Foundation\Http\FormRequest; /** * @OA\Schema( * schema="SendRoomSwitchCommandRequest", - * required={"room_id", "command"}, + * required={"branch_id", "room_name", "command"}, * @OA\Property(property="branch_id", type="integer", example="5"), * @OA\Property(property="room_name", type="string", example="pc102"), * @OA\Property(property="command", type="string", enum={"active", "closed", "fire", "maintenance"}, example="active"), diff --git a/app/Livewire/Admin/RoomDetailModal.php b/app/Livewire/Admin/RoomDetailModal.php index a7472fc..517ad59 100644 --- a/app/Livewire/Admin/RoomDetailModal.php +++ b/app/Livewire/Admin/RoomDetailModal.php @@ -5,12 +5,18 @@ namespace App\Livewire\Admin; use App\Models\Room; use Livewire\Component; +use App\Services\ApiClient; +use Illuminate\Support\Facades\Auth; class RoomDetailModal extends Component { - protected $listeners = ['openModal']; + protected $listeners = [ + 'openModal', 'closeModal', + 'startNotify', 'stopNotify', 'fireNotify', + 'openAccountNotify','closeAccountNotify' + ]; public $room; public bool $showModal = false; @@ -20,6 +26,69 @@ class RoomDetailModal extends Component $this->room = Room::find($roomId); $this->showModal = true; } + public function closeModal() + { + $this->showModal = false; + } + public function startNotify() + { + $data = $this->buildNotifyData('active', now(), null); + $this->send($data); + } + + public function stopNotify() + { + $data = $this->buildNotifyData('closed', null, null); + $this->send($data); + } + + public function fireNotify() + { + $data = $this->buildNotifyData('fire', null, null); + $this->send($data); + } + + public function openAccountNotify() + { + $data = $this->buildNotifyData('active', now(), null); + $this->send($data); + } + + public function closeAccountNotify() + { + $data = $this->buildNotifyData('closed', now(), null); + $this->send($data); + } + protected function buildNotifyData(string $command, $startedAt = null, $endedAt = null): array + { + return [ + 'branch_id' => $this->room->branch_id ?? 0, + 'room_name' => $this->room->name ?? '', + 'command' => $command, + 'started_at' => $startedAt ? $startedAt->toDateTimeString() : null, + 'ended_at' => $endedAt ? $endedAt->toDateTimeString() : null, + ]; + } + + function send(array $data){ + $user = Auth::user(); + $token = $user->api_plain_token ?? null; + + if (!$token) { + $this->addError('api', 'API token is missing.'); + return false; + } + + $apiClient = new ApiClient(); + $response = $apiClient->setToken($token)->post('/room/sendSwitch', $data); + if ($response->failed()) { + $this->addError('api', 'API request failed: ' . $response->body()); + return false; + } + + // 可以加入成功提示或事件 + return true; + } public function render() { diff --git a/app/Models/MachineStatus.php b/app/Models/MachineStatus.php new file mode 100644 index 0000000..6d26700 --- /dev/null +++ b/app/Models/MachineStatus.php @@ -0,0 +1,17 @@ + 'string', 'internal_ip' =>'string', 'port' => 'int', + 'is_online' => 'boolean', 'status' => \App\Enums\RoomStatus::class, 'started_at' => 'datetime', 'ended_at' => 'datetime', diff --git a/app/Services/ApiClient.php b/app/Services/ApiClient.php new file mode 100644 index 0000000..f231111 --- /dev/null +++ b/app/Services/ApiClient.php @@ -0,0 +1,41 @@ +baseUrl = config('services.room_api.base_url', 'https://ktv.test/api'); + $this->token = $token ?? config('services.room_api.token'); + } + public function setToken(string $token): self + { + $this->token = $token; + return $this; + } + + public function withDefaultHeaders(): \Illuminate\Http\Client\PendingRequest + { + return Http::withHeaders([ + 'Accept' => 'application/json', + 'Authorization' => 'Bearer ' . config('services.room_api.token'), + 'Content-Type' => 'application/json', + ]); + } + + public function post(string $endpoint, array $data = []) + { + return $this->withDefaultHeaders()->post($this->baseUrl . $endpoint, $data); + } + + public function get(string $endpoint, array $query = []) + { + return $this->withDefaultHeaders()->get($this->baseUrl . $endpoint, $query); + } + +} \ No newline at end of file diff --git a/database/migrations/2025_04_23_052656_create_FavoriteSongs_table.php b/database/migrations/2025_04_23_052656_create_FavoriteSongs_table.php index 84003eb..8ec5328 100644 --- a/database/migrations/2025_04_23_052656_create_FavoriteSongs_table.php +++ b/database/migrations/2025_04_23_052656_create_FavoriteSongs_table.php @@ -3,7 +3,6 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; -use Illuminate\Support\Facades\DB; return new class extends Migration { @@ -18,13 +17,6 @@ return new class extends Migration $table->string('userPhone', 10); $table->timestamps(); }); - // 預塞一筆資料 - DB::table('FavoriteSongs')->insert([ - 'songNumber' => 999996, - 'userPhone' => '0912345678', - 'created_at' => now(), - 'updated_at' => now(), - ]); } /** diff --git a/database/migrations/2025_04_23_052656_create_user_song_table.php b/database/migrations/2025_04_23_052656_create_user_song_table.php new file mode 100644 index 0000000..d38cd40 --- /dev/null +++ b/database/migrations/2025_04_23_052656_create_user_song_table.php @@ -0,0 +1,34 @@ +unsignedBigInteger('song_id'); + $table->unsignedBigInteger('user_id'); + + $table->foreign('song_id')->references('id')->on('songs')->restrictOnDelete()->restrictOnUpdate(); + $table->foreign('user_id')->references('id')->on('users')->restrictOnDelete()->restrictOnUpdate(); + $table->primary(['song_id', 'user_id']); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('user_song'); + } +}; diff --git a/database/migrations/2025_05_06_055307_create_rooms_table.php b/database/migrations/2025_05_06_055307_create_rooms_table.php index 5e4a026..d4468c7 100644 --- a/database/migrations/2025_05_06_055307_create_rooms_table.php +++ b/database/migrations/2025_05_06_055307_create_rooms_table.php @@ -19,7 +19,8 @@ return new class extends Migration $table->string('name')->comment('包廂名稱'); $table->string('internal_ip')->nullable()->comment('內部 IP'); $table->unsignedSmallInteger('port')->nullable()->comment('通訊 Port'); - $table->enum('status', ['active', 'closed','fire', 'error', 'maintenance'])->default('error')->comment('狀態'); // :啟用中 / 已結束 + $table->tinyInteger('is_online')->default(0)->comment('連線狀態'); + $table->enum('status', ['active', 'closed','fire', 'error'])->default('error')->comment('狀態'); // :啟用中 / 已結束 $table->dateTime('started_at')->nullable()->comment('開始時間'); // $table->dateTime('ended_at')->nullable()->comment('結束時間'); // $table->timestamps(); diff --git a/database/migrations/2025_05_21_170205_create_machine_statuses_table.php b/database/migrations/2025_05_21_170205_create_machine_statuses_table.php new file mode 100644 index 0000000..4e21b81 --- /dev/null +++ b/database/migrations/2025_05_21_170205_create_machine_statuses_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('hostname'); + $table->string('ip')->nullable(); + $table->decimal('cpu', 5, 2)->nullable(); + $table->decimal('memory', 5, 2)->nullable(); + $table->decimal('disk', 5, 2)->nullable(); + $table->string('status'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('machine_statuses'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 3098295..9fda0e0 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -16,6 +16,7 @@ class DatabaseSeeder extends Seeder $this->call([ PermissionTableSeeder::class, SongCategorySeeder::class, + FavoriteSongsSeeder::class, CreateAdminUserSeeder::class, ]); } diff --git a/database/seeders/FavoriteSongsSeeder.php b/database/seeders/FavoriteSongsSeeder.php new file mode 100644 index 0000000..e370bce --- /dev/null +++ b/database/seeders/FavoriteSongsSeeder.php @@ -0,0 +1,23 @@ +insert([ + 'songNumber' => 999996, + 'userPhone' => '0912345678', + 'created_at' => Carbon::now(), + 'updated_at' => Carbon::now(), + ]); + } +} \ No newline at end of file diff --git a/resources/lang/zh-tw/enums.php b/resources/lang/zh-tw/enums.php index a8f1c8b..1d05487 100644 --- a/resources/lang/zh-tw/enums.php +++ b/resources/lang/zh-tw/enums.php @@ -27,6 +27,5 @@ return [ 'room.status.Active' => '已占用', 'room.status.Closed' => '可用', 'room.status.Fire' => '火災', - 'room.status.Error' => '異常', - 'room.status.Maintenance' => '維修', + 'room.status.Error' => '維修', ]; \ No newline at end of file diff --git a/resources/views/components/room-card-svr.blade.php b/resources/views/components/room-card-svr.blade.php index 134097d..4b4711c 100644 --- a/resources/views/components/room-card-svr.blade.php +++ b/resources/views/components/room-card-svr.blade.php @@ -4,12 +4,18 @@ RoomStatus::Active->value => 'green-600', RoomStatus::Closed->value => 'gray-600', RoomStatus::Error->value => 'red-600', - RoomStatus::Maintenance->value => 'yellow-600', ]; @endphp
-
{{ $room->type->labels().".".$room->name }}
+ {{-- 房間名稱 + 線上狀態圓點 --}} +
+    + + {{ $room->type->labels().".".$room->name }} + +
{{ $room->status->labels() }}
diff --git a/resources/views/components/room-card.blade.php b/resources/views/components/room-card.blade.php index d91d1c2..f8a2290 100644 --- a/resources/views/components/room-card.blade.php +++ b/resources/views/components/room-card.blade.php @@ -4,13 +4,19 @@ RoomStatus::Active->value => 'green-600', RoomStatus::Closed->value => 'gray-600', RoomStatus::Error->value => 'red-600', - RoomStatus::Maintenance->value => 'yellow-600', ]; @endphp
-
{{ $room->type->labels().".".$room->name }}
+ {{-- 房間名稱 + 線上狀態圓點 --}} +
+    + + {{ $room->type->labels().".".$room->name }} + +
{{ $room->status->labels() }}
diff --git a/resources/views/livewire/admin/room-detail-modal.blade.php b/resources/views/livewire/admin/room-detail-modal.blade.php index 15a1647..abda927 100644 --- a/resources/views/livewire/admin/room-detail-modal.blade.php +++ b/resources/views/livewire/admin/room-detail-modal.blade.php @@ -2,7 +2,7 @@