日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Django的開(kāi)發(fā)流程與數(shù)據(jù)庫(kù)設(shè)計(jì)

 小樣樣樣樣樣樣 2021-05-06

引言:項(xiàng)目開(kāi)發(fā)流程:

  1. 需求分析(成員:架構(gòu)師 、產(chǎn)品經(jīng)理 、開(kāi)發(fā)者組長(zhǎng))
    在跟客戶(hù)談需求之前,會(huì)大致先了解客戶(hù)的需求,然后自己先設(shè)計(jì)一套比較好寫(xiě)的方案。跟客戶(hù)溝通交流中引導(dǎo)客戶(hù)往我們之前想好的方案上面靠,形成一個(gè)初步的方案

  2. 項(xiàng)目設(shè)計(jì)(成員:架構(gòu)師選擇項(xiàng)目的整體設(shè)計(jì)環(huán)境)

    • 編程語(yǔ)言:Java、Python、PHP、C++等;
    • 框架選擇:Django、Flask、SpringMVC等
    • 數(shù)據(jù)庫(kù)選擇
      • 主體數(shù)據(jù)庫(kù):MySQL、SQL server、Oracle;
      • 緩存數(shù)據(jù)庫(kù):redis/mongodb/memcacha;
    • 功能劃分:將整個(gè)項(xiàng)目劃分成若干個(gè)功能模塊
    • 找開(kāi)發(fā)組組長(zhǎng)開(kāi)會(huì):給每個(gè)組分發(fā)任務(wù)
    • 項(xiàng)目報(bào)價(jià)/預(yù)算
      • 技術(shù)類(lèi)需要多少人、多少天、開(kāi)發(fā)的設(shè)備成本
      • 產(chǎn)品經(jīng)理層面:售后、客服
    • 公司層面確認(rèn),產(chǎn)品經(jīng)理去跟客戶(hù)溝通。后續(xù)需要加功能,繼續(xù)加錢(qián)。
  3. 分組開(kāi)發(fā):組長(zhǎng)找組員開(kāi)會(huì),安排各自的功能模塊
    其實(shí)就是在架構(gòu)師設(shè)計(jì)好的框架里面編寫(xiě)代碼,在寫(xiě)代碼的時(shí)候,寫(xiě)完需要自己先測(cè)試是否有bug。如果是一些顯而易見(jiàn)的bug,你沒(méi)有避免而是直接交給了測(cè)試部門(mén)測(cè)出來(lái),那你可能就需要被扣績(jī)效了(一定要跟測(cè)試組搞好關(guān)系);

  4. 測(cè)試:測(cè)試部門(mén)組織成員對(duì)模塊、代碼進(jìn)行單元、功能、壓力等測(cè)試。

  5. 交付上線

    1. 交給對(duì)方的運(yùn)維人員;
    2. 直接上線到我們的服務(wù)器上并收取一定的維護(hù)費(fèi)用;

一、數(shù)據(jù)庫(kù)表的設(shè)計(jì)

一個(gè)項(xiàng)目中最重要的不是業(yè)務(wù)邏輯的書(shū)寫(xiě),而是前期的表結(jié)構(gòu)的設(shè)計(jì),只有將表設(shè)計(jì)好了,后續(xù)的功能書(shū)寫(xiě)才能順利完成。否則會(huì)重復(fù)修改表,既影響開(kāi)發(fā)的效率,也會(huì)導(dǎo)致寫(xiě)好的業(yè)務(wù)代碼無(wú)效。

1. 用戶(hù)表:繼承AbstractUser

  • 擴(kuò)展字段
    1. phone:電話號(hào)碼
    2. avatar:用戶(hù)頭像
    3. create_time:創(chuàng)建時(shí)間
  • 外鍵字段:【一對(duì)一】個(gè)人站點(diǎn)表

2.個(gè)人站點(diǎn)表

  • 業(yè)務(wù)字段
    1. site_name:站點(diǎn)名稱(chēng)
    2. site_title 站點(diǎn)標(biāo)題
    3. site_theme 站點(diǎn)樣式(存儲(chǔ)一個(gè)CSS/JS文件)

3.文章標(biāo)簽表

  • 業(yè)務(wù)字段:name 標(biāo)簽名

  • 外鍵字段:【一對(duì)多】個(gè)人站點(diǎn)

4.文章類(lèi)別表

  • 業(yè)務(wù)字段:name 類(lèi)別名
  • 外鍵字段:【一對(duì)多】個(gè)人站點(diǎn)

5.文章表

  • 業(yè)務(wù)字段

    1. title:文章標(biāo)題
    2. desc :文章簡(jiǎn)介/摘要
    3. content:文章內(nèi)容
    4. create_time:發(fā)布時(shí)間
  • 數(shù)據(jù)庫(kù)字段設(shè)計(jì)優(yōu)化:點(diǎn)贊數(shù)、點(diǎn)踩數(shù)、評(píng)論數(shù)(雖然這三個(gè)字段可以從其他表里面可以O(shè)RM跨表查詢(xún)計(jì)算得出,但是頻繁跨表效率降低)
    5. up_num:點(diǎn)贊數(shù)
    6. down_num:點(diǎn)踩數(shù)
    7. comment_num:評(píng)論數(shù)

  • 外鍵字段

    • 【一對(duì)多】個(gè)人站點(diǎn)
    • 【多對(duì)多】文章標(biāo)簽表
    • 【一對(duì)多】文章分類(lèi)

