引言:項(xiàng)目開(kāi)發(fā)流程:
-
需求分析(成員:架構(gòu)師 、產(chǎn)品經(jīng)理 、開(kāi)發(fā)者組長(zhǎng))
在跟客戶(hù)談需求之前,會(huì)大致先了解客戶(hù)的需求,然后自己先設(shè)計(jì)一套比較好寫(xiě)的方案。跟客戶(hù)溝通交流中引導(dǎo)客戶(hù)往我們之前想好的方案上面靠,形成一個(gè)初步的方案
-
項(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)。
-
分組開(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)系);
-
測(cè)試:測(cè)試部門(mén)組織成員對(duì)模塊、代碼進(jìn)行單元、功能、壓力等測(cè)試。
-
交付上線
- 交給對(duì)方的運(yùn)維人員;
- 直接上線到我們的服務(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ò)展字段:
- phone:電話號(hào)碼
- avatar:用戶(hù)頭像
- create_time:創(chuàng)建時(shí)間
- 外鍵字段:【一對(duì)一】個(gè)人站點(diǎn)表
2.個(gè)人站點(diǎn)表
- 業(yè)務(wù)字段:
- site_name:站點(diǎn)名稱(chēng)
- site_title 站點(diǎn)標(biāo)題
- site_theme 站點(diǎn)樣式(存儲(chǔ)一個(gè)CSS/JS文件)
3.文章標(biāo)簽表
4.文章類(lèi)別表
- 業(yè)務(wù)字段:name 類(lèi)別名
- 外鍵字段:【一對(duì)多】個(gè)人站點(diǎn)
5.文章表
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)目,前端和后端都需要自己一步步的完成。
|