- 多人博客(多用户,每个用户可以有自己的个人站点,编写自己的博客)
- 登录注册(登录有图片验证码,注册可以上传用户自定义头像)
- 登录注册用form组件进行校验和渲染页面,Ajax提交请求
- 每个用户都有个人站点(可以根据时间、分类、标签来过滤文章)
- 每个用户拥有后台管理(可以对文章、标签、分类进行增、删、改、查,新增文章使用Markdown文本编辑器,处理XSS攻击)
- 文章支持Markdown的代码语法高亮,支持一键复制
- 每个用户可以设置个人信息,修改个人站点背景、修改头像、修改密码
- 1篇文章可以有多个标签,但是只能拥有1个分类(不支持属于多个分类,但是不限制于标签)
- 在首页显示文章的用户头像、文章标题、文章摘要、发布时间、点赞数、评论数
- 每个已登录的用户都可以对文章进行点赞点踩(只能点其中1个,点后无法继续点击,无法撤销)
- 每篇文章都可以进行评论,每个评论可以有子评论(子评论也可以有子评论,以此类推)
- 管理员用户可以上传首页轮播图,可以管理用户(禁用、启用、设置为管理员、admin后台管理)
- 使用了forms组件进行校验和渲染,有局部和全局钩子
- 用户名输入框失去焦点就会判断该用户名是否存在,是否合法
- 头像上传后可以实时显示已上传的头像
- 注册按钮默认禁用,只有同意协议后才能激活按钮
- 用Ajax发送请求,用JS渲染错误提示信息
- 用户名、密码、验证码的输入框都有失去焦点就渲染错误信息事件
- 验证码和背景随机生成,使用了
pillow
模块
- 管理员可以上传主页的轮播图
- 管理员可以管理全部用户(除了自己)
- 管理员 - Django内置admin后台管理
- 所有用户都可以查看访问日志
- 日志中包含了IP地址、访问URL、访问时间、访问设备、访问平台
- 加入了分页器
- 可以设置基本信息
- 信息设置:地址栏用了JS的省市联动,前端的JS中使用模板语法渲染当前用户的地址
- 站点设置:可以创建个人博客站点(博客昵称 + 博客公告)
- 修改密码:新密码和旧密码不能相同,旧密码必须认证成功才能修改,成功后跳转至登录界面
- 修改头像:修改时可以试试显示,修改后直接刷新页面,更新头像
- 修改背景:可以修改当前页面+主页+个人博客站点的背景图片(每个用户的个人博客站点背景图都可以不同)
- 新增文章用了
mdeditor
编辑器,支持Markdown
语法,左边源代码,右边预览,分类单选,标签多选,文章有自己的首图
- 文章和分类、标签的删除根据ID传值,共用一个url和视图函数
- 分类和标签的更新也共用一个url和视图函数
- 点击文章编辑按钮后,到新的页面进行编辑,选择已关联分类和标签
- 轮播图:点击可以跳转至轮播图的链接
- 展示所有文章,使用了折叠和分页,显示文章作者的头像和发布时间、点赞数、评论数
- 左侧栏:根据分类、标签、日期归档进行过滤
- 右侧栏:显示博主的头像和一些信息
- 中间主内容:显示公告和文章
- 文章:显示文章头图、文章标题、发布时间、点赞数、评论数
- 显示发布时间、修改时间、当前时间
- 代码块支持不同编程语言的语法高亮
- 代码块显示行号
- 有一键复制功能
- 点赞点踩:只能点其中1个,无法撤销,1个用户对1篇文章只能点1次
- 评论:有根评论和子评论,实时渲染
Python解释器版本:3.6
Django版本:2.2
pip install requirement.txt
配置文件都在
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
python manage.py runserver
9张表:8张物理表+1张虚拟表
- 用户表:
UserInfo
- 博客表:
Blog
- 文章表:
Article
- 标签表:
Tag
- 分类表:
Category
- 评论表:
Comment
- 点赞点踩表:
UpAndDown
- 轮播图表:
Swiper
- 文章-标签 关联表:
Article2Tag
- avatar:用户的头像
- province:用户所在的省
- city:用户所在的城市
- gender:用户的性别
- phone:用户的联系方式
- blog:用户的博客站点(外键关联博客表
Blog
)
- title:博客标题
- subtitle:子标题
- style:博客样式
- title:文章标题
- head_img:文章头图
- description:文章摘要
- content:文章内容
- markdown:文章的Markdown源码
- create_time:文章的创建时间
- modify_time:文章的最后修改时间
- up_num:文章的点赞数
- down_num:文章的点踩数
- comment_num:文章的评论数
- blog:属于哪个博客站点(外键关联博客表
Blog
) - category:属于哪个分类(外键关联分类表
Category
) - tag:文章的标签(多对多关联标签表
Tag
)
- name:标签名
- blog:属于哪个博客站点(外键关联博客表
Blog
)
- name:分类名
- blog:属于哪个博客站点(外键关联博客表
Blog
)
- user:评论的用户(外键关联用户表
UserInfo
) - article:该评论属于哪篇文章(外键关联文章表
Article
) - content:评论内容
- comment_time:评论时间
- comment_id:评论的目标id(外键进行
自关联
)
- user:来自哪个用户(外键关联用户表
UserInfo
) - article:属于哪篇文章(外键关联文章表
Article
) - is_up:点赞还是点踩(根据bool值来判断)
- click_time:点赞/点踩时间
- tag:关联标签(外键关联标签表
Tag
) - article:关联文章(外键关联文章表
Article
)
- image:存放轮播图
- title:跳转的介绍
- img_url:点击跳转的地址
一篇文章可以有多个评论,评论分为2中:
- 根评论:该评论是单独的,没有其他用户回复该评论的评论(评论的对象是文章)
- 子评论:该评论是用于回复评论的,包括回复根评论和已有子评论(评论的对象是评论,一般带有
@
)
id | user | article | content | comment_time | comment_id |
---|---|---|---|---|---|
1 | 猪八戒 | 1 | 大师兄,师傅被妖怪抓走了! | 2020.10.27 19:32:05 | null |
2 | 沙僧 | 1 | 二师兄,师傅被妖怪抓走了! | 2020.10.27 19:35:27 | null |
3 | 沙僧 | 1 | 大师兄,师傅和二师兄都被妖怪抓走了! | 2020.10.27 20:48:06 | null |
4 | 猪八戒 | 1 | 都是俺老猪不好,没管住师傅,自己都赔进去了 | 2020.10.27 20:49:29 | 3 |
5 | 孙悟空 | 1 | 纳尼?! | 2020.10.27 20:50:03 | 3 |
6 | 沙僧 | 1 | 二师兄,你也真是的,又要大师兄出马 | 2020.10.27 20:50:59 | 4 |
7 | 孙悟空 | 1 | 我TM... | 2020.10.27 20:52:11 | 6 |
8 | 沙僧 | 1 | 二师兄,你可以的 | 2020.10.27 20:59:55 | 7 |