1. 程式人生 > >Django()-----對美多商城專案的總結

Django()-----對美多商城專案的總結

碼雲:https://gitee.com/ming_cpp/meiduo18

美多商城商業模式:

C2B模式(消費者到企業的商業模式),相類似網站包括:京東,淘寶,海爾商城,尚品宅配等。

商城需求分析*

1,使用者部分
2,商品部分
3,購物車部分
4,商品訂單備份
5,使用者支付部分
6,上執行緒序的配置

使用者部分模組:

基本功能:使用者註冊,登入,密碼的重置,第三方登入
使用者註冊
1,圖片驗證碼
流程分析:

		1,前端生成uuid隨機字串
		
		2,後端生成圖片驗證碼傳送給前端,將圖形驗證碼的存入到redis中

2,簡訊驗證碼

	1,檢查圖片的驗證碼
	2,檢驗是否是在60s內是否已經發送過
	3,生成簡訊驗證碼
	4,儲存傳送的簡訊驗證碼
	5,傳送簡訊(第三方平臺傳送:雲通訊)

3,判斷使用者名稱是否存在

	1,使用者輸入使用者名稱之後ajax區域性重新整理頁面
	2,後臺查詢資料庫使用者是否存在
	3,返回資料給前端
	4,判斷手機號碼是否已經存在

同3

技術點:前後端的域名不相同,涉及到csrf跨站請求偽造的問題;
Csrf相關概念:

1,域=協議+域名+埠,在兩個域中,以上三者中任意一個條件不同,均涉及到跨域的問題;

2,瀏覽器的策略

1,對於簡單的請求,瀏覽器傳送請求,但是得到請求之後會檢驗響應頭中是否有當前的域中,如果沒有則會在瀏覽器中報錯;
2,對於複雜的請求,瀏覽器會先發送一個option請求,詢問伺服器是否支援跨域,如果響應頭中的域名允許,才會傳送相對應的請求來獲取資料,並交給js進行處理。

3,Python的django中的跨域處理的相關模組django-cors-headers

**技術點:前端使用者將圖片驗證碼傳送給後臺之後,第三方平臺傳送簡訊的過程中會有網路的阻塞程式繼續往下執行,進而影響使用者體驗效果;

解決方案:採用celery進行簡訊驗證碼的非同步傳送;**
Celery概念:分散式非同步任務佇列排程框架:

1,支援定時任務和非同步任務兩種方式
2,組成:大概分為四個部分client客戶端傳送資料,broker中介軟體(redis資料庫,訊息佇列),worker(任務的執行者),backend(執行worker任務的執行結果)
3,可以開啟多程序也可以是多執行緒
4,應用場景:在某一個任務的執行過程中,會涉及到耗時的操作,但是這個耗時操作並不會影響後續的程式的執行,此時就可以用celery來非同步執行這些任務;

使用者登入

JWTtoken的相關了解
cookies的使用目的

1.http協議本生是一種無狀態的協議,假如使用者每次傳送請求過來將使用者名稱和密碼在後端進行驗證後才可以登入到某些介面才可以進行操作,當客戶端再次請求伺服器時,又要重新進行認證;

2.解決方法:在客戶端設定cookie並在本地設定session儲存使用者的敏感資訊,從而來記錄當前使用者登入的狀態,如果使用者量再次請求伺服器,將cookie帶給伺服器,伺服器查詢session獲取使用者資訊,進行下一步操作。

3.客戶端比較多的情況下,seession中預設會存在記憶體,隨著使用者量的增加伺服器的壓力就會變大;

傳統的cookies顯示出來的問題

  • 在現在的市場各種不同的瀏覽器,對同一個網站進行,使用者的每種裝置都需要維護相關的session在伺服器端,會造成伺服器資源的浪費,相關網站採取單點登入來記錄使用者的狀態狀態來解決以上傳統cookies帶來的問題

單點登入的概念

使用者在不同的裝置中進行登入,伺服器端不用維護使用者的相關資訊,在每次登入的過程中都由客戶端將自己的使用者資訊傳送過來,服務端進行解析來獲取使用者的相關資訊

token認證的機制

1.使用者攜帶使用者名稱和密碼來後端進行驗證
2.伺服器端驗證通過後對為當前使用者生成token
3.將token返回給前端,記錄使用者的資訊
4.使用者再次請求伺服器的時候,服務端解析token相關的資訊,驗證使用者
確定使用者狀態,進行 相關操作

備註:

1.jwt的組成第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload, 類似於飛機上承載的物品),第三部分是簽證(signature).

2.secretkey是儲存在伺服器端的,如果secret key
使用者登入JWT認證的的流程原始碼(待繼續理解)

qq登入

qq登入流程oauth2的認證流程分析

