Django——博客项目

博客项目

目前的目标是构建一个基于Django的前后端完整的博客系统,首先对项目流程整理如下:

 

1. 分析需求

1.1. 基于用户认证组件和Ajax实现登录验证

图形验证码核心代码:

模板:

<div class="from-group">
                    <label for="pwd">验证码</label>
                    <div class="row">
                        <div class="col-md-6">
                            <input type="text" class=" form-control" id="valid_code">
                        </div>
                        <div class="col-md-6">
                             <img width="270" height="36" id="valid_code_img" src="/get_validCode_img/" alt="">
                        </div>
                    </div>
View Code

视图:

def get_validCode_img(request):
    def get_random_color():
        return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))

    # 方式一
    # with open('luffy.png',"rb") as f:
    #     data=f.read()

    # 方式二
    # from PIL import Image
    # img = Image.new('RGB',(270,40),color=get_random_color())
    # with open('validCode.png','wb') as f:
    #     img.save(f,'png')
    # with open('validCode.png',"rb") as f:
    #     data=f.read()
    # return HttpResponse(data)
    # 方式3
    #     from PIL import Image
    #     from io import BytesIO
    #     img = Image.new('RGB',(270,40),color=get_random_color())
    #
    #     f= BytesIO()
    #     img.save(f,'png')
    #     data = f.getvalue()
    #     return HttpResponse(data)
    # 4
    from PIL import Image, ImageDraw, ImageFont
    from io import BytesIO
    img = Image.new('RGB', (270, 40), color=get_random_color())
    draw = ImageDraw.Draw(img)
    pingfang = ImageFont.truetype('static/font/pingfang.ttf', size=28)
    char =str(random.randint(0,9))
    for i in range(5):
        random_num = str(random.randint(0, 9))
        random_low = chr(random.randint(95, 122))
        random_up = chr(random.randint(65, 90))
        random_char = random.choice([random_low,random_num,random_up])
        draw.text((i*50+20, 5), random_char, get_random_color(), font=pingfang)
    f = BytesIO()
    img.save(f, 'png')
    data = f.getvalue()
    return HttpResponse(data)
View Code

 

1.2. 基于forms组件和Ajax实现注册功能

1.3. 设计系统首页(文章列表渲染)

1.4. 设计个人站点页面

1.5. 文章详情页

1.6. 实现文章点赞功能

1.7. 实现文章的评论

  1.7.1. 文章的评论

  1.7.2. 评论的评论

1.8. 富文本编辑框和防止xss攻击

2. 设计表结构

 module代码:

from django.db import models

# Create your models here.


from django.contrib.auth.models import AbstractUser


class UserInfo(AbstractUser):
    """
    用户信息
    """
    nid = models.AutoField(primary_key=True)
    telephone = models.CharField(max_length=11, null=True, unique=True)
    avatar = models.FileField(upload_to='avatars/', default="avatars/default.png")
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)

    blog = models.OneToOneField(to='Blog', to_field='nid', null=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.username


class Blog(models.Model):
    """
    博客信息
    """
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='个人博客标题', max_length=64)
    site_name = models.CharField(verbose_name='站点名称', max_length=64)
    theme = models.CharField(verbose_name='博客主题', max_length=32)

    def __str__(self):
        return self.title


class Category(models.Model):
    """
    博主个人文章分类表
    """
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='分类标题', max_length=32)
    blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)

    def __str__(self):
        return self.title


class Tag(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(verbose_name='标签名称', max_length=32)
    blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid', on_delete=models.CASCADE)

    def __str__(self):
        return self.title


class Article(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=50, verbose_name='文章标题')
    desc = models.CharField(max_length=255, verbose_name='文章描述')
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    content = models.TextField()

    comment_count = models.IntegerField(default=0)
    up_count = models.IntegerField(default=0)
    down_count = models.IntegerField(default=0)

    user = models.ForeignKey(verbose_name='作者', to='UserInfo', to_field='nid', on_delete=models.CASCADE)
    category = models.ForeignKey(to='Category', to_field='nid', null=True, on_delete=models.CASCADE)
    tags = models.ManyToManyField(
        to="Tag",
        through='Article2Tag',
        through_fields=('article', 'tag'),
    )

    def __str__(self):
        return self.title


class Article2Tag(models.Model):
    nid = models.AutoField(primary_key=True)
    article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid', on_delete=models.CASCADE)
    tag = models.ForeignKey(verbose_name='标签', to="Tag", to_field='nid', on_delete=models.CASCADE)

    class Meta:
        unique_together = [
            ('article', 'tag'),
        ]

    def __str__(self):
        v = self.article.title + "---" + self.tag.title
        return v


class ArticleUpDown(models.Model):
    """
    点赞表
    """

    nid = models.AutoField(primary_key=True)
    user = models.ForeignKey('UserInfo', null=True, on_delete=models.CASCADE)
    article = models.ForeignKey("Article", null=True, on_delete=models.CASCADE)
    is_up = models.BooleanField(default=True)

    class Meta:
        unique_together = [
            ('article', 'user'),
        ]


class Comment(models.Model):
    """

    评论表

    """
    nid = models.AutoField(primary_key=True)
    article = models.ForeignKey(verbose_name='评论文章', to='Article', to_field='nid', on_delete=models.CASCADE)
    user = models.ForeignKey(verbose_name='评论者', to='UserInfo', to_field='nid', on_delete=models.CASCADE)
    content = models.CharField(verbose_name='评论内容', max_length=255)
    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
    parent_comment = models.ForeignKey('self', null=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.content
View Code

 

  1. 用户信息表
  2. 博客信息表
  3. 博主个人文章分类表
  4. 博主个人文章标签表
  5. 博文表
  6. 文章标签关联表
  7. 点赞表
  8. 评论表 

3. 功能开发

4. 功能测试

5. 项目部署上线

posted @ 2018-08-30 15:44  YanceDev  阅读(497)  评论(0编辑  收藏  举报