BBS项目介绍
开发工具:pycharm
python解释器版本:python3.8
Django版本:1.11.11
一、简介
此教材利用Django、MySQL实现以下功能:
多人博客(多用户,每个用户可以有自己的个人站点,编写自己的博客)
登录注册(登录有图片验证码,注册可以上传用户自定义头像)
登录注册用form组件进行校验和渲染页面,Ajax提交请求
每个用户都有个人站点(可以根据时间、分类、标签来过滤文章)
每个用户拥有后台管理(可以对文章、标签、分类进行增、删、改、查,新增文章使用Markdown文本编辑器,处理XSS攻击)
文章支持Markdown的代码语法高亮,支持一键复制
每个用户可以设置个人信息,修改个人站点背景、修改头像、修改密码
1篇文章可以有多个标签,但是只能拥有1个分类(不支持属于多个分类,但是不限制于标签)
在首页显示文章的用户头像、文章标题、文章摘要、发布时间、点赞数、评论数
每个已登录的用户都可以对文章进行点赞点踩(只能点其中1个,点后无法继续点击,无法撤销)
每篇文章都可以进行评论,每个评论可以有子评论(子评论也可以有子评论,以此类推)
管理员用户可以上传首页轮播图,可以管理用户(禁用、启用、设置为管理员、admin后台管理)
二、创建数据库与表
在配置文件中写入数据库配置,所有的配置信息都存放于settings.py文件中
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'blog01', # 数据库名
'HOST': '127.0.0.1', # 主机IP(本地为127.0.0.1)
'PORT': 3306, # MySQL端口号:默认3306
'USER': 'root', # 数据库用户名
'PASSWORD': '123456', # 数据库密码
}
}
创建数据库
create database blog01;
执行迁移命令
python manage.py makemigrations
python manage.py migrate
创建超级用户
python manage.py createsuperuser
在项目开发之前,首先要建立数据库,并确立表与表之间的关系,写数据库前先在__init__.py文件中导入pymysql模块
init.py
import pymysql
pymysql.install_as_MySQLdb()
搭建数据库,确立好表与表之间的关系,代码中已经做好注释
models.py
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
# 用户信息表
class UserInfo(AbstractUser):
phone = models.BigIntegerField(null=True,blank=True) # blank是用来告诉admin后台 该字段可以不填
# avatar存的是用户头像文件路径 用户上传的头像会自动保存到avatar文件夹下
avatar = models.FileField(upload_to='avatar/',default='avatar/default.jpg')
create_time = models.DateField(auto_now_add=True)
# 用户信息与个人站点是一对一关系,外键建在个人站点
blog = models.OneToOneField(to='Blog',null=True)
class Meta:
verbose_name_plural = '用户表'
def __str__(self):
return self.username
# 个人站点表
class Blog(models.Model):
site_title = models.CharField(max_length=32)
site_name = models.CharField(max_length=32)
site_theme = models.CharField(max_length=255)
class Meta:
verbose_name_plural = '个人站点表'
def __str__(self):
return self.site_name
# 文章分类表
class Category(models.Model):
name = models.CharField(max_length=32)
blog = models.ForeignKey(to='Blog')
def __str__(self):
return self.name
# 文章标签表
class Tag(models.Model):
name = models.CharField(max_length=32)
blog = models.ForeignKey(to='Blog')
def __str__(self):
return self.name
# 文章表
class Article(models.Model):
title = models.CharField(max_length=255)
desc = models.CharField(max_length=255)
content = models.TextField() # 存大段文本
create_time = models.DateField(auto_now_add=True)
# 数据库优化字段
comment_num = models.IntegerField(default=0)
up_num = models.IntegerField(default=0)
down_num = models.IntegerField(default=0)
# 外键字段
blog = models.ForeignKey(to='Blog',null=True)
category = models.ForeignKey(to='Category',null=True)
# 一篇文章可以有多个标签,一个标签可以有多篇文章 多对多
tag = models.ManyToManyField(to='Tag',through='Article2Tag',through_fields=('article','tag'))
def __str__(self):
return self.title
# 文章与标签第三张表
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(max_length=255)
create_time = models.DateField(auto_now_add=True)
parent = models.ForeignKey(to='self',null=True)
三、首页
创建数据与表单之后,接下来搭建BBS首页
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
</head>
<body>
<nav class="navbar navbar-inverse">
<div class="container-fluid">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#"> 首页</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li class="active"><a href="#">新闻 <span class="sr-only">(current)</span></a></li>
<li class="active"><a href="#">博问 <span class="sr-only">(current)</span></a></li>
<li class="active"><a href="#">专区 <span class="sr-only">(current)</span></a></li>
<li class="active"><a href="#">闪存 <span class="sr-only">(current)</span></a></li>
<li class="active"><a href="#">班级 <span class="sr-only">(current)</span></a></li>
<li><a href="#">怀旧</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">发现 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">园子</a></li>
<li><a href="#">小组</a></li>
<li><a href="#">收藏</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">招聘</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">找找看</a></li>
</ul>
</li>
</ul>
<form class="navbar-form navbar-left">
<div class="form-group">
<input type="text" class="form-control" placeholder="代码改变世界">
</div>
<button type="submit" class="btn btn-default">搜索</button>
</form>
<ul class="nav navbar-nav navbar-right">
{% if request.user.is_authenticated %}
<li><a>{
{ request.user.username }}</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">更多操作 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="/edit_avatar/">修改头像</a></li>
<li><a href="#" data-target=".bs-example-modal-lg" data-toggle="modal">修改密码</a></li>
<li><a href="/backend/">后台管理</a></li>
<li role="separator" class="divider">