• BBS


    项目流程:

    1、搞清楚需求(产品经理)

    (1)基于用户认证组件和Ajax实现登录验证(图片验证码)

    (2)基于form组件和Ajax实现注册登录

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

    (4)设计个人站点页面

    (5)文章详情页

    (6)实现文章点赞功能

    (7)实现文章评论;文章的评论、评论的评论

    (8)富文本编辑框和基于bs4模块防御xss攻击

    2、设计表结构

    3、按着每个功能进行开发

    4、功能测试

    5、项目部署上线

      登录注册,  注册用户,过滤验证--->一张用户表就可以。想描述这个人登录了怎么样,没有登录怎么样,就用到了cookie和session---->用户认证组件;

    用户认证组件的大前提是必须要用django自带的那个auth_user表,如果那些字段不够用怎么办?自己写一个UserInfo表,去继承AbstractUser这个类,AbstractUser里边有username、passowrd等auth_user里边的字段,进行数据库迁移的时候就生成了UserInfo这一张表,就不会再单独生成auth_user那张表了,UserInfo里边已经有它所有字段。

    我们之前用用户认证组件用的是auth_user表,现在就可以直接用UserInfo这个表了,因为User也是继承的AbstractUser,现在不继承了UserInfo直接去继承。

    UserInfo表里边应该还有title、site_name、theme字段,为了解耦把它放在Blog表里边,然后通过一对一关系去连接索取。

      UserInfo表和Blog表是一对一,UserInfo表和Blog、Category是一对多关系。只需要绑定一个一对多就可以了,另外一个通过跨表查询去查找。   Category表跟Blog绑定关系或者跟UserInfo绑定关系都可以,这里Category与Blog绑定了一对多的关系。如查询mm创建了多少个分类,通过mm找到站点Blog对象,站点Blog对象跟分类表Category绑定一对多的关系,通过站点Blog对象就能查出所有的分类表的字段了,也就是用户的分类对象了。

      Tag和Category表是一样的,一个站点Blog可以有多个标签Tag,一个标签Tag只能属于一个站点Blog。

      文章Article与分类Category,一个分类可以有多篇文章,一篇文章能否有多个分类?(可以设计成只有一个分类也可以设计成有多个分类)这里我们设计成了一篇文章只能有一个分类,(Tag标签和文章已经是多对多的关系了)。Article跟Category绑定了一对多的关系,同时跟Tag表绑定了多对多的关系,这里用到一个中介模型的概念,不用它去创建第三张表了,我们自己手动写第三张表。  文章Article与用户UserInfo是一对多的关系。 

      点赞表,哪一个用户user(去关联用户表)对哪一篇文章article(去关联文章表)点赞了True或者踩灭False。

      评论表Comment

      哪一个用户对哪一篇文章在哪个时间做了什么评论 ,涉及这4个字段

      要知道这些跟、子评论的父子关系,存的时候要把它描述出来,再加一个parent_comment_id字段

     跟评论:对文章的评论;111  222    333
      子评论:对评论的评论;444
                            555
    Comment
    nid user_id article_id  content parent_comment_id(null=True)
    1       1       1           111     null
    2       2       1           222     null
    3       3       1           333     null
    4       4       1           444     1
    5       5       1           555     4
    # -*- encoding:utf-8 -*-
    from django.db import models
    
    # Create your models here.
    
    from django.contrib.auth.models import User, AbstractUser
    
    
    class UserInfo(AbstractUser):  # 使用用户认证组件需要使用auth_user表,扩展这个表需要继承AbstractUser,User继承的就是AbstractUser
        """
        用户信息
        用户信息表和博客信息表是一对一的关系
        """
        nid = models.AutoField(primary_key=True)
        telephone = models.CharField(max_length=11, null=True, unique=True)
        avatar = models.FileField(upload_to='avators/', default="/avatars/default.png")  # 存本地用户图像字段
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)  # auto_now_add:默认当前时间
    
        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)
    
        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)
        user = models.ForeignKey(verbose_name='评论者', to='UserInfo', to_field='nid', on_delete=models.CASCADE)
        article = models.ForeignKey(verbose_name='评论文章', to='Article', to_field='nid', on_delete=models.CASCADE)
        create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
        content = models.CharField(verbose_name='评论内容', max_length=255)
    
        parent_comment = models.ForeignKey('self', null=True, on_delete=models.CASCADE) # 自己关联自己,自关联,可以写成self,也可以写成Commen
    
        def __str__(self):
            return self.content
    
        '''
        111
        `  444
              555
        222
        333
        Comment
        nid    user_id   article_id  content    parent_comment_id(null=True)
         1        1           1        111              null 
         2        2           1        222              null 
         3        3           1        333              null 
         4        4           1        444                1 
         5        5           1        555                4      
        '''

      查询一篇文章的评论数--->拿到文章对象必须跨表找到与它关联的所有的评论对象,数下有多少条。涉及跨表查询,效率非常低。我们引入了3个字段,其中有一个comment_content(文章的评论数),为了查询文章评论数的时候不必每次都跨表去查询,加一个文章评论数的字段。 -->以后每生成一个评论的时候把这个文章找到,把它的comm_content做一个自加1的操作,生成一个评论做一个自加1。  以后文章有多少个评论数,到这个字段里边去取就可以,不用跨表了。每生成一个评论找到它关联的文章做自加1,这个时候也跨表了,多做这一步属于添加的时候慢一点。对于web访问查询的操作要多多与添加。

      点赞也是一样的,加一个点赞字段,每生成一个点赞的时候找到这篇文章给它自加1就可以了

    settings里边

    改成用mysql

    DATABASES = {
        'default':{
            'ENGINE':'django.db.backends.mysql',
            'NAME':'cnblog',#要连接的数据库,连接前需创建好
            'USER':'root',#连接数据库的用户名
            'PASSWORD':'',#连接数据库的密码
            'HOST':'127.0.0.1',#连接本机,默认本机
            'PORT':'3306' #端口,默认3306
        }
    }
    #要想继承AbstractUser,应该在settings里边写入这个
    AUTH_USER_MODEL = "blog.UserInfo"

    应该先在mysql里边创建cnblog这个数据库再进行数据库迁移创建

    mysql> create database cnblog;
    Query OK, 1 row affected (0.22 sec)

    进行数据库迁移

    python manage.py makemigrations
    
    python manage.py migrate
    django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
    Did you install mysqlclient?

    如果提示你这个就 pip install mysqlclient下

     

  • 相关阅读:
    两道关于算法的面试题
    MySQL连接数过多程序报错"too many connections"
    Mysql中类似于Oracle中connect by ... start with的查询语句(木大看懂)
    获取当前div中的文本(只获取当前div的, 子元素不要, 基于layui)
    同一张地区表中根据汉字查询地区的代码
    HttpURLConnection getInputStream异常的解决
    IDEA报错No Spring WebApplicationInitializer types detected on classpath
    mybatis出现无效的列类型
    hibernate NUMBER 精度
    jmeter汉化或英化
  • 原文地址:https://www.cnblogs.com/mumupa0824/p/10415707.html
Copyright © 2020-2023  润新知