訂單模組 學習他人程式碼之路
在商城專案中,之前我們介紹了購物車功能模組的實現,商品加入到購物車之後,就是到購物車結算,然後顯示購物車的商品列表,點選去結算,然後到了未提交前的訂單列表,
點選提交訂單後,生成此訂單,返回訂單的訂單號,付款金額,訂單預計到達時間。訂單系統是一個非常重要的系統,我們的移動端、PC端都需要訂單系統,所以這裡我們將訂單系統單獨作為一個服務來,留出介面供客戶單來呼叫
今天我們來看下這個訂單系統到底是如何實現的:
一、訂單系統功能
訂單系統主要包含哪些功能模組呢?
建立訂單功能、檢視訂單列表、根據訂單id查詢訂單的詳細資訊、訂單修改、訂單取消、訂單狀態、訂單評價等功能的實現。
今天我們來看下建立訂單的流程:
二、訂單系統的資料庫表的設計
建立訂單說到底就是向訂單表中新增資料,即insert這些資訊。
下單功能一定要使用關係型資料庫表,保證資料的一致性,因為建立訂單要保證在一個事務(一個事務就是指向資料庫中進行的一種操作:比如插入,刪除等等)裡面,nosql資料庫不支援事務,可能會丟失資料。
我們在網上購物的時候通常這個訂單包含的資訊比較多,所以對於訂單系統如何建立它的資料庫也是非常重要的。建立資料庫遵循資料庫設計的三大正規化原則來設計。
我們建立了三個表:tb_order(訂單資訊表),tb_order_item(訂單詳情表),tb_order_shipping(訂單配送表).
tb_order:這裡包含了訂單的基本資訊
tb_order_item:訂單詳情表:訂單的詳情主要就是購買商品的資訊,通過訂單的id來實現關聯
tb_order_shipping:訂單配送表:
這是三個基本的表,其實還可以有物流資訊表,訂單交易資訊表。這裡我們採用這三張表足夠。
三、訂單系統介面文件,一般我們開發的時候會收到已經寫好的介面文件,比如建立訂單的介面文件。
從上面這個表中,我們可以看到該介面的url,介面的傳入引數和返回值。
接下來我們針對這三個來進行程式碼的編寫:
url屬於controller層,
傳入引數這裡我們可以看到是資料庫建立的三張表資訊:第一個是tb_order,第二個是一個集合式的訂單明細List,第三個是訂單的配送資訊表。
所以傳入引數就是這三個物件。這裡我們是編寫介面,供客戶端呼叫,至於客戶端怎麼將這些引數傳遞過來,那是客戶端團隊考慮的事情。
返回值這裡使用了taotaoresult來包裝了下,因為我們提交訂單成功後,返回的是訂單號,即訂單的id所以,我們需要向客戶端傳遞訂單id過去,並顯示在訂單建立成功的頁面。
下面看下訂單服務介面的service層的實現:
service層的主要實現是將訂單資訊新增到資料庫中,即接收controller傳遞過來的物件,然後補全頁面沒有的欄位,insert資料庫,這裡可以使用逆向工程生成的dao。
另外還有個問題:
訂單編號:訂單編號用什麼形式比較好呢?
解決方案一(不能使用):
使用mysql的自增長。
優點:不需要我們自己生成訂單號,mysql會自動生成。
缺點:如果訂單表數量太大時需要分庫分表,此時訂單號會重複。如果資料備份後再恢復,訂單號會變。
方案二:日期+隨機數
採用毫秒+隨機數。
缺點:仍然有重複的可能。不建議採用此方案。在沒有更好的解決方案之前可以使用。
方案三:使用UUID
優點:不會重複。
缺點:長。可讀性查。不建議使用。
方案四:可讀性好,不能太長。一般訂單都是全數字的。可以使用redis的incr命令生成訂單號。
優點:可讀性好,不會重複
缺點:需要搭建redis伺服器。
所以我們選取方案四作為生成訂單號的方案。
那麼service層的編碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
相關推薦訂單模組 學習他人程式碼之路在商城專案中,之前我們介紹了購物車功能模組的實現,商品加入到購物車之後,就是到購物車結算,然後顯示購物車的商品列表,點選去結算,然後到了未提交前的訂單列表, 點選提交訂單後,生成此訂單,返回訂單的訂單號,付款金額,訂單預計到達時間。訂單系統是一個非常重要的系統, 《程式設計珠璣》程式碼之路1:學習位操作的神器----點陣圖排序(附解決程式設計師心理問題的門路)最近由於“閒書”讀太多,不少朋友以為我要轉當產品經理了,故想起來把最近讀的《程式設計珠璣》以及自己編寫的程式碼整理成部落格,用程式碼證明自己的清白。雖然自己比較菜不能和Google和ACM金牌大佬PK技術,作為一隻老年菜雞ACMer,經常一頓操作猛如虎,一看戰績0AC。 但相信對於剛入門的小夥伴 《程式設計珠璣》程式碼之路16:直觀感受為何程式設計師需要學習經典演算法作為一名老年ACM菜雞,經常見到周圍除了調庫啥也不會的程式設計師,還經常一臉正經的說:“程式設計師就是把人家寫好的東西拿出來呼叫一下,頂多改改嘛。”。emmmm,在這個貓貓狗狗都能養活自己的年代,這麼想確實沒問題 ---- 如果你確定自己不用面臨被淘汰的風險,或者在別的領域能首屈一指。 大家應該 在此建立博客,記錄學習編程之路學習學習編程純屬愛好,不打算當成一門職業,就是別人追劇、吃飯聊天時,我編編程放松一下,不苛求,慢慢來,想通過編程鍛煉自己兩個技能:1)踏實地一點點積累2)做好細節,不驕不躁當然,目標是完成一個小項目,在此積累知識,不知道什麽時候能完成。加油。2017.09.30本文出自 “程序員是上帝” 博客,謝絕轉載!在此 《程式設計珠璣》程式碼之路2:騷!陣列不初始化直接訪問不出錯還很秀!!!作為一隻程式設計師,肯定經常申請空間對吧,申請完的空間我們首先要初始化,然後再進行操作。 好了問題來了,初始化時需要時間的,尤其是申請的空間大了,那初始化將非常耗時。 那我能不能不全部初始化?用哪個初始化哪個呢? 我們知道不初始化的話,記憶體裡面存的東西都是隨機的,用哪個初始化哪個,你怎 《程式設計珠璣》程式碼之路19:堆的概念和隱式堆實現堆是用來表示元素集合的一種資料結構,它有兩個性質(大頂堆和小頂堆差異就一個符號,本文不詳細討論): 1:任何節點都小於或等於其子節點的值。 2:最多在最後一層和倒數第二層才有葉節點,而且儘可能靠左側分佈。 以上的性質,使得堆可以實現logn級別的插入和刪除操作,查詢最小值同樣也是logn 《程式設計珠璣》程式碼之路18:用點陣圖和“箱”更快更省空間地儲存和查詢數字有一個看起來很簡單的問題:如何儲存一波隨機整數,使得查詢和儲存效率儘可能高? 通常的辦法自然是陣列和連結串列,當然如果這麼玩,那部落格就沒必要寫了2333333。 一個32位整數int正常來說有32位,每種語言都有所不同,如果只是儲存和查詢數字的話,其實這是非常浪費的,而且是幾十倍的浪費。 《程式設計珠璣》程式碼之路17:如何產生指定概率的隨機不重複大數我們都知道,C語言函式庫的隨機函式應用範圍十分有限,RAND_MAX也就2^15那麼大,如果單純的擴充套件範圍,那麼精度自然就是問題了,不僅如此,在RAND_MAX不夠大的情況下,產生小於指定數的精度也是非常受限的。所以本文: 1:會實現一個最大能到2^30,精確的隨機函式。 2:會用不同思 《程式設計珠璣》程式碼之路15:節省空間的常見姿勢1:地理資訊庫中儲存鄰居的系統 地理資訊庫中的鄰居用一個點(x, y)表示,x和y在[0,199]取值,假設一共有兩千個,那麼可以用一個200*200的二位格子矩陣表示,還可以作成圖形介面,使用者點選那個格子,系統把點選訊號轉化成對應的x和y,就可以直接訪問相應鄰居,如下圖所示,格子為空表示空值 《程式設計珠璣》程式碼之路14:兩個不會演算法也能把效率提升4倍的小套路現在我們假設要在沒排序的陣列中找一個數: 菜狗也能寫出如下的演算法1: 找到了我就返回位置,否則我就返回-1。 int search1(){ for (int i = 0; i < MAXN; ++i){ if (nums[i] == VALUE){ return i; 《程式設計珠璣》程式碼之路13:陣列如何線上性時間內實現多次區間修改給一個數組,每次對某個區間增加某個值,如何線上性時間內完成。 比如一個數組,剛開始都是0吧,如下表,第一行是下標: 0 1 2 3 4 5 6 7 0 0 《程式設計珠璣》程式碼之路12:如何用C/C++實現array[-1]並利用它寫出優美的程式碼我們就以最大子陣列和為例: 最大子段和問題:給一組數,計算最大子段和。 在部落格:最大欄位和的6種解法,解法三中,我們提到了儲存前i項和的操作: cache[i]代表前i-1項之和,因為在c/c++中,cache[-1]會越界,所以如果用cache[i]代表前i項和的話,那麼在用遞推公式 《程式設計珠璣》程式碼之路11:最大子陣列和問題,花式七種解法給一個一維陣列,有正數也有負數,求最大子陣列和是多少。 這是《程式設計珠璣》第八章探討的一個主要問題,也是平時刷題和各大廠面試的常客。 作為這麼經典的一個問題,要是老生常談,那就沒什麼意義了,這裡為大家帶來七種解法,其中更有一個最優複雜度的線性演算法,博主在各大廠面試的時候,碰到的面試官也非 《程式設計珠璣》程式碼之路10:little定律,一個和生活息息相關的結論今天,同學聚會,喝了十瓶啤酒,死皮賴臉的要了一個哥們的電腦,保證自己不會吐上邊哈哈。 哈哈,好啦,進入正題: Little定律:系統中物體的平均數量等於物體離開系統的平均速率和物體在系統中平均停留時間的乘積。 和大部分定律一樣,乍眼看去,一點用沒有。 現在給出下面一個場景:一個可以容 《程式設計珠璣》程式碼之路9:請粗略估計,200萬一個值和一個指標的結構體能否存入128MB記憶體。這個問題是《程式設計珠璣》第七章的一個問題。主要就是說像一個結構體中包含一個int和一個char,加起來是5個位元組,但因為位元組對齊的需要,實際會佔用8位元組。就這麼多麼? 作為經典鉅著,當然不會這麼一點點啦。 看下圖: 這幅圖是告訴我們,一個對齊後sizeof()列大小的結構體 《程式設計珠璣》程式碼之路8:自動化測試這次的內容會比較輕鬆,一段程式碼寫好了,如何保證它是正確的? 比如就寫好了一個二分查詢吧,確定它正確?手動的話,估計是個正常人10次就哭了。所以如果能自動執行的話,那就很開心了。 為了做到自動化測試,我們需要用到下面語句: assert(i >= 0):在i大於或者等於0的時候正常 《程式設計珠璣》程式碼之路7:這個演算法全世界程式設計師16年才寫對,你肯定想不到竟然是這個這篇部落格要講的演算法,是個有故事的演算法,大家一定會喜歡的: 有這麼一個演算法: 1:業界巨佬經典鉅著《程式設計珠璣》的作者,在課堂上給出了思想,不限時間讓程式設計師們實現,所有的程式設計師在提交的時候都覺得自己寫的是對的,然而結果是即使是高階程式設計師,90%以上的人都寫錯了。 2: 《程式設計珠璣》程式碼之路6:將邏輯和程式碼分離----編碼形式圖形化輸出字母好啦比如字母I,輸出為: xxxxxxxxx xxxxxxxxx xxxxxxxxx xxx xxx &nb 《程式設計珠璣》程式碼之路5:格式信函程式設計----將資料和程式碼分開的好處我們開啟一些網站,經常會看到不同客戶專屬資訊,例如: Welcome back, Jane! We hope that you and all the members of the Public family are constantly reminding your neighbers the 《程式設計珠璣》程式碼之路4:變位詞集合完整程式碼字典的變位詞集合:變位詞就是由相同的字母的不同順序組成的單詞,例如pots和stop就是變位詞,按構成字母順序排序的opst就是他兩的標誌。 現在給一個字典,把變位詞一起輸出: 例如一個字典: pans pots opt snap stop tops 那麼對應的標誌分別是: an |