BBS-个人博客项目

发布时间 2023-08-14 16:22:12作者: 毓见

BBS-个人博客项目完整搭建

项目开发流程

项目开发模式分类

1、瀑布开发模式

瀑布开发模式是一种更倾向于严格控制的管理模式,要求在提出需求之后,充分完成项目的规划,
各阶段都要经过严格的评审,只有当一个阶段的需求完成得非常好时才能进入下一个阶段。
但是瀑布开发模式开发的失败率较高,且周期较长,于是就产生了敏捷开发模式。

2、敏捷开发模式

敏捷开发模式的核心是迭代开发,它将一个项目完整的开发流程分为了几个周期(也可以说是版本),
由于每个版本的开发流程相似,看上去相当于一个重复迭代的过程。
这么开发的好处是,使一个大的项目能在较短时间内上线,并在后续对它进行不断地迭代和优化。(很少企业用)

项目开发流程

-立项
-需求分析
-原型图
-切图
-技术选型,数据库架构设计
-前后端协同开发
-上线测试服务器联调
-测试
-修改bug
-上线运行

BBS多人博客项目基本功能和需求

# 开发任意的项目第一个阶段就是弄清楚你要开发什么功能

# 一个项目最重要的是表结构的设计,大部分时间都是用来设计表.
# 你在企业中对于一个完成的项目写代码的时间大概有个30%,其余的时间都用来做铺垫
比如:产品需求的确定,技术选型,数据库设计...

项目程序设计

前后端混合项目,需要python解释器(建议使用3.6),django(建议版本2.2.2)

我们在一步步设计这个项目的时候,应该始终牢记每个功能都要遵循django请求的生命周期图,如下图

BBS数据库表结构设计

在我们分析完一个项目的需求之后,我们着手开发项目所需要做的第一件事就是设计数据库的表结构及其字段。

一般来说,设计一个数据库的表结构一般要注意以下三点:

● 第一,把项目的需求转化为一个个数据库中的表
● 第二,探寻表与表之间的关联关系
● 第三,牢记以下原则:能用多对多关联关系就尽量不要用一对多关联关系,能用一对多关联关系就尽量别用一对一(原因是为了减少耦合)


Django1表设计

from django.db import models

# Create your models here.
"""
先写普通字段
之后再写外键字段
"""
from django.contrib.auth.models import AbstractUser


class UserInfo(AbstractUser):
    phone = models.BigIntegerField(verbose_name='手机号',null=True)
    # 头像
    avatar = models.FileField(upload_to='avatar/',default='avatar/default.png',verbose_name='用户头像')
    """
    给avatar字段传文件对象 该文件会自动存储到avatar文件下 然后avatar字段只保存文件路径avatar/default.png
    """
    create_time = models.DateField(auto_now_add=True)

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


class Blog(models.Model):
    site_name = models.CharField(verbose_name='站点名称',max_length=32)
    site_title = models.CharField(verbose_name='站点标题',max_length=32)
    # 简单模拟 带你认识样式内部原理的操作
    site_theme = models.CharField(verbose_name='站点样式',max_length=64)  # 存css/js的文件路径


class Category(models.Model):
    name = models.CharField(verbose_name='文章分类',max_length=32)
    blog = models.ForeignKey(to='Blog',null=True)


class Tag(models.Model):
    name = models.CharField(verbose_name='文章标签',max_length=32)
    blog = models.ForeignKey(to='Blog', null=True)


class Article(models.Model):
    title = models.CharField(verbose_name='文章标题',max_length=64)
    desc = models.CharField(verbose_name='文章简介',max_length=255)
    # 文章内容有很多 一般情况下都是使用TextField
    content = models.TextField(verbose_name='文章内容')
    create_time = models.DateField(auto_now_add=True)

    # 数据库字段设计优化
    up_num = models.BigIntegerField(verbose_name='点赞数',default=0)
    down_num = models.BigIntegerField(verbose_name='点踩数',default=0)
    comment_num = models.BigIntegerField(verbose_name='评论数',default=0)

    # 外键字段
    blog = models.ForeignKey(to='Blog', null=True)
    category = models.ForeignKey(to='Category',null=True)
    tags = models.ManyToManyField(to='Tag',
                                  through='Article2Tag',
                                  through_fields=('article','tag')
                                  )


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


class UpAndDown(models.Model):
    user = models.ForeignKey(to='UserInfo')
    article = models.ForeignKey(to='Article')
    is_up = models.BooleanField()  # 传布尔值 存0/1


class Comment(models.Model):
    user = models.ForeignKey(to='UserInfo')
    article = models.ForeignKey(to='Article')
    content = models.CharField(verbose_name='评论内容',max_length=255)
    comment_time = models.DateTimeField(verbose_name='评论时间',auto_now_add=True)
    # 自关联
    parent = models.ForeignKey(to='self',null=True)  # 有些评论就是根评论

注意点:

在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,
此参数为了避免两个表里的数据不一致问题,不然会报错:

TypeError: __init__() missing 1 required positional argument: 'on_delete'


1. 举例说明:

user=models.OneToOneField(User)

owner=models.ForeignKey(UserProfile)

2. 需要改成:

user=models.OneToOneField(User,on_delete=models.CASCADE)   
  --在老版本这个参数(models.CASCADE)是默认值

owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE)  
  --在老版本这个参数(models.CASCADE)是默认值

 

3. 参数说明:

'''
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值

CASCADE:此值设置,是级联删除。

PROTECT:此值设置,是会报完整性错误。

SET_NULL:此值设置,会把外键设置为null,前提是允许为null。

SET_DEFAULT:此值设置,会把设置为外键的默认值。

SET():此值设置,会调用外面的值,可以是一个函数。

'''
 
// 一般情况下使用CASCADE就可以了。

Django自定义用户模型类

自定义用户模型类,继承了Django的AbstractUser类,定义好之后不能直接迁移,
需要修改相关用户模型类的配置:

在settings中设置AUTH_USER_MODEL:

    # settings.py
    # 格式为 "<django_app名>.<model名>"
    AUTH_USER_MODEL = "myapp.NewUser"

注册功能