數據庫(MySQL):
account(用戶表;沒有外鍵), profile(用戶側面信息表;有兩個外鍵:catid,username),
category(寵物總分類表--魚;沒有外鍵), product(寵物小分類表--金魚;有一個外鍵:catid),
item(具體寵物分類--鳳尾龍睛;有一個外鍵:productid), orders(訂單表;沒有外鍵),
cart(購物車表;有兩個外鍵:itemid,orderid; 主鍵:itemid 和 orderid作為聯合主鍵)
account (用戶表) 和 profile (用戶的輔助信息;側面信息) 是一對一關系。
//profile里有一個外鍵(username) 與 account里的主鍵(username)相對應。account沒有外鍵。
category (寵物總分類表) 和 profile (用戶側面信息表) 是 多對多關系。//一類寵物可以有多個買家,買家也可以買多類寵物。
//profile里有一個外鍵(catid) 與 category 里的主鍵(catid)相對應。category 沒有外鍵。
category (寵物總分類表) 和 product(寵物小分類) 是 一對多關系。//一類寵物有多個品種。
//product里有一個外鍵(catid) 與 category 里的主鍵(catid)相對應。category 沒有外鍵。
product(寵物小分類) 和 item(具體寵物分類) 是一對多關系。//一類品種下的一只只狗。
//item里有一個外鍵(productid) 與 product里的主鍵(productid)相對應。
cart(購物車) 和 item(具體寵物分類) 是 一對多關系。
//cart里有一個外鍵(itemid) 與 item里的主鍵(itemid)相對應。
cart(購物車) 和 orders(訂單表) 是 一對一關系。
//cart里有一個外鍵(orderid) 與 item里的主鍵(orderid)相對應。
用到的技術:
Spring + SpringMVC + MyBatis + Freemarker + MySQL
實現的功能:
登錄、注冊(Spring校驗)、查詢寵物(總分類、小分類、具體分類)、購物車
業務邏輯:
orders表里有一個orderdate字段,該字段為空表示沒有結賬。
cart表里itemid 和 orderid作為聯合主鍵:也就是說同一張表里不能有相同的寵物具體分類,如果想訂多個,用quantity字段控制(多次買合並,quantity+1)。
最開始是index頁(從control層跳轉過來的)
直接點進入商店 左上角顯示游客(session為空)
右上角登錄 登錄失敗顯示紅字 登錄成功跳轉到商店頁面 並顯示名字
注冊:在下拉框(異步的)顯示所有寵物大分類.(Spring 校驗)。
進入商店后,顯示寵物大分類(category),點擊進入后顯示該大分類下的寵物小分類(product);
再點擊進入寵物小分類里是具體寵物分類(item):該頁面有寵物的簡單信息,可以點擊加入購物車直接加入購物車(並進入購物車頁面),也可以點擊寵物序號進入寵物詳細介紹頁面。
寵物詳細介紹頁面:該頁面也是顯示item表里的數據,只不過信息更詳細,還有寵物的圖片(數據庫里存的是圖像名<#assign ppath=request.contextPath><img src="${ppath}/static/images/${item.product.pic}"> 這樣就取出來了),該頁面也可以把商品加入購物車(並進入購物車頁面)。
購物車頁面:
該頁面顯示已加入購物車內的商品,並且可以改變寵物數量的值或刪除該寵物,然后點擊Update Cart按鈕,合計和總計會計算出相應的值。
這時雖然Orders表里已經產生一筆數據,但是它的orderdate字段為空,表示沒有結賬。
直到點擊下面的按鈕表示提交訂單,orderdate字段才會添加當前時間,表示已結賬並記錄當前時間。
然后頁面返回到剛進入商店時的寵物大分類頁面。
最后附上該項目的源碼: