1. 引言
1.1 编写目的
本文档用于描述“个人博客”项目的系统需求,作为该项目的概要设计的设计依据.
这个分析的阅读对象为菜鸟在线教师和班级同学.
1.2 开发背景
开发地点: 菜鸟在线培训基地H5教室
开发项目名称: 个人博客
介绍:个人博客是一种简单的博客,自建的独立网站,有自己的空间和页面风格.个人博客的作者一般注重博客的内容,即使并没用那么多的人去浏览.博客并不是一种交流的方式,它只是一种技术之间的交流,比如github,博客园等.
1.3 开发环境
由于是初学者,在技术存在一定的局限性,本个人博客网站的系统功能并不是十分全面,安全性能也做的也不是很好.
此次采用的是Django框架和Python语言,数据库使用MySQL数据库.选用django作为开发框架是因为它是个很全面的重量级框架,用它快速开发网站是比较方便快速的,他的后台管理机制可以让我们少些很多代码来实现一个完整的后台管理界面.而python语法简洁清晰,编写方便,扩展性和嵌入性都很好.
2. 总体设计
2.1 设计思想
主要实现以下功能:
个人博客的主页显示
可以进行一个文章的显示及阅读功能
可以让用户实现注册功能
让用户实现在文章下的评论功能
让文章有一个排行和推荐的功能
将文章可以进行一个标签分类
主页主要显示的广告可以用后台进行更换
可以通过后台进行网页中信息的更替
2.2 系统功能
根据网站的主页特点,可以将其分为广告部分,文章分类部分,文章部分,文章标签云部分,文章归档,友情链接.
据网站后台的内容,可以分为: 分类,友情链接,广告,文章,标签,用户,评论.
3. 功能设计
1.创建项目和应用
(1)在指定的文件夹下创建django项目——django-admin.py startproject website(项目名)
(2)运行测试服务器:在项目基准目录下,执行 ./manage.py runserver 127.0.0.0:8000
(3)创建APP ——./manage.py startapp myapp(应用名)
2.setting设置
在INSTALLED_APPS下添加自己的应用名:myapp
添加数据库DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'shun',
'USER':'root',
'PASSWORD':'1',
'HOST':'',
'PORT':'',
}
}
更改时区Asia/shanghai和语言zh-Hans,
静态文件的设置:
MEDIA_URL = '/uploads/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
AUTH_USER_MODEL = 'myapp.User'
STATIC_ROOT = "static_file"
STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)
3.数据库的设计:
本项目用的是MySQL数据库,
数据库中创建了用户表,文章表,分类表,评论表,标签表,友情链接表,广告表.
数据表的创建写在了models里面,创建数据库后进行数据库同步即可.
同步的指令:python manage.py makemigrations
python manage.py migrate
4. 配置使用admin,
(1). 在admin 中注册(from models import *)
admin.site.register(Category)
admin.site.register(Article, ArticleAdmin)
admin.site.register(Tag)
admin.site.register(Links)
admin.site.register(Comment, CommentAdmin)
admin.site.register(Ad)
admin.site.register(User)
(2).在INSTALLED_APPS中添加django.contrib.admin
(3).配置urls.py
url(r'^admin/', include(admin.site.urls))
(4).在admin下注册一个超级用户.
其中还在admin中添加了副文本编辑器:
步骤:
1、下载kindeditor
2、定义ModelAdmin的媒体文件
class Media:
js = (
'/static/js/kindeditor-4.1.10/kindeditor-min.js',
'/static/js/kindeditor-4.1.10/lang/zh_CN.js',
'/static/js/kindeditor-4.1.10/config.js',
)
3、修改kindeditor的配置文件
5. url设计
(1.引入url、include函数(from django.conf.urls import url,include),
url(r'^',include('myapp.urls'),
实现url的分别管理
(2.网站图标的实现:
url(r'^favicon\.ico$',RedirectView.as_view(url='/static/favicon.ico'),name='favicon'),
将需要设置的网站图标放在static下 ,设置url 即可。
6.models 的设计
(1) 根据我们设计的博客的功能,需要有的数据表模型有User、ArticleManager、Category、Tag、
Article、 Links、Comment、Ad
其中文章需要和分类,标签有外键的关联:
category = models.ForeignKey(Category, blank=True, null=True, verbose_name='分类')
tag = models.ManyToManyField(Tag, verbose_name='标签')
评论的外键:
user = models.ForeignKey(User, blank=True, null=True, verbose_name='用户')
article = models.ForeignKey(Article,blank=True,null=True,verbose_name='文章')
pid = models.ForeignKey('self', blank=True, null=True, verbose_name='父级评论')
(2)链接:标签和广告都需要有网站的链接,这里需要在models里设计。
AD:
callback_url = models.URLField(verbose_name='url地址')
LINK:
callback_url = models.URLField(null=True, blank=True, verbose_name='url地址')
7.图片的上传
在设计models 的时候,有在用户头像和广告部分涉及到图片,所以这里需要设计图片的上传。我们需要把图片上传的特定的文件夹,在models里需要update_to (mage_url = models.ImageField(upload_to='ad/%Y/%m', verbose_name='图片路径').
具体图片上传的设置,将图片放置在uploads文件下:
(1)setting中的设置:
MEDIA_URL = '/uploads/'
MEDIA_ROOT = os.path.join(BASE_DIR,'uploads')
(2)url设置,在website中的urls.py中:
url(r'^uploads/(?P<path>.*)$',static.serve, {'document_root': settings.MEDIA_ROOT,}),
在设置之前,需要导入from django.views import static.
8.分页和文章归档的设计
1.文章归档
分页的实现需要设计Manager,为Article类的objects添加 新的attribute 。具体你实现如下:
(1)class ArticleManager(models.Manager):
def distinct_date(self):
distinct_date_list = []
date_list = self.values('date_publish')
for date in date_list:
date = date['date_publish'].strftime('%Y/%m/%d')+'文章存档'
if date not in distinct_date_list:
distinct_date_list.append(date)
return distinct_date_list
(2)在Article类中添加objects属性
objects = ArticleManager()
2.分页
分页是需要实现分页器的设计,如下:
def getPage(request,article_list):
paginator=Paginator(article_list,5)
try:
page = int(request.GET.get('page',1))
article_list = paginator.page(page)
except(EmptyPage,InvalidPage,PageNotAnInteger):
article_list = paginator.page(1)
return article_list
9.表单和登录、注册
(1).表单的设计
表单的提交用在评论、注册、登录,需要在form.py中写入这3个的表单。
(2).登录和注册
登录和注册需要导入logout, login, authenticate(from django.contrib.auth import logout, login, authenticate),同时表单的提交用到request 的POST方法。
4.部署上线
1.nginx
安装:sudo apt-get install ngin
nginx的启动.停止和重启:sudo /etc/init.d/nginx startsudo /etc/init.d/nginx stopsudo /etc/init.d/nginx restart
2.uwsgi
sudo
pip install uwsgi
3.
配置
nginx
将/etc/nginx/目录下的uwsgi_params文件拷贝到你的django项目下.
在django项目文件夹下创建文件mysite_nginx.conf
#mysite_nginx
upstream django{
server 127.0.0.1:8001;
}
server {
listen 8000;
server_name bokesite.example.com;
charset utf-8;
client_max_body_size 75M;
location /media {
alias /home/linux/ajango/bokesite/uploads;
}
location /static {
alias /home/linux/ajango/bokesite/static_file;
}
location / {
uwsgi_pass django;
include /home/linux//ajango/bokesite/uwsgi_params;
}
}
4.配置uwsgi
在django项目下创建文件uwsgi.ini.
[uwsgi]
#http = :8000
socket = 127.0.0.1:8001
chdir = /home/linux/ajango/bokesite
wsgi-file = bokesite/wsgi.py
processes = 4
threads = 2
stats = 127.0.0.1:8080
vacuum = true