1.使用者向美多網站傳送qq註冊的請求
2.美多網站向用戶返回qq登入的頁面
3.使用者在qq登入的介面向qq的伺服器傳送qq使用者名稱和密碼發起登入的請求
4.qq伺服器認證成功之後將使用者引導到回撥的網址中,並返回給使用者qq伺服器的token值
5.使用者重定向到美多頁面並攜帶了qq伺服器傳送的token
6.後端接收到token後向qq伺服器請求access token
7.qq伺服器返回access token
8.美多伺服器通過access token來向qq伺服器來獲取使用者的openid
9.通過id來查詢使用者是否已經在美多商城註冊
10.使用者已經註冊直接返回使用者的access token值
11.使用者沒有賬號,生成註冊的access token,(載荷openid)重新註冊資訊傳送給後端
12.後端接收到資料之後建立物件並將qq使用者的openid和賬號進行繫結

忘記密碼的功能的實現

1.使用者傳送過來請求,攜帶使用者名稱和圖片驗證碼
2.後端驗證圖片驗證碼,通過賬號查詢使用者,將使用者的電話號碼部分返回給前3.端,並生成傳送簡訊的access token(載荷mobile)值
4.前端填寫手機號碼驗證碼並攜帶access token到後端
5.後端接收到手機號碼校驗(正確性,傳送時間間隔),通過手機號碼站到使用者物件,生成密碼修改的access token(載荷uer obj)值
6.前端使用者填寫新的密碼之後,攜帶access token到後端重置密碼

技能點

djangorestframework中的實現JWT token的模組itsdangerous的使用

使用者中心

個人資訊

個人資訊是使用者的私有資訊,必須是登入使用者才可以訪問,並且值可以訪問自己的相關資訊

1.使用者個人資訊的展示流程
2.前端在頁面被載入完成之後向後端傳送請求使用者資料
3.後端通過rest_framework.permissions.IsAuthenticated判斷使用者是否登入,並獲取使用者的user模型
4.將使用者的詳細資訊返回給前端,在前端進行展示
5.使用者個人中心的資訊中有一項是使用者的郵箱是否啟用

郵箱驗證的流程

	1.使用者填入郵箱點選儲存後端接收到郵箱後非同步發出郵件,連結中包含access token(載荷uer id& email)
	2.郵件中包含token值,在使用者點選郵件中的連結之後向前端傳送啟用的請求
	3.後端驗證access token合法性,DRF中的序列化器update的方法,在序列化器中create方法中將使用者的email欄位更改為啟用狀態
	4.將使用者的物件返回給前端

技術點:
1.django中傳送郵件的配置資訊
2.利用celery來實現非同步的郵件傳送

使用者收貨地址的設定

DRF中序列化器的巢狀
1,DRF中的ReadOnlyModelViewSet中將請求方式與資源狀態進行了繫結,在這裡我們只需要從資料庫中去資料所以直接就可以繼承ModelSerializer這個類
2,view檢視中的action==‘list’(即前端url不帶引數)說明前端要獲取所有的省份
3,view檢視中的action!=‘list’(即前端url帶引數)說明前端要獲取所有的省份底下的行政區劃
4,在這個返回的過程中如果前端頁面返回的url中返回的帶有引數則返回省份

技術點

1.DRF的擴充套件類中的選擇以及序列化器的巢狀呼叫方法
2.對DRF的擴充套件集的理解
3.Views django 中的原始的Views
4.APIView繼承類django中的Views,同時提供了使用者認證,許可權認證,許可權認證,節流認證,分頁,序列化等方法
5.GenericAPIView 繼承了APIView:在這個類中實現了兩個類實行和三個類方法
6.ListModelMixin 實現了list方法與get_queryset(),paginate_queryset,get_serializer
7.ListAPIView 可用的子類GenericAPIView、ListModelMixin 是上面兩種方法的子類
8.ViewSetMixin 實現了view = MyViewSet.as_view({'get': 'list', 'post': 'create'})

訂單模組:

基本功能:提交訂單,我的訂單,訂單評價

提交訂單

  1. FastDFS分散式檔案系統 FastDFS分散式檔案系統,資料冗餘,資料的備份,資料量的儲存擴充套件 tracker
  2. server的作用是負載均衡和排程,可以實現叢集,每個reacker節點的地位平等,收集storage的狀態; storage
  3. server的作用是儲存,不同的組內儲存的內容是不同的,相同的組內儲存的內容是相同的,這樣的設計資料會相對比較安全安全;
    4.無論是tracker還是storage都支援叢集的方式擴充套件,資料的擴充套件比較方便
**檔案上傳的流程**
  • storage server定時向tracker server的上傳儲存狀態資訊 客戶端上傳連結請求 請求會先到達tracker
  • server,tracker server查詢可以呼叫的storage; 返回storage server 的ip和port
  • 上傳檔案到指定的storage server中 srorage server生成file id,並將檔案存入到磁碟中 返回file
  • id給客戶端 儲存檔案資訊

**

docker的理解

1.docker是一種虛擬化的技術,我們可以將docker視為一種容器,在容器的內部可以執行服務,

2.Docker本身是一種C/S架構的程式,Docker客戶端需要向伺服器傳送請求,伺服器完成所有的工作之後返回給客戶端結果;

  • 優點
    • 加速本地開發和構建的流程,在本地可以自己輕鬆的構建,執行,分享所配置好的docker環境
    • 能夠在不同的作業系統的環境中獲取相同的docker容器中的環境,減少了在部署環節中的環境問題待來的麻煩
    • docker可以建立虛擬化的沙箱環境可以供測試使用
    • docker可以讓開發者在最開始的開發過程中在測試的環境中執行,而並非一開始就在生產環境中開發,部署和測試

