一.BBS博客需求分析

首页(现实文章)
文章详情
点赞
文章评论(子评论,评论的展示)
登录功能(图片验证码)
注册功能(基于form验证)
个人站点(不同人不同样式,文章过滤)
后台管理(文章展示)
新增文章(富文本编辑器)

二.ORM模型设计

需要创建的表

用户信息表-----UserInfo
个人站点表-----Blog
分类表--------Category
标签表--------Tag
文章表--------Article
文章与标签的关联表---ArticleToTag
点赞点踩表-----UpAndDown
文章评论表-----Commit

表与表之间的关联关系

UserInfo --- 一对一 ---Blog
Blog   --- 一对多 --- Category
Blog   --- 一对多 --- Tag
Article --- 一对多 --- UserInfo
Article --- 一对多 --- Category
Article --- 多对多 --- Tag
UpAndDown --- 一对多 --- UserInfo
UpAndDown --- 一对多 --- Article
Commit --- 一对多 --- UserInfo
Commit --- 一对多 --- Article
子评论关联Commit自身

三.配置文件

配置需要使用的数据库

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'day86_BBS',
        'PORT': 3306,
        'HOST': '127.0.0.1',
        'USER': 'root',
        'PASSWORD': '970420',
    }
}

扩展默认的auth_user表的配置

AUTH_USER_MODEL = 'app名.表名'

根路由配置

STATIC_URL= '/login/'

静态文件配置

STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]

四.创建表模型

from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.
class Blog(models.Model):
    '''
    个人站点表
    '''
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=64, verbose_name='站点标题')
    site_name = models.CharField(max_length=64, verbose_name='站点名称')
    theme = models.CharField(max_length=255, verbose_name='站点样式')

class UserInfo(AbstractUser):
    '''
    用户表
    '''
    phone = models.CharField(max_length=32, verbose_name='手机号', null=True)
    avatar = models.FileField(upload_to='avatar/', default='/avatar/default.png', verbose_name='用户头像', null=True)
    create_data = models.DateField(auto_now_add=True, verbose_name='创建时间')
    blog = models.OneToOneField(to='Blog')

class Category(models.Model):
    '''
    文章类别表
    '''
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32, verbose_name='类别名')
    blog = models.ForeignKey(to=Blog, null=True)

class Tag(models.Model):
    '''
    文章标签表
    '''
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32, verbose_name='标签名')
    blog = models.ForeignKey(to=Blog, null=True)

class Article(models.Model):
    '''
    文章表
    '''
    id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=64, verbose_name='文章标题')
    desc = models.CharField(max_length=255, verbose_name='摘要')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='发表时间')
    content = models.TextField(verbose_name='文章内容')
    # 关联关系
    category = models.ForeignKey(to='Category', null=True)
    tag = models.ManyToManyField(to='Tag', through='ArticleToTag', through_fields=('article', 'tag'))
    blog = models.ForeignKey(to='Blog', null=True)

class ArticleToTag(models.Model):
    '''
    手动创建的文章关联标签表
    '''
    id = models.AutoField(primary_key=True)
    article = models.ForeignKey(to='Article')
    tag = models.ForeignKey(to='Tag')

class Commit(models.Model):
    '''
    评论表
    '''
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(to='UserInfo')
    article = models.ForeignKey(to='Article')
    content = models.CharField(max_length=255, verbose_name='评论内容')
    commit_time = models.DateTimeField(auto_now_add=True)
    # 自关联
    # parent = models.ForeignKey(to='Commit',null=True)
    parent = models.ForeignKey(to='self', null=True)

    # 联合唯一,防止写脏数据
    class Meta:
        unique_together = (('user', 'article'),)

class UpAndDown(models.Model):
    '''
    点赞点踩表
    '''
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(to='UserInfo')
    article = models.ForeignKey(to='Article')
    is_up = models.BooleanField()

    class Meta:
        unique_together = (('user', 'article'),)

五.生成5位随机验证码

from django.shortcuts import render, HttpResponse
from PIL import Image, ImageDraw, ImageFont
import random
from io import BytesIO

# 生成随机颜色
def get_color():
    return (
        random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
    )

# 生成随机数
def get_number(n):
    res = ''
    for i in range(n):
        C = chr(random.randint(65, 90))
        c = chr(random.randint(97, 122))
        num = random.randint(0, 9)
        res += random.choice([C, c, str(num)])
    return res

def get_code(request):
    # 生成图片对象
    img = Image.new('RGB', (174, 35), color=get_color())
    # 生成画笔对象
    img_draw = ImageDraw.Draw(img)
    # 生成字体对象,第一参数字体文件路径,第二个参数字体大小
    font = ImageFont.truetype('static/font/ss.TTF', 25)
    # 获取随机文本内容
    res = get_number(5)
    # print(res)
    # 使用画笔工具,对图片对象写入文本
    # text方法第一个参数为文本在图片的坐标,第二个参数是文本内容,第三个参数是文本颜色,第四个参数是文本字体
    img_draw.text((35, 0), res, get_color(), font)
    # 将随机文本内容保存到session
    res = res.lower()
    request.session['code_text'] = res
    # 在内存中生成一个空文件
    f = BytesIO()
    # 将图片放入内存,存取快,且会自动清理
    img.save(f, 'png')
    # 获得图片数据
    data = f.getvalue()
    return HttpResponse(data)

