1.准备
软件环境:
Python版本:2.7.13
Django版本:1.11.13
mariadb(MySQL)版本:5.5.44,数据库部署在CentOS 7(虚拟机)上
开发过程中使用了虚拟环境和Pycharm,此环境在windows上
使用了navicat作为开发中数据库可视化工具
物理条件:
联想笔记本一台
2.功能模块设计和数据库设计
2.1.功能模块设计
评论系统包含三个功能,评论录入,评论查看,评论删除。
(1)评论录入
说明:将用户的评论记录至后台
流程:进入评论页面后,用户输入邮箱和评论并从前端提交后,用户输入的数据将保存至后台数据库。
(2)评论查看
说明:查看所有的评论
流程:进入评论管理页面,后台根据页面请求,自动获取所有的评论信息传递给前台,并将其在前端格式化输出。
(3)评论删除
说明:删除选定的评论
流程:进入评论管理界面,选中删除条目点击删除进行删除。
功能模块图如下图:

图2-1 功能模块图
评论录入流程图:

图2-2 评论录入流程图
评论查看流程图:

图2-3 评论查看流程图
评论删除流程图:

图2-4 评论删除流程图
2.2.数据库设计
数据库内只包含一个表,评论信息表。评论信息包含以下属性:评论ID,评论时间,用户邮箱,用户评论。
以下是评论信息表的实体属性图:

图2-5 评论信息实体属性图
下表为评论信息表:
| 字段名 | 类型 | 字段描述 | 是否为主键 |
| commenf_id | varchar(50) | 评论id | 是 |
| comment_time | datetime | 评论时间 | 否 |
| user_email | varchar(254) | 用户邮箱 | 否 |
| user_comment | varchar(128) | 用户评论 | 否 |
3.详细设计
下图是工程目录结构,除了django默认生成的目录外,额外添加的目录包括:
apps:管理django app的目录。防止django app的根目录中显得过于零散。
static:静态文件存放目录。
django app中的function:存放当前app功能逻辑实现的目录。
django app中的templates:模板存放目录。

(1)url路径映射分为两部分root和app。将各app的url单独写入各自的urls.py,最后在root中引入各app的url。
根url
from django.conf.urls import url,include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^comment/',include('apps.commentctl.urls')), ]
app中的url
from django.conf.urls import url import views as commentviews urlpatterns = [ url(r'^$', commentviews.commentPage,name='commentIndex'), url(r'^success/$',commentviews.commentSuccess,name='commentSuccess'), url(r'^list/',commentviews.commentListPage,name='commentList'), ]
(2)创建数据表,在app的models.py中定义表结构。
models.py
# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models # Create your models here. class myCommentTable(models.Model): comment_id = models.CharField(primary_key=True,max_length=50,verbose_name=u'评论编号') comment_time = models.DateTimeField(verbose_name=u'评论时间') user_email = models.EmailField(verbose_name=u'用户邮箱') user_comment = models.CharField(max_length=128,null=True,verbose_name=u'用户评论')
(3)插入评论的实现
views.py
def commentPage(request): if request.method == "POST": # 如果前端提交的方法为POST时,获取前端表单提交的数据 str_userMail = request.POST.get('userMail',None) str_userComment = request.POST.get('userComment',None) dict_userinfo = { 'usermail':str_userMail, 'usercomment':str_userComment, } # 将从前端获取的信息写入数据库 writeCmtIntoDB(dict_userinfo) # 重定向页面 return HttpResponseRedirect(reverse(commentSuccess)) return render(request,'commentctl/myCommentPage.html') # 评论成功后的页面转跳函数 def commentSuccess(request): return render(request,'commentctl/reactionSuccess.html')
逻辑部分
# -*- coding:utf-8 -*- from apps.commentctl.models import myCommentTable import hashlib import time # 将信息写入数据库 def writeCmtIntoDB(dict_info): # 生成一个唯一ID和获取当前时间 comment_id = idGenerator() comment_time = getDatatime() obj_cmttab = myCommentTable() obj_cmttab.comment_id = comment_id obj_cmttab.comment_time = comment_time obj_cmttab.user_email = dict_info['usermail'] obj_cmttab.user_comment = dict_info['usercomment'] obj_cmttab.save() # 生成唯一ID,对当前时间进行md5加密 def idGenerator(): str_time = str(time.time()) hash_time = hashlib.md5() hash_time.update(str_time) uniqueID = hash_time.hexdigest() return uniqueID # 获取当前时间 def getDatatime(): return time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
效果图
评论页面如下图:

