数据库课程设计 - Flow Blog

摘要

当今,随着Internet的迅速普及以及网络技术的发展,人们的生活也越来越离不开这些东西,忙碌的生活,对着荧光屏幕的一整天,或许有效的记录可以在我们的生命中留下重要的点滴。这样的情况下,一个在线版的个人博客系统就显得非常有必要了。

本文论述了个人博客的特点,以及对其系统设计进行分析,并给出其功能以及数据库的设计。


关键词

Python、MySQL、django、web应用程序开发、网站建设、CMS内容管理系统


系统概述

背景

博客最初始的名称是Weblog,由weblog两个单词组成,按照字面意思就为网络日记,后来喜欢新名词的人把这个词的发音故意改了一下,读成we blog,由此,blog这个词被创造了出来。

Weblog就是在网络上发布和阅读的流水记录,通常称为“网络日志”。

简言之,Blog就是以网络作为载体,作者可以迅速便捷地发布自己的心得感想,并且可以及时有效的与他人进行交流。另外,一个Blog系统某种意义上来讲也是博主的个性化体现,我们可以通过不同的文章去了解作者,去感受作者想要描绘的思想。

一个Blog其实就是一个网站,它里面通常包含很多篇文章,所有的文章按照时间倒序排列,而读者则可以针对阅读过的文章发出评论与作者进行交流。许多Blog文章都是作者心之所想事情的发表,或者针对某件事情的记录,又或是一些成功的经验。


名称

命名为Flow的原因

  • 文章归档形如流水线的设计
  • 更快、更简洁的流水式发布
  • min_cost_max_flow


作用

  • 个人的自由表达与发布
  • 知识的过滤与积累
  • 深度交流沟通的网络新方式

博客,之所以公开在网络上,就是因为他不等同于私人日记,博客的概念肯定要比日记大很多,它不仅仅要记录关于自己的点点滴滴,还注重提供的内容能否帮助到别人。


系统设计

系统需求分析

简述

我们都希望有一个自己的博客网站,因为它可以用来记录我们生活的点点滴滴,也可以分享一些实践乐趣、成功经验。博客是公开的,大家都可以看到我们的文章,同时也都可以通过留言评论与博主进行交流,共同进步。

于是Flow Blog诞生了。


系统目标

前台

  • 简约、快速、响应式设计
  • 可阅读文章并对其进行评论
  • 可通过分类或标签对文章进行过滤
  • 实现友情链接页面
  • 实现文章归档页面
  • 实现RSS阅读

后台

每一个用户都有自己在系统中的权限,而在满足权限的条件下,他可以

  • 创建组,并且可以修改该组所持有的权限
  • 添加用户,可对新添加的用户授权
  • 发表文章,文章可设置为对外公开或对外隐藏
  • 创建页面(首页侧边栏所有的全站链接)
  • 添加友链(友情链接页面)
  • 添加标签(一个文章可含有多个标签属性)
  • 添加分类(一个文章只能在一个分类里面)
  • 更新评论(对读者所评论的内容等做出修改)

性能

  • 实用性:旨在提高内容管理和发布的效率
  • 先进性:后台采用ajax技术进行异步刷新
  • 便捷性:无论身处何地,无论时间,只要接入Internet网络,便可以随时创建并发布自己的文章


技术可行性

对于在浏览器上运行的web程序来说,我们首先想到的应该是B/S架构,服务器进行处理并返回我们在浏览器上所进行的操作请求。因此,主要的编程即为服务器端的编程,结合关系型数据库,共同组成一个完整的博客系统。


数据库设计

实体集

首先,系统应该包含前台与后台,前台负责展示文章,后台可以添加并修改文章,因此系统中必须要有用户存在。

支持多用户同时登陆并进行操作,每一个用户可操作的内容不同,因此便有了用户权限问题,为了方便同样权限的用户统一管理,我们引入了的概念,管理员可以创建组并赋予组一定的权限,而在组中的用户便得到了这些权限,这有点类似于数据库中的角色。

作为博客系统,我们要能在其中发布自己的文章与页面,于是便派生出文章、页面这两个实体,一般情况下我们可以选择让这两者合并。

文章都应该有自己的分类、标签等属性,而读者则可以对已公开的文章进行评论,于是便有了分类、标签、评论三个实体。

既然一个博客在某种程度上可以体现我们的个性化程度,同时我们在阅览别人的博客时也为了方便,想保存他人的链接以备后用,友情链接是一个比较好的选择,我们可以通过它很快的进入到它所链接的页面,当然是我们已经添加的地址。由此,链接便是一个独立的实体。


实体描述
auth_user用户
auth_group组策略
auth_permission权限表
flow_page页面
flow_post文章
flow_category文章分类
flow_comment评论
flow_tag文章标签
flow_link友情链接
pyblog_log日志审计


