自問自答系列——商城相關

Jouzeyu發表於2019-09-23

前情提要:最近想做個賣個人想法的網站,姑且可以稱為頭腦風暴聚集地。每個人都有一些新奇的想法,過一段時間就忘了,為什麼不出售他們呢?OK,有點脫離主題了,因為想自己做一個簡單的商城玩玩,順便用下Laravel的新版本(喜歡嚐鮮),稍微總結一下。

問題丟擲:商品的表應該怎麼設計?

一般情況下,我個人習慣將商品資訊和規格分成兩張表。商品資訊表(記錄除規格的相關資訊)和商品規格表(記錄規格)。瞭解商品與商品 SKU 的關係的一般都會將商品的資訊和規格(單品)分開,當然不是絕對的,曾經有人爭論過,這裡不多說。

問題丟擲:訂單號生成應該注意哪些?

一般來說,訂單號都是年月日時分秒+隨機數生成的。隨機數位數的多少在於併發考慮,比如,每秒10萬訪問量,就是6位隨機數。那有沒有可能重複呢?當然是有可能得,萬一同一秒隨機出兩個一樣的呢對不對,所以我們可以把生成的這個過程放在一個for迴圈裡面,然後再去資料庫裡面查詢加以判斷。

public static function creatNo()
    {
        // 訂單流水號字首
        $prefix = date('YmdHis');
        for ($i = 0; $i < 10; $i++) {
            // 隨機生成 6 位的數字,不足6位的在右邊補0
            $no = $prefix.str_pad(random_int(0, 999999), 6, '0', STR_PAD_RIGHT);
            // 判斷是否已經存在,如果不存在返回訂單號,存在記錄日誌
            if (!static::query()->where('no', $no)->exists()) {
                return $no;
            }
        }
        \Log::warning('find order no failed');

        return false;
    }

問題丟擲:生成訂單的時候應該考慮哪些因素?

當我們建立訂單的時候,我們首先應該考慮訂單號有沒有重複,當然這個我們在生成訂單號的時候已經判斷了。接著我們應該考慮商品存不存在,商品有沒有上架,商品有沒有庫存,最後再判斷購買的數量我們的庫存是否不足。這些不太建議寫在Controller裡面,這可能會造成控制器的臃腫,我們可以寫在Request裡面。

問題丟擲:下單後不支付該怎麼處理?

這裡我們可以用佇列任務,比如設定半小時不支付就關閉訂單。我想這個處理方法時比較好的。

問題丟擲:控制器太臃腫怎麼辦?

推薦使用Service 模式,推薦一篇文章如何使用Service模式?

歡迎指正;歡迎補充;歡迎留言 ——@Jouzeyu

本作品採用《CC 協議》,轉載必須註明作者和本文連結
空舟湖上~      ——Jouzeyu

相關文章