引言:項(xiàng)目開發(fā)流程:
-
需求分析(成員:架構(gòu)師 、產(chǎn)品經(jīng)理 、開發(fā)者組長)
在跟客戶談需求之前,會(huì)大致先了解客戶的需求,然后自己先設(shè)計(jì)一套比較好寫的方案。跟客戶溝通交流中引導(dǎo)客戶往我們之前想好的方案上面靠,形成一個(gè)初步的方案
-
項(xiàng)目設(shè)計(jì)(成員:架構(gòu)師選擇項(xiàng)目的整體設(shè)計(jì)環(huán)境)
- 編程語言:Java、Python、PHP、C++等;
- 框架選擇:Django、Flask、SpringMVC等
- 數(shù)據(jù)庫選擇
- 主體數(shù)據(jù)庫:MySQL、SQL server、Oracle;
- 緩存數(shù)據(jù)庫:redis/mongodb/memcacha;
- 功能劃分:將整個(gè)項(xiàng)目劃分成若干個(gè)功能模塊
- 找開發(fā)組組長開會(huì):給每個(gè)組分發(fā)任務(wù)
- 項(xiàng)目報(bào)價(jià)/預(yù)算
- 技術(shù)類需要多少人、多少天、開發(fā)的設(shè)備成本
- 產(chǎn)品經(jīng)理層面:售后、客服
- 公司層面確認(rèn),產(chǎn)品經(jīng)理去跟客戶溝通。后續(xù)需要加功能,繼續(xù)加錢。
-
分組開發(fā):組長找組員開會(huì),安排各自的功能模塊
其實(shí)就是在架構(gòu)師設(shè)計(jì)好的框架里面編寫代碼,在寫代碼的時(shí)候,寫完需要自己先測試是否有bug。如果是一些顯而易見的bug,你沒有避免而是直接交給了測試部門測出來,那你可能就需要被扣績效了(一定要跟測試組搞好關(guān)系);
-
測試:測試部門組織成員對模塊、代碼進(jìn)行單元、功能、壓力等測試。
-
交付上線
- 交給對方的運(yùn)維人員;
- 直接上線到我們的服務(wù)器上并收取一定的維護(hù)費(fèi)用;
一、數(shù)據(jù)庫表的設(shè)計(jì)
一個(gè)項(xiàng)目中最重要的不是業(yè)務(wù)邏輯的書寫,而是前期的表結(jié)構(gòu)的設(shè)計(jì),只有將表設(shè)計(jì)好了,后續(xù)的功能書寫才能順利完成。否則會(huì)重復(fù)修改表,既影響開發(fā)的效率,也會(huì)導(dǎo)致寫好的業(yè)務(wù)代碼無效。
1. 用戶表:繼承AbstractUser
- 擴(kuò)展字段:
- phone:電話號碼
- avatar:用戶頭像
- create_time:創(chuàng)建時(shí)間
- 外鍵字段:【一對一】個(gè)人站點(diǎn)表
2.個(gè)人站點(diǎn)表
- 業(yè)務(wù)字段:
- site_name:站點(diǎn)名稱
- site_title 站點(diǎn)標(biāo)題
- site_theme 站點(diǎn)樣式(存儲一個(gè)CSS/JS文件)
3.文章標(biāo)簽表
4.文章類別表
- 業(yè)務(wù)字段:name 類別名
- 外鍵字段:【一對多】個(gè)人站點(diǎn)
5.文章表
6.點(diǎn)贊點(diǎn)踩表:用來記錄哪個(gè)用戶給哪篇文章點(diǎn)了贊還是點(diǎn)了踩(多對多關(guān)聯(lián)表)
- 業(yè)務(wù)字段:
- user(用戶的主鍵)
- article(文章的主鍵)
- is_up(普通字段 BooleanFied)
7.文章評論表[comment]:用來記錄哪個(gè)用戶給哪篇文章寫了哪些評論內(nèi)容
- 業(yè)務(wù)字段:
- user(用戶的主鍵)
- article(文章的主鍵)
- content:CharField()
- comment_time:DateField()
- 自關(guān)聯(lián)
parent ForeignKey(to='Comment',null=True) ,ORM專門提供的自關(guān)聯(lián)寫法parent ForeignKey(to='self',null=True)
注:根評論、子評論的概念:根評論就是直接評論當(dāng)前發(fā)布的內(nèi)容的,子評論是評論別人的評論。
根評論與子評論是一對多的關(guān)系

二、數(shù)據(jù)庫表創(chuàng)建及同步
由于django自帶的sqlite數(shù)據(jù)庫對日期不敏感,所以我們換成MySQL
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
"""
先寫普通字段,之后在寫外鍵字段
"""
class UserInfo(AbstractUser):
phone = models.BigIntegerField(verbose_name='手機(jī)號',null=True)
# 用戶頭像,用戶不選頭像則用默認(rèn)頭像
avatar = models.FileField(upload_to='avatar/',default='avatar/default.png')
"""
給avatar字段傳文件對象,該文件會(huì)自動(dòng)存儲到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)名稱",max_length=32)
site_title = models.CharField(verbose_name="站點(diǎn)標(biāo)題",max_length=32)
# 簡單模擬,認(rèn)識樣式內(nèi)部原理的操作
site_theme = models.CharField(verbose_name="站點(diǎn)樣式",max_length=64)
# 存儲用戶自定義的css/js文件
class Category(models.Model):
name = models.CharField(verbose_name='文章分類',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ù)庫字段設(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='評論數(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='評論內(nèi)容',max_length=255)
comment_time = models.DateTimeField(verbose_name='評論時(shí)間',auto_now_add=True)
# 自關(guān)聯(lián)
parent = models.ForeignKey(to='self',null=True,on_delete = models.CASCADE)
# 有些評論就是根評論
BBS是一個(gè)前后端不分離的全棧個(gè)人博客項(xiàng)目,前端和后端都需要自己一步步的完成。
|