首頁靜態化的技術

  1. 電商型別的網站首頁的訪問評率較大,每次獲取首頁過程中去對資料庫進行查詢顯然不太合理,除了使用傳統意義上的快取實現之外,我們可以使用首頁靜態化的技術,即將動態生成的html頁面生成儲存成靜態檔案,在使用者訪問的過程中直接將靜態檔案傳送給使用者

  2. 優點:可以緩解資料庫壓力,並且可以提高使用者訪問的網站的速度,提高使用者體驗

3.帶來的問題是:使用者在頁面中動態生成的部分資料如何處理

    1.>在靜態頁面載入完成之後,通過js的程式碼將動態的請求傳送到後天請求資料,但是大部分資料均是靜態頁面中的資料,
    
   2.>靜態生成的頁面因為並沒有實時更新,會出現部分商品的靜態化頁面中的資料和資料庫中實時更新的資料有差異

4.應用場景:經常容易訪問但是,資料的變動並不是太大的一些頁面可以考慮使用靜態化技術
5.難點GoodsCategory,GoodsChannel兩個表格之間的關係設計以及獲取商城商品分類的選單

  1>.首先是GoodsChannel,將所有的商品的頻道取出按照組號和組內順序排序
  2>.排序後將資料以categories[group_id] = {'channels': [], 'sub_cats': []}的形式存入到有個有序的字典中
  3>.channels的值為儲存的是頻道的相關資訊(例如手機,相機,數碼)
  4>.sub_cats中儲存的值是該頻道下的GoodsCategory相關資訊(例如手機通訊,手機配件...相關,根據GoodsChannel資料結構表中頂級類別來查詢子類別)
  5>.分別為頂級類別下的子類別物件新增一個sub_cats的列表,來儲存此類別下的所有GoodsCategory的queryset物件

難點 商品詳情頁面的資料結構

獲取當前商品的規格資訊

 1. 通過sku id來取出此sku商品的SPU對應的所有存在的商品組合 迴圈資料庫中所有的商品選項,將商品的選項與sku

 2.id來做對應,返回上面的資料型別
    
 3. 相同的SPU對應的不同的SKU,返回的specs是相同的,例如如果同屬於手機這個SPU的Iphone6手機和Iphone7手機,返回的specs是相同的,若假設手機品牌只有螢幕大小不相同,則返回的資料型別
  
 4.  前端通過傳入的sku id來取值生成的詳情頁面,從同一份資料資料中拿的值,就會避免重複,例如Iphone6的只是取出所有的Iphone6的所有的資訊生成靜態頁面,傳入的sku id不同得到的頁面效果不同,通過不同的id也可以找到不同的商品的詳情頁面

 5.細節完善在運營人員相關修改商品資訊,要在後端實現,自動重新整理詳情的頁面的資料,自動觸發靜態頁面的生成,利用了django中的ModelAdmin,在資料發生變動之後自動進行更新相關資料

獲取熱銷商品

技術點
詳情頁面中的熱銷商品每個頁面載入完成之後都會來向後端請求資料,但是熱銷商品卻不經常發生變化或者是在一段時間內根據相關欄位統計生成返回給前端即可,所有使用快取的方式儲存熱銷商品是最合理的方式,避免了資料的連結,減少了伺服器的壓力,充分的利用了快取的響應速度也比較快可以提高使用者的體驗

商品列表頁面的展示
商品資料動態的從後端獲取,其他部分生成靜態化頁面

技術點:
1.DRF框架中過濾,排序,分頁,序列化器資料的返回
2.適當使用到了DRF提供的擴充套件類ListAPIView來簡化程式碼

商品搜尋的功能實現

技術點

  1. Elasticsearch搜尋引擎的原理:通過搜尋引擎進行搜尋資料查詢的過程中,搜尋引擎並不是直接去資料庫中去進行資料庫的查詢,而是搜素引擎會對資料庫中所有的資料進行一遍的預處理,單獨的建立一份索引表,在進行資料庫查詢的過程中,會在索引表中進行查詢,然後返回相應的資料。
  2. Elasticsearch
    不支援對中文進行分詞建立索引,需要配合擴充套件elasticsearch-analysis-ik來實現中文分詞處理
    3.使用haystack對接Elasticsearch的流程

安裝

在配置檔案中配置haystack使用的搜尋引擎後端
SKU索引資料模型類
在templates目錄中建立text欄位使用的模板檔案
手動生成初始索引
建立序列化器
建立檢視
定義路由

購物車模組

資料型別的設計原則:

	1>.儘量將cookies中的資料型別格式與redis資料庫中資料型別設計成形同的
	2>.對redis資料庫的相關操作
	3>.{sku id :[count,True]}資料中sku id:商品的id,count:購物車中資料的商品的個數;True或者False代表是否被選中
	4>.將對資料的操作封裝成一個擴充套件集,在檢視中繼承擴充套件類