iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Software Development

持續進化論系列 第 15

DAY15 - 山寨 NETFLIX

  • 分享至 

  • xImage
  •  

想要馬上製作一個成品出來我覺得會有點困難,所以還是來臨摹網路上有名的作品吧,畢竟創造一定始於模仿,有足夠的實力才能做出自己想像中的東西,而我這次選定的目標為 NETFLIX。
https://ithelp.ithome.com.tw/upload/images/20220915/20115048Op5aIuCih7.png

將 NETFLIX 的首頁點開,事實上如果打開 Chrome 的 Network 來看進入首頁後的 Request 可以獲得很多資訊,進而更快的揣摩出該網站的架構,但這樣的做法好像又缺乏了一點想像力,所以這次的作品不會利用 Network 來抄答案,完全由自己來做需求及架構分析,映入眼簾的即是非常多的影集可以選擇,很好,前一句話聽起來非常像廢話,就像一個便當吃不夠那就吃兩個一樣廢,但偶爾講講幹話愉悅一下自己也是蠻好的。
https://ithelp.ithome.com.tw/upload/images/20220915/20115048mcPz9uGNqF.jpg
https://ithelp.ithome.com.tw/upload/images/20220915/20115048Ml7LcP2gWs.jpg
https://ithelp.ithome.com.tw/upload/images/20220915/20115048i0undZlC48.jpg

觀察一下可以看出每個影集都會被歸納在不同的類型,如這次截圖的範圍就有「榮登本日台灣 TOP 10 節目」、「{帳號名稱},請繼續觀賞」、「最新發行」、「國際節目」、「現正熱播」、「亞洲電影與節目」等各種分類,這時已經可以聯想到至少 2 個 Model 要做了。

接著可以單選影集來觀察更多的資訊
https://ithelp.ithome.com.tw/upload/images/20220915/20115048VjqIG3MQiz.jpg
https://ithelp.ithome.com.tw/upload/images/20220915/20115048Me5xoAeAJa.jpg

此時可以觀察到同樣在「最新發行」的分類裡卻有兩種不同的顯示模式,經由觀察之後可以發現影集類型的會顯時總集數,而電影類型的會顯示該片總時數,並在向下箭頭則會有不同的提示,其一為「集數與資訊」,其一為「更多資訊」,由此得知影集及電影要記錄不同的資訊,獲得這些資訊之後已經可以先寫一點基本的架構了,由於電影及影集還是有共同的資訊,例如再多集的影集也只會有相同的特徵標籤,如「火熱」、「劇情」、「毒梟」等,所以我打算將片名再往上提一層,影集就是包含多集的影片、而電影則是只有一集的影片,架構如下:

商品(Product):名稱、類型、大綱。
影片(Video):商品id、路徑、前情提要。
特徵(Characteristic):名稱。
分類(Category):名稱。
演員(Actor):名稱。

各個 Model 之間的關聯如下:

商品-影片:一對多
商品-特徵:多對多
商品-分類:多對多
商品-演員:多對多

由於有三個多對多的狀況發生,所以我會選擇多建立三個 Model

商品與特徵關聯(ProductCharacteristic)
商品與分類關聯(ProductCategory)
商品與演員關聯(ProductActor)

php artisan make:model Product -m

Schema::create('products', function (Blueprint $table) {
    $table->id();
    $table->string('name')->comment('商品名稱');
    $table->unsignedInteger('type')->comment('商品種類');
    $table->string('outline')->comment('大綱');
    $table->timestamps();
});

protected $fillable = [
    'name',
    'type',
    'outline',
];

php artisan make:model Video -m

Schema::create('videos', function (Blueprint $table) {
    $table->id();
    $table->unsignedInteger('product_id')->comment('商品id');
    $table->string('path')->comment('影片路徑');
    $table->string('previously')->comment('前情提要');
    $table->foreign('product_id')
        ->references('id')
        ->on('products')
        ->onUpdate('CASCADE')
        ->onDelete('CASCADE');
    $table->timestamps();
});

php artisan make:model Characteristic -m

Schema::create('characteristics', function (Blueprint $table) {
    $table->id();
    $table->string('name')->comment('特徵名稱');
    $table->timestamps();
});
protected $fillable = [
    'name',
];

php artisan make:model Category -m

Schema::create('categories', function (Blueprint $table) {
    $table->id();
    $table->string('name')->comment('分類名稱');
    $table->timestamps();
});
protected $fillable = [
    'name',
];

php artisan make:model Actor -m

Schema::create('actors', function (Blueprint $table) {
    $table->id();
    $table->string('name')->comment('演員名稱');
    $table->timestamps();
});
protected $fillable = [
    'name',
];

php artisan make:model ProductCharacteristic -m

Schema::create('product_characteristics', function (Blueprint $table) {
    $table->id();
    $table->unsignedInteger('product_id')->comment('商品id');
    $table->unsignedInteger('chracteistic_id')->comment('特徵id');
    $table->foreign('product_id')
        ->references('id')
        ->on('products')
        ->onUpdate('CASCADE')
        ->onDelete('CASCADE');
    $table->foreign('chracteistic_id')
        ->references('id')
        ->on('characteristics')
        ->onUpdate('CASCADE')
        ->onDelete('CASCADE');
    $table->timestamps();
});
protected $fillable = [
    'product_id',
    'chracteistic_id',
];

php artisan make:model ProductCategory -m

Schema::create('product_categories', function (Blueprint $table) {
    $table->id();
    $table->unsignedInteger('product_id')->comment('商品id');
    $table->unsignedInteger('category_id')->comment('分類id');
    $table->foreign('product_id')
        ->references('id')
        ->on('products')
        ->onUpdate('CASCADE')
        ->onDelete('CASCADE');
    $table->foreign('category_id')
        ->references('id')
        ->on('categories')
        ->onUpdate('CASCADE')
        ->onDelete('CASCADE');
    $table->timestamps();
});
protected $fillable = [
    'product_id',
    'category_id',
];

php artisan make:model ProductActor -m

Schema::create('product_actors', function (Blueprint $table) {
    $table->id();
    $table->unsignedInteger('product_id')->comment('商品id');
    $table->unsignedInteger('actor_id')->comment('演員id');
    $table->foreign('product_id')
        ->references('id')
        ->on('products')
        ->onUpdate('CASCADE')
        ->onDelete('CASCADE');
    $table->foreign('actor_id')
        ->references('id')
        ->on('actors')
        ->onUpdate('CASCADE')
        ->onDelete('CASCADE');
    $table->timestamps();
});
protected $fillable = [
    'product_id',
    'actor_id',
];

今日的篇幅很長,大部分是為了鋪陳明天的開發,基礎地基也都打好了,萬丈高樓明日起,明天見。


上一篇
DAY14 - Dcat
下一篇
DAY16 - SEEDER x FACTORY x FAKER
系列文
持續進化論30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言