🏆🏆🏆教程全知識點簡介:1.郵件驗證系統包括Django發送郵件、保存郵箱併發送驗證郵件、Celery使用Django配置文件設置。2. 地址管理涵蓋shou貨地址、省市區地址查詢、數據庫建表、後端接口設計、前端實現、緩存使用(安裝、使用方法、省市區視圖緩存、緩存數據保存位置和有效期設置)、用户地址管理。3. 數據庫設計包括用户部分、產品部分、數據庫表設計、表結構、數據庫模型類。4. 容器化部署涵蓋Docker使用(Ubuntu安裝、啓動停止、鏡像操作)、FastDFS客户端與自定義文件存儲系統、頁面靜態化、定時任務、靜態化首頁腳本。5. 產品系統包括產品詳情頁、異步任務觸發、腳本工具、用户瀏覽歷史記錄(保存、查看)。6. 產品模式涵蓋B2B企業對企業、C2C個人對個人、O2O線上到線下、開發流程、需求分析。7. 購wu車系統包括購wu車管理、購wu車數據存儲設計(Redis保存已登錄用户)、添加到購wu車、查詢購wu車數據、登錄合併購wu車。8. 訂order單系統涵蓋提交訂order單、我的訂order單、訂order單評價、訂order單結算、保存訂order單、MySQL事務隔離級別修改、下單成功頁面。9. 搜索系統包括產品搜索、搜索引擎原理、Elasticsearch、Docker安裝Elasticsearch擴展、前端實現。10. 支fu系統涉及 集成、Xadmin管理後台。11. 項目配置包括項目準備、配置文件修改、數據庫配置、Redis配置、本地化語言時區、異常處理、日誌記錄。12. 用户認證系統涵蓋圖片驗證碼、域名設置、前端Vue代碼、跨域CORS、Celery發送短信、賬號存在判斷、JWT認證(JWT概念、構成、應用、Django REST framework JWT)、 登錄(登錄流程、模型類創建、urllib使用、回調處理)、用户中心個人信息。
<!-- start:bj1 -->
📚📚倉庫code.zip 👉直接-->: https://gitlab.com/yinuo_112/Backend/-/blob/main/Django/djang... 🍅🍅
<!-- end:bj1 -->
✨ 本教程項目亮點
🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考
🎯🎯🎯全教程總章節
🚀🚀🚀本篇主要內容
產品部分
數據庫表設計
在電商中對於產品,有兩個重要的概念:SPU和SKU
- SPU = Standard Product Unit (標準產品單位)
SPU是產品信息聚合的最小單位,是一組可服用、易檢索的標準化信息的集合,該集合描述了一個產品的特性。
通俗的講,屬性值、特性相同的產品就可以稱為一個SPU。
例如:
iPhone X 就是一個SPU,與商家、顏色、款式、規格、套餐等都無關。
- SKU = Stock Keeping Unit (庫存量單位)
SKU即庫存進出計量的單位,可以是以件、盒、托盤等為單位,是物理上不可分割的最小存貨單元。在使用時要根據不同業態,不同管理模式來處理。在服裝、鞋類產品中使用最多最普遍。
例如:
iPhone X 全網通黑色256G 就是一個SKU,表示了具體的規格、顏色等信息。
表結構
產品數據表結構
首頁ad數據表結構
數據庫模型類
創建產品應用goods,產品數據模型類
passlib 文檔
Click 文檔
class GoodsCategory(BaseModel):
"""
產品類別
"""
name = models.CharField(max_length=10, verbose_name='名稱')
parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE, verbose_name='父類別')
class Meta:
db_table = 'tb_goods_category'
verbose_name = '產品類別'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class GoodsChannel(BaseModel):
"""
產品頻道
"""
group_id = models.IntegerField(verbose_name='組號')
category = models.ForeignKey(GoodsCategory, on_delete=models.CASCADE, verbose_name='頂級產品類別')
url = models.CharField(max_length=50, verbose_name='頻道頁面鏈接')
sequence = models.IntegerField(verbose_name='組內順序')
class Meta:
db_table = 'tb_goods_channel'
verbose_name = '產品頻道'
verbose_name_plural = verbose_name
def __str__(self):
return self.category.name
class Brand(BaseModel):
"""
品牌
"""
name = models.CharField(max_length=20, verbose_name='名稱')
logo = models.ImageField(verbose_name='Logo圖片')
first_letter = models.CharField(max_length=1, verbose_name='品牌首字母')
class Meta:
db_table = 'tb_brand'
verbose_name = '品牌'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Goods(BaseModel):
"""
產品SPU
"""
name = models.CharField(max_length=50, verbose_name='名稱')
brand = models.ForeignKey(Brand, on_delete=models.PROTECT, verbose_name='品牌')
category1 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat1_goods', verbose_name='一級類別')
category2 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat2_goods', verbose_name='二級類別')
category3 = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, related_name='cat3_goods', verbose_name='三級類別')
sales = models.IntegerField(default=0, verbose_name='銷量')
comments = models.IntegerField(default=0, verbose_name='評價數')
class Meta:
db_table = 'tb_goods'
verbose_name = '產品'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class GoodsSpecification(BaseModel):
"""
產品規格
"""
goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name='產品')
name = models.CharField(max_length=20, verbose_name='規格名稱')
class Meta:
db_table = 'tb_goods_specification'
verbose_name = '產品規格'
verbose_name_plural = verbose_name
def __str__(self):
return '%s: %s' % (self.goods.name, self.name)
class SpecificationOption(BaseModel):
"""
規格選項
"""
spec = models.ForeignKey(GoodsSpecification, on_delete=models.CASCADE, verbose_name='規格')
value = models.CharField(max_length=20, verbose_name='選項值')
class Meta:
db_table = 'tb_specification_option'
verbose_name = '規格選項'
verbose_name_plural = verbose_name
def __str__(self):
return '%s - %s' % (self.spec, self.value)
class SKU(BaseModel):
"""
產品SKU
"""
name = models.CharField(max_length=50, verbose_name='名稱')
caption = models.CharField(max_length=100, verbose_name='副標題')
goods = models.ForeignKey(Goods, on_delete=models.CASCADE, verbose_name='產品')
category = models.ForeignKey(GoodsCategory, on_delete=models.PROTECT, verbose_name='從屬類別')
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='單價')
cost_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='進價')
market_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='市場價')
stock = models.IntegerField(default=0, verbose_name='庫存')
sales = models.IntegerField(default=0, verbose_name='銷量')
comments = models.IntegerField(default=0, verbose_name='評價數')
is_launched = models.BooleanField(default=True, verbose_name='是否上架銷售')
default_image_url = models.CharField(max_length=200, default='', null=True, blank=True, verbose_name='默認圖片')
class Meta:
db_table = 'tb_sku'
verbose_name = '產品SKU'
verbose_name_plural = verbose_name
def __str__(self):
return '%s: %s' % (self.id, self.name)
class SKUImage(BaseModel):
"""
SKU圖片
"""
sku = models.ForeignKey(SKU, on_delete=models.CASCADE, verbose_name='sku')
image = models.ImageField(verbose_name='圖片')
class Meta:
db_table = 'tb_sku_image'
verbose_name = 'SKU圖片'
verbose_name_plural = verbose_name
def __str__(self):
return '%s %s' % (self.sku.name, self.id)
class SKUSpecification(BaseModel):
"""
SKU具體規格
"""
sku = models.ForeignKey(SKU, on_delete=models.CASCADE, verbose_name='sku')
spec = models.ForeignKey(GoodsSpecification, on_delete=models.PROTECT, verbose_name='規格名稱')
option = models.ForeignKey(SpecificationOption, on_delete=models.PROTECT, verbose_name='規格值')
class Meta:
db_table = 'tb_sku_specification'
verbose_name = 'SKU規格'
verbose_name_plural = verbose_name
def __str__(self):
return '%s: %s - %s' % (self.sku, self.spec.name, self.option.value)
jsonschema 文檔
創建ad內容應用contents,ad數據模型類
aioredis 文檔
class ContentCategory(BaseModel):
"""
ad內容類別
"""
name = models.CharField(max_length=50, verbose_name='名稱')
key = models.CharField(max_length=50, verbose_name='類別鍵名')
class Meta:
db_table = 'tb_content_category'
verbose_name = 'ad內容類別'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Content(BaseModel):
"""
ad內容
"""
category = models.ForeignKey(ContentCategory, on_delete=models.PROTECT, verbose_name='類別')