auth_user
字段名类型大小默认值允许为空属性说明
idint11False主键、自增用户ID编号
passwordvarchar128False用户密码(md5)
last_logindatetime6False用户最后一次登录时间
is_superusertinyint10False是否为管理员
usernamevarchar150False唯一用户登录名
first_namevarchar30True
last_namevarchar30True
emailvarchar254False唯一用户邮箱
is_stafftinyint10False是否拥有管理
is_activetinyint10False是否活跃
date_joineddatetime6False用户注册时间


auth_group
字段名类型大小默认值允许为空属性说明
idint11False主键、自增组ID编号
namevarchar80False组名称


auth_permission (static)
字段名类型大小默认值允许为空属性说明
idint11False主键、自增权限ID编号
namevarchar255False权限内容
codenamevarchar100False权限别名


flow_page
字段名类型大小默认值允许为空属性说明
idint11False主键、自增页面ID编号
titlevarchar80False页面标题
contentlongtextTrue页面内容
aliasvarchar80False唯一页面别名
createddatetime6False页面创建日期
modifieddatetime6False页面最后修改日期


flow_post
字段名类型大小默认值允许为空属性说明
idint11False主键、自增文章ID编号
createddatetime6False文章创建日期
modifieddatetime6False文章最后修改日期
titlevarchar80False文章标题
contentlongtextTrue文章内容
excerptlongtextTrue文章描述
statustinyint10False是否隐藏{1:’public’,0:’hide’}
passwordvarchar80True文章加密密码
aliasvarchar80False唯一文章别名
viewsint100False文章浏览次数
imagevarchar200True文章特色图片url


flow_category
字段名类型大小默认值允许为空属性说明
idint11False主键、自增分类ID编号
titlevarchar80False分类标题
aliasvarchar80False唯一分类别名
descriptionlongtextTrue分类描述


flow_comment
字段名类型大小默认值允许为空属性说明
idint11False主键、自增评论ID编号
authorvarchar30False评论者名称
author_emailvarchar254False评论者email
author_urlvarchar200True评论者url
author_ipchar39False当前评论发出IP地址
createddatetime6False评论时间
contentlongtextFalse评论内容


flow_tag
字段名类型大小默认值允许为空属性说明
idint11False主键、自增标签ID编号
titlevarchar80False标签名称
aliasvarchar80False唯一标签别名


字段名类型大小默认值允许为空属性说明
idint11False主键、自增链接ID编号
titlevarchar80False链接名称
urlvarchar200False链接地址
descriptionlongtextTrue链接描述
imagevarchar200True链接特色图片


pyblog_log
字段名类型大小默认值允许为空属性说明
idint11False主键、自增日志ID编号
action_timedatetime6False记录时间
change_messagelongtextFalse更改内容
typevarchar20False更改类型


联系集
auth_user_user_permissions

对于每一个用户,他都有自己在系统中的权限,因此用户和权限之间便具有了联系,并且每个用户可以拥有多个权限,每个权限也可以被多个用户所拥有,由此可以得出这是一个多对多的联系。

派生表

字段名类型大小
idint11
user_idint11
permission_idint11


auth_user_groups

之前有过说明,我们引入了组的概念,每一个用户可以同时属于多个组,每一个组中也可以存在多个用户,于是,组与用户之间存在多对多的关系。

派生表

字段名类型大小
idint11
user_idint11
group_idint11


auth_group_permissions

管理员可以创建一个组,并且对这个组赋予不同的权限,每个组可以同时拥有多个权限,而每一个权限也可以分配给多个组,于是,组与权限之间也是多对多的关系。

派生表

字段名类型大小
idint11
group_idint11
permission_idint11


post_user

对于文章与用户来说,每一个用户可以发表多篇文章,而每一篇文章的作者只有一个,因此,用户与文章是一对多的关系,其外键字段添加到文章实体中,参照用户id。


post_category

每一篇文章只能有一个分类,而每一个分类中可以有多篇文章,分类与文章也属于一对多的关系,外键字段添加到文章实体中,参照分类id。


category_category

我们所能想到的分类,某些时候可能会包含它的子分类,也就是分类与分类之间也存在这样的关系,因为每一个分类只可能会有一个父分类,而它却可以同时拥有多个子分类,所以分类与分类间属于一对多的关系。


post_tag

用户在发表文章的时候,可以为该文章添加多个标签属性,同时每一个标签下面可能会有多篇文章,于是,标签与文章之间存在多对多的关系。

派生表

字段名类型大小
idint11
post_idint11
tag_idint11


post_comment

因为读者可以为一篇文章发表自己的评论,而每个评论只能对应一篇文章,因此,文章与评论之间存在一对多的关系,外键字段添加到评论实体中,参照文章id。


comment_comment

某些时候,其他一些读者在阅读文章的时候会看到该文章的所有评论,当然,他也可以对这些评论进行反驳或者回复,于是,每一条评论都含有了它的父评论,也就是目标评论,而直接回复给文章的评论我们可以给其默认一个值,作为程序约束,由此我们可以看出,评论与评论之间的关系也是属于一对多的,外键字段添加到评论实体中,参照评论id。


pyblog_log

通过触发器记录了系统中的一些敏感操作,比如文章创建、修改与删除。


整体物理模型

img


网站设计