6.點(diǎn)贊點(diǎn)踩表:用來(lái)記錄哪個(gè)用戶(hù)給哪篇文章點(diǎn)了贊還是點(diǎn)了踩(多對(duì)多關(guān)聯(lián)表)

  • 業(yè)務(wù)字段
    • user(用戶(hù)的主鍵)
    • article(文章的主鍵)
    • is_up(普通字段 BooleanFied)

7.文章評(píng)論表[comment]:用來(lái)記錄哪個(gè)用戶(hù)給哪篇文章寫(xiě)了哪些評(píng)論內(nèi)容

  • 業(yè)務(wù)字段
    • user(用戶(hù)的主鍵)
    • article(文章的主鍵)
    • content:CharField()
    • comment_time:DateField()
    • 自關(guān)聯(lián)parent ForeignKey(to='Comment',null=True),ORM專(zhuān)門(mén)提供的自關(guān)聯(lián)寫(xiě)法parent ForeignKey(to='self',null=True)

注:根評(píng)論、子評(píng)論的概念:根評(píng)論就是直接評(píng)論當(dāng)前發(fā)布的內(nèi)容的,子評(píng)論是評(píng)論別人的評(píng)論。

根評(píng)論與子評(píng)論是一對(duì)多的關(guān)系

二、數(shù)據(jù)庫(kù)表創(chuàng)建及同步

由于django自帶的sqlite數(shù)據(jù)庫(kù)對(duì)日期不敏感,所以我們換成MySQL

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
"""
    先寫(xiě)普通字段,之后在寫(xiě)外鍵字段
"""
class UserInfo(AbstractUser):
    phone = models.BigIntegerField(verbose_name='手機(jī)號(hào)',null=True)
    # 用戶(hù)頭像,用戶(hù)不選頭像則用默認(rèn)頭像
    avatar = models.FileField(upload_to='avatar/',default='avatar/default.png')
    """
        給avatar字段傳文件對(duì)象,該文件會(huì)自動(dòng)存儲(chǔ)到avatar文件下
        然后該字段只保存文件路徑avatar/default.png
    """
    create_time = models.DateField(auto_now_add=True)

    blog = models.OneToOneField(to='Blog',null=True,on_delete = models.CASCADE)

class Blog(models.Model):
    site_name = models.CharField(verbose_name="站點(diǎn)名稱(chēng)",max_length=32)
    site_title = models.CharField(verbose_name="站點(diǎn)標(biāo)題",max_length=32)
    # 簡(jiǎn)單模擬,認(rèn)識(shí)樣式內(nèi)部原理的操作
    site_theme = models.CharField(verbose_name="站點(diǎn)樣式",max_length=64)
    # 存儲(chǔ)用戶(hù)自定義的css/js文件

class Category(models.Model):
    name = models.CharField(verbose_name='文章分類(lèi)',max_length=32)
    blog = models.ForeignKey(to='Blog',null=True,on_delete = models.CASCADE)

class Tag(models.Model):
    name = models.CharField(verbose_name='文章標(biāo)簽',max_length=32)
    blog = models.ForeignKey(to='Blog', null=True,on_delete = models.CASCADE)

class Article(models.Model):
    title = models.CharField(verbose_name='文章標(biāo)題',max_length=64)
    desc = models.CharField(verbose_name='文章摘要',max_length=255)
    # 文章內(nèi)容有很多,一般情況下都是使用TextField
    content = models.TextField(verbose_name='文章內(nèi)容')
    create_time = models.DateField(auto_now_add=True)

    # 數(shù)據(jù)庫(kù)字段設(shè)計(jì)優(yōu)化
    up_num = models.BigIntegerField(verbose_name='點(diǎn)贊數(shù)',default=0)
    down_num = models.BigIntegerField(verbose_name='點(diǎn)踩數(shù)',default=0)
    comment_num = models.BigIntegerField(verbose_name='評(píng)論數(shù)',default=0)
    # 外鍵字段
    blog = models.OneToOneField(to='Blog', null=True,on_delete = models.CASCADE)
    category = models.ForeignKey(to='Category', null=True,on_delete = models.CASCADE)
    tags = models.ManyToManyField(to='Tag',
                                  through='Article2Tag',
                                  through_fields=('article','tag')
                                 )

class Article2Tag(models.Model):
    article = models.ForeignKey(to='Article',on_delete = models.CASCADE)
    tag = models.ForeignKey(to='Tag',on_delete = models.CASCADE)

class UpAndDown(models.Model):
    user = models.ForeignKey(to='UserInfo',on_delete = models.CASCADE)
    article = models.ForeignKey(to='Article',on_delete = models.CASCADE)
    is_up = models.BooleanField()  # 傳入布爾值,存0/1

class Comment(models.Model):
    user = models.ForeignKey(to='UserInfo',on_delete = models.CASCADE)
    article = models.ForeignKey(to='Article',on_delete = models.CASCADE)
    content = models.CharField(verbose_name='評(píng)論內(nèi)容',max_length=255)
    comment_time = models.DateTimeField(verbose_name='評(píng)論時(shí)間',auto_now_add=True)
    # 自關(guān)聯(lián)
    parent = models.ForeignKey(to='self',null=True,on_delete = models.CASCADE)
    # 有些評(píng)論就是根評(píng)論

BBS是一個(gè)前后端不分離的全棧個(gè)人博客項(xiàng)目,前端和后端都需要自己一步步的完成。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多