BBS需求分析和orm设计的更多相关文章

  1. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_1-3.在线教育站点需求分析和架构设计

    笔记 3.在线教育站点需求分析和架构设计     简介:分析要开发的功能点和系统架构应该怎样架构 1.开发的功能:                     首页视频列表                ...

  2. 扩展auth_user字段、BBS需求分析、创建BBS数据库、注册页面搭建与用户头像展示及Ajax提交数据

    昨日内容回顾 csrf跨站请求 1. SQL注入 2. xss攻击 3. csrf跨站请求 4. 密码加密(加盐) '''django中默认有一个中间件来验证csrf''' # 只针对post请求才验 ...

  3. 2014-08-04 BBS主页页面的设计

    今天是在吾索实习的第19天.这天,开始参照一开始设计的界面原型,真真正正地进行BBS界面的设计.在运用.NET进行界面设计时,发现没有用RP进行界面设计来得容易,很多都要再进行更精细的操作,才能达到原 ...

  4. MVC实战之排球计分(一)—— 需求分析与数据库设计

    此系列博客目的是制作一款排球计分程序.这系列博客讲讲述此软件的 各个功能的设计与实现. 一.需求分析: 这个程序是排球计分程序,其业务非常简单,具体如下: 1.本程序可以选择用户身份,通过不同角度记录 ...

  5. 团队作业2 <嗨,你的快递!>需求分析与原型设计

    哦,不,是你的快速(*_*) 第一部分 需求分析 1.1 用户调研 1.1.1调研对象:由于我们的系统是校园快递代取业务,面向的是大学生活,所以本次调研范围都是在校大学生(除了师大学生,也包括了外校的 ...

  6. ssm+RESTful bbs项目后端主要设计

    小谈: 帖主妥妥的一名"中"白了哈哈哈.软工的大三狗了,也即将找工作,怀着丝丝忐忑接受社会的安排.这是第一次写博客(/汗颜),其实之前在学习探索过程中,走了不少弯路,爬过不少坑.真 ...

  7. [开发笔记usbTOcan]软件需求分析和软件架构设计

    前面文章进行了系统分析和系统架构设计,手工焊接了一个板子,集合EK-TMC123GXL开发板(请忽略焊接技术) SWE.1 | 软件需求分析 软件需求分析过程的目的是将系统需求的软件相关部分转化为一组 ...

  8. 浅谈python web框架中的orm设计

    看了一下廖雪峰的那个web框架,其实就是封装了web.py,请求使用异步并将aiomysql做为MySQL数据库提供了异步IO的驱动,前端部分则整合了jinja.其中最难的应该是orm部分了. 下面是 ...

  9. AI产品经理工作流程——需求分析和产品设计

    1.AI产品设计常见失败原因 技术驱动产品设计,即我有什么技术就做什么产品.尽管许多公司不惜重金招聘高级AI算法工程师,确实这样也能帮助企业拿到大量的融资,但也容易给公司带来技术决定产品设计的局限.然 ...

随机推荐

  1. 关于使用Google Analyse导入库文件编译出错的解决办法.

    (最新解决办法):因为要通过cocoapod链接库,那么直接在Podfile上面加上 pod 'GoogleAnalytics-iOS-SDK', '~> 3.0.9',然后在pod insta ...

  2. [转] docker 部署 odoo

    [From] https://blog.csdn.net/qq_36178641/article/details/79775153 1.安装大象数据库. docker run -d -e POSTGR ...

  3. 如何统计Visual Studio Code项目的代码行数

    背景 年底到了,公司一年一度做述职报告的时间又到了,每到此时小伙伴们都想方设法的去做一些代码层面的汇总.在此交给大家个小妙招,走过路过不要错过哈,, 解决方案 使用Visual Studio Code ...

  4. gVim安装vim-template插件后提示Undefined variable vim_template_subtype/Press ENTER or type command to continue

    Win7 64位 gVim:version 8.1.1234 vim-template:github链接 安装方式: 直接下载master的zip压缩包,解压后放入本地gVim安装目录的plugin, ...

  5. CSS中margin属性

    css中margin块级元素的垂直相邻外边距会合并,比如 方框的上下外边距并不是2px,而是合并为1px了. 设置float属性就可以避免这种同级元素边距合并

  6. ios UITableView 搜索

    自己实现 UITableView 搜索,相对于使用 UISearchDisplayController 来说自己写稍微麻烦了那么一点点,但是更加灵活.主要就是用一个字段区分出当前是搜索还是非搜索,然后 ...

  7. tomcat端口冲突解决 Address already in use: JVM_Bind <null>:8080

    java.net.BindException: Address already in use: JVM_Bind <null>:8080 Caused by: java.net.BindE ...

  8. Vim改装成一个IDE编程环境

      1 写在前面   Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人, 黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说, 一个 ...

  9. Ubuntu 下常用的命令 简略记录

    # 动态显示 NVIDIA watch -n 1 nvidia-smi #查看某一目录下文件的总数(不包含子目录) ls -l | wc -l #挂载硬盘或者U盘 mount /dev/sdb1 /m ...

  10. 存储器的保护(一)——《x86汇编语言:从实模式到保护模式》读书笔记18

    本文是原书第12章的学习笔记. 说句题外话,这篇博文是补写的,因为让我误删了,可恶的是CSDN的回收站里找不到! 好吧,那就再写一遍,我有坚强的意志.司马迁曰:“文王拘而演<周易>:仲尼厄 ...