网站主要分为两部分:

  • 前台展示部分
  • 后台管理部分


系统架构

基于B/S(browser/server)结构,用户所做的所有操作都可在浏览器上完成,而服务器则会对用户的不同操作返回不同的处理结果。


系统开发软硬件环境
  • **操作系统:**Windows 10、Ubuntu 16.04
  • **Web服务器:**Apache/Nginx
  • 网络和硬件平台:任何可以连接到Internet的PC设备
  • **数据库:**MySQL 5.6
  • **编程语言:**Python 3.5
  • **后端框架:**django
  • **界面、程序设计工具:**Pycharm 2016.3、Google Chrome 57、Firefox Developer Edition 等工具。


系统运行环境
  • **操作系统:**Windows Vista及以上版本、Linux、Unix
  • **数据库:**MySQL 5.6
  • **web服务器:**Apache/Nginx
  • 环境搭建需要:
    • Python 3.5
    • django 1.10.4
    • markdown 2.6.7
    • bootstrap-admin 0.3.7.1
    • PyMySQL 0.7.9
    • pytz 2016.10


数据库的选择

常用的关系型数据库有MySQLSQL Server,在这里我选择了MySQL,MySQL是一个开源的小型关系型数据库管理系统,目前它被广泛应用在Internet上的中小型网站中。


使用MySQL的原因:

  • 它是一个真正的多用户、多线程的数据库管理系统
  • 小巧、功能齐全
  • 可运行在Windows/Linux/Uinx等多种操作系统平台
  • 拥有非常灵活并且安全的权限和口令系统,当客户与MySQL服务器连接时,它们之间所有的口令传送会被加密
  • 拥有一个非常快速而稳定的基于线程的内存分配系统,可以持续使用而不必担心其稳定性
  • 强大的查询功能,支持查询的SELECT和WHERE语句的全部运算符和函数,并且可以在同一查询中混用来自不同数据库的表,从而使得查询变的快捷和方便


功能模块
首页

加载文章列表,所有公开的文章分页显示

url(r'^$', views.home),

img


文章页

通过访问链接中的id查询文章内容,并在服务器端渲染后返回

url(r'^detail/(?P<id>\d+).html$', views.detail, name='detail'),

img


普通页面

通过页面别名查询页面内容,渲染后返回数据

url(r'^(?P<alias>\w+)$', views.post_meta, name="post_meta"),

img


友情链接页面

查询当前所有存储的链接,并利用特定的模板渲染返回

url(r'^links$', views.links, name='links'),

img


归档

查询当前已有的所有分类,以及该分类下的文章,返回的页面中按分类分块

url(r'^categories/?$', views.categories, name='categories'),

img


查找

利用接收到的参数,对所有的文章进行查找,所查找的字段包含文章标题以及文章描述

url(r'^search/$', views.blog_search, name='search'),

img


通过分类或标签对文章过滤

分别查询某一标签或者某一分类中公开的文章并渲染返回

url(r'^tag/(?P<tag>\w+)/?$', views.search_tag, name='search_tag'),
url(r'^category/(?P<category>\w+)/?$', views.category, name='category'),

img


Feed

对目前已经存在的文章进行RSS模式处理返回

url(r'^feed/?$', views.RSSFeed(), name="RSS"),

img


django 运行处理机制

当访问url时,django会根据ROOT_URLCONF的设置来装载URLConf。

然后按顺序逐个匹配URLConf里的URLpatterns,如果找到则会调用相关联的视图函数,并把HttpRequest对象作为第一个参数(通常是request)。

最后该view函数负责返回一个HttpResponse对象,然后找到相应的模板渲染出最终的页面返回给客户端。

img


总结

本文主要从数据库设计方面,分析了一个博客系统的内部的实体联系,利用Python语言+django框架实现了基于B/S的博客系统。

在这一次的课程设计中,我进一步的认识到了数据库应用系统设计的重要性,更少的数据冗余对数据库设计来说真的非常重要,以前都是用别人开发的博客系统,曾经有过为自己写一个同样系统的打算,最终因为没有时间而搁置,而这一次的数据库课程设计,在完成课程设计的同时我也完成了很久之前计划的任务。

虽然整个系统中涉及到的算法不多,但是前端的层叠样式表的设计还是花费了很多时间。

另外,程序的实现过程比较简单,博客的浏览速度也挺快,但是整个系统中还是存在着一些不足:

  • 文章的实体应该与页面实体合并 (因为编程方面困难所以拆开了,以后会重新编写这一部分)
  • 文章含有密码字段,但是在系统中并没有真正用到 (以后考虑继续完善这一功能)
  • 站点主题不可更改 (以后考虑加入模板机制,可在配置中自由更改站点主题)

同时我也体会到了各方面知识结合运用的重要性,当然我也会继续努力,并不断完善这一系统。


项目链接: Flow Blog


参考文献

[1] 朱波,黄勇.内容管理实话实说[J].微电脑世界,2002(ZI):1-10.

[2] 覃国蓉.基于B/S架构的软件项目实训[M].海淀:电子工业出版社,2004:40.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值