python-django電商項目需求分析
1.用戶模塊
1)注冊頁
- 注冊時校驗用戶名是否已被注冊。
- 完成用戶信息的注冊。
- 給用戶的注冊郵箱發送郵件,用戶點擊郵件中的激活鏈接完成用戶賬戶的激活。
2)登錄頁
- 實現用戶的登錄功能。
3)用戶中心
- 用戶中心信息頁:顯示登錄用戶的信息,包括用戶名、電話和地址,同時頁面下方顯示出用戶最近瀏覽的商品信息。
- 用戶中心地址頁:顯示登錄用戶的默認收件地址,頁面下方的表單可以新增用戶的收貨地址。
- 用戶中心訂單頁:顯示登錄用戶的訂單信息。
4)其他
- 如果用戶已經登錄,頁面頂部顯示登錄用戶的信息。
所以這個模塊有5個頁面
- 注冊頁
- 登錄頁
- 用戶中心-信息頁
- 用戶中心-地址頁
- 用戶中心-訂單頁
2.商品相關
1)首頁
- 動態指定首頁輪播商品信息。
- 動態指定首頁活動信息。
- 動態獲取商品的種類信息並顯示。
- 動態指定首頁顯示的每個種類的商品(包括圖片商品和文字商品)。
- 點擊某一個商品時跳轉到商品的詳情頁面。
2)商品詳情頁
- 顯示出某個商品的詳情信息。
- 頁面的左下方顯示出該種類商品的2個新品信息。
3)商品列表頁
- 顯示出某一個種類商品的列表數據,分頁顯示並支持按照默認、價格、和人氣進行排序。
- 頁面的左下方顯示出該種類商品的2個新品信息。
4)其他
- 通過頁面搜索框搜索商品信息。
所以這個模塊有四個頁面:
- 首頁
- 商品詳情頁
- 商品列表頁
- 搜索結果頁
3.購物車相關
- 列表頁和詳情頁將商品添加到購物車。
- 用戶登錄后,首頁,詳情頁,列表頁顯示登錄用戶購物車中商品的數目。
- 購物車頁面:對用戶購物車中商品的操作。如選擇某件商品,增加或減少購物車中商品的數目。
所以這個模塊就只有一個頁面:
- 購物車頁面
4.訂單相關
- 提交訂單頁面:顯示用戶准備購買的商品信息。
- 點擊提交訂單完成訂單的創建。
- 用戶中心訂單頁顯示用戶的訂單信息。
- 點擊支付完成訂單的支付。
所以這個模塊就只有一個頁面:
- 訂單頁面
####################################################################
架構設計的注意點:
注意1:前后端問題
上面都是講的前段的內容,但是除此之外還有后台管理的頁面,添加商品,管理我網站上面要顯示的內容,
實際的公司里面開發項目,django有后台管理的模塊,可以管理頁面,但是像電商大型的項目,不會使用這個django后台,會專門開發后台管理頁面,
那django的后台什么時候用?有一個項目你想要很快的做出來,就可以使用這個django后台先搭起來,
或者一個博客,或者做一個新聞類型的網站,你可以使用它的后台管理頁面,
這個項目就是使用的django的后台管理功能,
注意2:數據庫使用問題
實際開發中都會使用mysql數據庫,這是使用最多的,
但是如果用戶量非常大,會把常用的數據,或者是頁面放到緩存里面,為什么?比如首頁,首頁的商品信息是數據庫來的,但是展示的商品很長時間才動,
如果訪問人非常多,比如1萬人就要從數據庫查1萬次,就太頻繁了,所以會把頁面放到緩存里面,放到緩存的服務器里面,
而且用戶來了之后需要存用戶的session信息,如果用戶非常大,你要不停的查數據庫,所以還需要一個session的服務器,提高它的效率,
使用到的緩存數據庫就是Redis數據庫,內存型的數據庫,這就是最常用的場景,使用Redis數據庫,作為我們的緩存服務器,和session服務器,
注意3:異步任務處理問題
除此之外還需要異步的任務處理,比如注冊之后,發送給用戶一個郵件,這種比較耗時,就需要一個異步的任務處理,使用celery來異步處理這種耗時的任務,
注冊之后,交給celery發郵件,不應該用戶操作頁面,該干什么干什么,就體驗很好,
注意4:分布式文件存儲問題
除此之外還涉及到商品的圖片,對於一個大型的網站,涉及到很多的商品圖片,django本身上傳圖片,它的效率是很低的,
在我們的這個項目中,就不再使用django默認的這個圖片上傳的處理,我們使用一個分布式文件儲存系統,幫助我們存儲圖片,
這個系統叫fastdfs,這個分布式文件存儲系統是一個淘寶的使用的一個系統,后來開源了,后來很多的電商網站就使用這個系統,
######################################################################################
數據庫設計
這是非常重要的一環
用戶表:ID,用戶名,密碼,郵箱,激活標識(表示用戶是否被激活),權限標識(因為你要把管理員和普通用戶放在一張表)
地址表:ID,收件人,收件地址,郵編,聯系方式,是否默認(默認收貨地址),用戶ID(和用戶是1對多的)
商品SKU表:ID,名稱,簡介,價格,單位,庫存,銷量(不放這也可以計算出來,但是按照人氣排序,就是使用銷量,可以減少關聯的操作,就不用統計了,)
商品詳情,圖片(還是要記錄一張,否則每次都要連表查效率低,這就是以空間換時間),狀態(上下架),SPUID,種類ID,
商品SPU表:ID,名稱,詳情,
商品種類表:ID,種類名稱,logo(這是種類前面的小logo),圖片(這是種類的展示圖片)
商品圖片表:ID,圖片,SKUID(和商品一對多,一個商品有多個圖片)
首頁輪播商品表:ID,SKUID(你是輪播的哪一個商品),圖片(這是一個大banner),index(可以控制展示的順序)
首頁促銷活動表:ID,活動圖片,活動的url地址(跳轉的可能不是一個商品,而是一個活動地址),index(可以控制展示的順序)
首頁分類商品展示表:ID,SKUID(我要展示哪一個商品),種類ID,index(可以控制展示的順序),展示標識(比如1是展示成圖片,0是展示成標題)
購物車功能:Redis實現購物車功能,並不打算建一個表,因為每次點擊加商品和減商品,都要操作數據庫,驗證庫存,這樣可以使用Redis緩存,
但是我有疑問,為什么每次都要去校驗呢?體驗好,不然就是你要在提交的時候才知道庫存不足,
至於怎么使用Redis放數據,實現購物車的功能,后續再說,
訂單信息表:ID,訂單ID,收獲地址ID,用戶ID(誰下的單),支付方式,商品的總數目(根據運營需求來,加上可以利於分析數據,不加也可以),
總金額(可以不加,但是加上有利於分析數據),運費,支付狀態,訂單創建時間,
訂單商品表:ID,訂單ID,SKUID,商品數量,商品價格(因為價格會變動,所以一定要記錄),訂單和商品是一對多,一個訂單可以多個商品,評論
用戶瀏覽歷史記錄:還是保存在Redis數據庫中,
所以設計表的時候有一個套路,就是一旦發現有一對多的關系,就要分成兩個表,
表在設計之前是需要仔細斟酌的,不可能今天該,明天該,不會頻繁變動,
-------------------------------------------
電商里面SKU與SPU概念
SPU = Standard Product Unit (標准產品單位)
SPU 是商品信息聚合的最小單位,是一組可復用、易檢索的標准化信息的集合,該集合描述 了一個產品的特性。通俗點講,屬性值、特性相同的商品就可以稱為一個 SPU。
例如:iphone7 就是一個 SPU,與商家,與顏色、款式、套餐都無關。
SKU=stock keeping unit(庫存量單位)
SKU 即庫存進出計量的單位, 可以是以件、盒、托盤等為單位。
SKU 是物理上不可分割的最小存貨單元。在使用時要根據不同業態,不同管理模式來處理。 在服裝、鞋類商品中使用最多最普遍。
例如:紡織品中一個 SKU 通常表示:規格、顏色、款式。
舉例:iPhone7是一個SPU,但是白色iPhone7是一個sku,黑色iPhone7也是一個sku,
######################################################################################
項目框架搭建
我需要自己實現這個項目搭建
1,新建django項目,使用命令行創建沒有templates這個文件夾,需要手動創建,
2,一個模塊就有一個應用app,所以有四個app,
3,項目配置:app配置,數據庫配置,語言時區配置,templates路徑配置,static路徑配置,
查看Django的版本,可以直接在控制台進入Python解釋器,輸入print(django.VERSION),或者輸入python -m django --version,都可以實現查看Django版本。
D:\AI\dailyfresh>python -m django --version
File——Setting——project:項目名——project interpreter——雙擊Django,勾選Specify 再右邊下拉選需要的版本,最后Install Package就可以了
4,開始url編寫對應關系,這個url的地方最好使用反向解析的方式,這樣改動路徑不用大量更改代碼
5,定義一個db/base_model.py的文件,一個數據表的基類,給每一個表增加三個字段,
6,按照一個富文本編輯器,pip install django-tinymce
7,配置文件加上一句:
# 加上這句表里的字段都是一樣的,就是不在使用django提供的auth_user表,而且使用自己的,
AUTH_USER_MODEL = 'user.User'
這樣基本的項目框架就搭好了,
注意:
在新版本Django2.x中,url的路由表示用path和re_path代替,
模塊的導入由django1.x版本的
from django.conf.urls import url,include
變成現在的Django2.x中的
from django.urls import path, re_path, include