图3-1 评论页面
评论成功转跳页面如下图:

图3-2 转跳页面
(4)查看评论的实现
views.py
def commentListPage(request): # 获取当前页面编号 pagenum = request.GET.get('pagenum',None) if pagenum == None: pagenum = 1 pagenum = int(pagenum) # 获取页面列表 pagedict = getPageList(pagenum) # 获取评论列表 commentlist = getCommentList(pagenum=pagenum) # 获取删除指令 if request.method=="POST": id_comment = request.POST.get('delcommentid',None) delComment(id_comment) return HttpResponseRedirect(reverse(commentListPage)+"?pagenum="+str(pagenum)) dict_clpreturn = { 'commentlist':commentlist, 'pagedict':pagedict, 'prenum':pagenum-1, 'nexnum':pagenum+1, } return render(request,'commentctl/myCommentList.html',dict_clpreturn)
逻辑部分
# -*- coding:utf-8 -*- from apps.commentctl.models import myCommentTable # 根据当前页面编号,获取当前页面应该显示的评论列表 def getCommentList(keyword=None,pagenum=1): pagenum = int(pagenum) num_head = (pagenum-1)*10 num_tail = num_head+10 objlist_commentlist = myCommentTable.objects.all().order_by('-comment_time')[num_head:num_tail] return objlist_commentlist # 获取评论总数 def getCommentNum(keyword=None): return len(myCommentTable.objects.all()) # 获取分页列表 def getPageList(pagenum=1): pagenum = int(pagenum) preBtn = "hide" nexBtn = "hide" # 得到所有的评论数 cmtNum = getCommentNum() # 如果评论数可以整除10时,将页面的数量设置为(所有评论数/10)(默认每页显示10个),不可以整除时页面数量为(所有评论数/10+1) if cmtNum%10 == 0: allPageList = cmtNum/10 else: allPageList = cmtNum/10+1 # 如果页面总数不超过1,设置页面列表为空 if allPageList == 1: pagelist = [] else: # 当前页面不为第一页时,设置preview button为显示 if pagenum != 1: preBtn = "show" # 当前页面不为最后一页时,设置next buttom为显示 if pagenum != allPageList: nexBtn = "show" # 页面总数小于7的情况 if allPageList < 7 : pagelist = range(1,allPageList+1) # 页面总数大于7小于4的情况 elif pagenum > 4 : if pagenum+3 < allPageList: pagelist = range(pagenum-3, pagenum+3) else: pagelist = range(pagenum - 3, allPageList+1) else : pagelist = range(1,8) dictReturn = { 'preBtn': preBtn, 'nexBtn': nexBtn, 'pagelist': pagelist } return dictReturn
效果图如下

图3-3 评论列表界面
4.总结
本程序撰写花了大概一天的时间,包括逻辑和界面设计。其实整体逻辑是很简单的,唯一头痛的还是分页的逻辑部分,写的时候是相当的绕,后来才慢慢捋清思路。
之前写页面的时候都是自己手撕css和js,后来接触了bootstrap,构建前端页面的速度有了明显的提升。
本程序,相当于自己对自己所学的一个复习,之后准备写一个稍大一点的项目。
代码
https://github.com/zwy000009/cmtEmulator.git
浙公网安备 33010602011771号