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 评论信息实体属性图

下表为评论信息表:

表2-1 评论信息表
字段名 类型 字段描述 是否为主键
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

 

posted on 2018-05-25 18:29  jokerpoint  阅读(70)  评论(0)    收藏  举报