diff --git a/app/Enums/RoomType.php b/app/Enums/RoomType.php new file mode 100644 index 0000000..e311fea --- /dev/null +++ b/app/Enums/RoomType.php @@ -0,0 +1,31 @@ + __('enums.room.status.Unset'), + self::PC => "PC", + self::SVR => "SVR", + }; + } +} diff --git a/app/Livewire/Admin/BranchForm.php b/app/Livewire/Admin/BranchForm.php index 911bd2d..45d2c2b 100644 --- a/app/Livewire/Admin/BranchForm.php +++ b/app/Livewire/Admin/BranchForm.php @@ -10,6 +10,7 @@ use WireUi\Traits\WireUiActions; use App\Models\Branch; use App\Models\Room; +use App\Enums\RoomType; class BranchForm extends Component { @@ -84,11 +85,20 @@ class BranchForm extends Component foreach ($roomLines as $line) { [$floor, $roomList] = explode(';', $line); + $floor = (int) filter_var($floor, FILTER_SANITIZE_NUMBER_INT); // 抽出 1F 的數字 + $roomNames = array_map('trim', explode(',', $roomList)); foreach ($roomNames as $roomName) { + $type = match (true) { + str_starts_with($roomName, 'svr') => RoomType::SVR, + str_starts_with($roomName, 'pc') => RoomType::PC, + default => RoomType::Unset, + }; $rooms[] = new Room([ - 'name' => $roomName, + 'floor' => $floor, + 'type' => $type->value, + 'name' => preg_replace('/^(pc|svr)/', '', $roomName), ]); } } diff --git a/app/Livewire/Admin/RoomGrid.php b/app/Livewire/Admin/RoomGrid.php index a367958..2c7b195 100644 --- a/app/Livewire/Admin/RoomGrid.php +++ b/app/Livewire/Admin/RoomGrid.php @@ -4,6 +4,7 @@ namespace App\Livewire\Admin; use App\Models\Room; use App\Models\Branch; +use App\Enums\RoomType; use Livewire\Component; use Illuminate\Database\Eloquent\Collection; @@ -14,22 +15,33 @@ class RoomGrid extends Component protected $listeners = ['openModal','closeModal'];//,'refreshRooms' => '$refresh' public bool $showModal = false; + public int $branch_id = 0; public $branchName=""; - public Collection $rooms; + public array $roomTypes; + public function mount() { - $this->rooms = new Collection(); + $this->roomTypes = ['all' => '全部'] + collect(RoomType::cases())->mapWithKeys(fn($e) => [$e->value => $e->labels()])->toArray(); } public function openModal($branch_id = null) { - $this->branchName=Branch::where('id',$branch_id)->first()->name; - $this->rooms = Room::where('branch_id',$branch_id)->get(); + $this->branch_id = $branch_id; + $branch = Branch::find($branch_id); + $this->branchName = Branch::find($branch_id)?->name ?? ''; $this->showModal = true; } + public function closeModal(){ + $this->showModal = false; + $this->branch_id = 0; + } public function render() { - return view('livewire.admin.room-grid'); + $rooms = Room::where('branch_id', $this->branch_id)->get(); + // 取得樓層 + $floors = $rooms->pluck('floor')->unique()->sort()->values()->toArray(); + + return view('livewire.admin.room-grid',['rooms' =>$rooms,'floors' =>$floors]); } } diff --git a/app/Models/Room.php b/app/Models/Room.php index 2a07725..6ea6aa3 100644 --- a/app/Models/Room.php +++ b/app/Models/Room.php @@ -11,6 +11,8 @@ use App\Traits\LogsModelActivity; * schema="Room", * type="object", * @OA\Property(property="id", type="integer", example=16), + * @OA\Property(property="floor", type="integer", example="1"), + * @OA\Property(property="type", ref="#/components/schemas/RoomType"), * @OA\Property(property="name", type="string", example="pc102"), * @OA\Property(property="internal_ip", type="string", example="192.168.11.7"), * @OA\Property(property="port", type="int", example="9000"), @@ -25,6 +27,8 @@ class Room extends Model use HasFactory, LogsModelActivity; protected $fillable = [ + 'floor', + 'type', 'name', 'internal_ip', 'port', @@ -39,6 +43,8 @@ class Room extends Model ]; protected $casts = [ + 'floor' => 'int', + 'type' => \App\Enums\RoomType::class, 'name' => 'string', 'internal_ip' =>'string', 'port' => 'int', diff --git a/app/Models/User.php b/app/Models/User.php index 017a9f8..355ea70 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -52,6 +52,7 @@ class User extends Authenticatable protected $hidden = [ 'password', 'remember_token', + 'api_plain_token', ]; /** diff --git a/database/migrations/0001_01_01_000000_create_users_table.php b/database/migrations/0001_01_01_000000_create_users_table.php index a3937df..b74937d 100644 --- a/database/migrations/0001_01_01_000000_create_users_table.php +++ b/database/migrations/0001_01_01_000000_create_users_table.php @@ -22,6 +22,7 @@ return new class extends Migration $table->timestamp('email_verified_at')->nullable(); $table->string('password'); $table->rememberToken(); + $table->text('api_plain_token')->nullable(); $table->timestamps(); }); diff --git a/database/migrations/2025_04_23_052656_create_FavoriteSongs_table.php b/database/migrations/2025_04_23_052656_create_FavoriteSongs_table.php new file mode 100644 index 0000000..84003eb --- /dev/null +++ b/database/migrations/2025_04_23_052656_create_FavoriteSongs_table.php @@ -0,0 +1,37 @@ +id(); + $table->unsignedBigInteger('songNumber'); + $table->string('userPhone', 10); + $table->timestamps(); + }); + // 預塞一筆資料 + DB::table('FavoriteSongs')->insert([ + 'songNumber' => 999996, + 'userPhone' => '0912345678', + 'created_at' => now(), + 'updated_at' => now(), + ]); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('FavoriteSongs'); + } +}; 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 deleted file mode 100644 index b1779bc..0000000 --- a/database/migrations/2025_04_23_052656_create_user_song_table.php +++ /dev/null @@ -1,33 +0,0 @@ -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 81466a9..5e4a026 100644 --- a/database/migrations/2025_05_06_055307_create_rooms_table.php +++ b/database/migrations/2025_05_06_055307_create_rooms_table.php @@ -14,6 +14,8 @@ return new class extends Migration Schema::create('rooms', function (Blueprint $table) { $table->id(); $table->foreignId('branch_id')->constrained()->onDelete('cascade')->comment('關聯分店'); + $table->unsignedTinyInteger('floor')->default(1)->comment('樓層'); // 可根據實際狀況決定預設值 + $table->enum('type',['unset', 'pc','svr'])->default('unset')->comment('包廂類別'); $table->string('name')->comment('包廂名稱'); $table->string('internal_ip')->nullable()->comment('內部 IP'); $table->unsignedSmallInteger('port')->nullable()->comment('通訊 Port'); diff --git a/database/seeders/CreateAdminUserSeeder.php b/database/seeders/CreateAdminUserSeeder.php index 97d063b..de62fe2 100644 --- a/database/seeders/CreateAdminUserSeeder.php +++ b/database/seeders/CreateAdminUserSeeder.php @@ -21,10 +21,19 @@ class CreateAdminUserSeeder extends Seeder 'password' => bcrypt('aa1234') ]); $user->assignRole('Admin'); + $user = User::create([ + 'name' => 'Allen Yan(machine)', + 'email' => 'MachineKTV@gmail.com', + 'phone' => '0900000001', + 'birthday' => now()->toDateString(), + 'password' => bcrypt('aa147258-') + ]); + $user->assignRole('Machine'); + $user = User::create([ 'name' => 'Allen Yan(User)', 'email' => 'allen.yan@gmail.com', - 'phone' => '0900000001', + 'phone' => '0900000002', 'birthday' => now()->toDateString(), 'password' => bcrypt('aa1234') ]); diff --git a/database/seeders/PermissionTableSeeder.php b/database/seeders/PermissionTableSeeder.php index dd21ddf..defc491 100644 --- a/database/seeders/PermissionTableSeeder.php +++ b/database/seeders/PermissionTableSeeder.php @@ -40,6 +40,12 @@ class PermissionTableSeeder extends Seeder $adminRole = Role::firstOrCreate(['name' => 'Admin']); $adminRole->syncPermissions(Permission::all()); + $machineRole = Role::firstOrCreate(['name' => 'Machine']); + $machineRole->syncPermissions([ + 'room-list', + 'room-create', + 'room-edit', + ]); // 建立 User 角色,不給任何權限 Role::firstOrCreate(['name' => 'User']); } diff --git a/resources/views/components/room-card-svr.blade.php b/resources/views/components/room-card-svr.blade.php new file mode 100644 index 0000000..134097d --- /dev/null +++ b/resources/views/components/room-card-svr.blade.php @@ -0,0 +1,16 @@ +@php + use App\Enums\RoomStatus; + $statusColors = [ + 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->status->labels() }} +
+
\ No newline at end of file diff --git a/resources/views/components/room-card.blade.php b/resources/views/components/room-card.blade.php index 8ee409e..d91d1c2 100644 --- a/resources/views/components/room-card.blade.php +++ b/resources/views/components/room-card.blade.php @@ -10,7 +10,7 @@
-
{{ $room->name }}
+
{{ $room->type->labels().".".$room->name }}
{{ $room->status->labels() }}
diff --git a/resources/views/livewire/admin/room-grid.blade.php b/resources/views/livewire/admin/room-grid.blade.php index c086342..892470b 100644 --- a/resources/views/livewire/admin/room-grid.blade.php +++ b/resources/views/livewire/admin/room-grid.blade.php @@ -1,22 +1,59 @@ - + - - {{$branchName}} - 包廂設定 + {{ $branchName }} - 包廂設定 -
- @forelse($rooms as $room) - - @empty -
尚無包廂資料
- @endforelse +
+ {{-- 樓層 Tab --}} +
+ @foreach($floors as $fl) + + @endforeach +
+ + {{-- 類別 Tab --}} +
+ @foreach(['all' => '全部', 'pc' => 'PC', 'svr' => 'SVR'] as $value => $label) + + @endforeach +
+ + {{-- 房間卡片列表 --}} +
+
+ @forelse($rooms as $room) + + @empty +
尚無包廂資料
+ @endforelse +
+
+ \ No newline at end of file diff --git a/resources/views/livewire/profile/new-token-form.blade.php b/resources/views/livewire/profile/new-token-form.blade.php index 49a8f2c..36e25e3 100644 --- a/resources/views/livewire/profile/new-token-form.blade.php +++ b/resources/views/livewire/profile/new-token-form.blade.php @@ -24,6 +24,8 @@ new class extends Component $token = $user->createToken($this->tokenName, $abilities); $this->token = $token->plainTextToken; + $user->api_plain_token=$this->token; + $user->save(); $this->loadTokens(); session()->flash('status', 'Token created!');