zoukankan      html  css  js  c++  java
  • 1- 项目流程分析

    1、项目流程

    项目流程:
    
    1 搞清楚需求(产品经理)
    
      (1) 基于用户认证组件和Ajax实现登录验证(图片验证码)
    
      (2) 基于forms组件和Ajax实现注册功能
    
      (3) 设计系统首页(文章列表渲染)
    
      (4) 设计个人站点页面
    
      (5) 文章详情页
    
      (6) 实现文章点赞功能
    
      (7) 实现文章的评论
          ---文章的评论
          ---评论的评论
    
      (8) 富文本编辑框和防止xss攻击
    
    
    2 设计表结构
    
    
    3 按着每一个功能分别进行开发
      
    
    4 功能测试
    
    
    5 项目部署上线

    2、设计表结构

    2 设计表结构
    
                from django.contrib.auth.models import User,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)
                    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)
    
    
                    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  

     (1)UserInfo继承AbstractUser类

    之前的用户认证组件的User表是继承AbstractUser类,并且不能添加字段

    UserInfo继承AbstractUser类,
    auth_user的字段保留,也可以添加新的字段,
    
    旧字段
    username
    password
    email
    
    新添加的字段
    nid
    telephone
    avatar
    create_time
    blog
    

      

     

     (2)子评论:自关联

     

       (3)表结构解析

    一对一关系

    外键

    联合唯一

      (4)user blog category三个关系表

       (4)文章点赞

     

      (5)项目cnblog,生成表结构

      settings的连接mysql

    # 连接mysql数据库
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'cnblog',            # 要连接的数据库,连接前需要创建好
            'USER': 'root',           # 连接数据库的用户名
            'PASSWORD': 'root',          # 连接数据库的密码
            'HOST': '127.0.0.1',     # 连接主机,默认本级
            'PORT': 3306,            # 端口 默认3306
        }
    }

     settings中设置用户认证表:因为调用了

    # 用户认证表
    AUTH_USER_MODEL = 'blog.UserInfo'
    

     

    数据库表生成迁移

    E:PycharmProjectscnblog>python manage.py makemigrations
    E:PycharmProjectscnblog>python manage.py migrate
    

      

    报错情况,在__init__.py  添加

    import pymysql
    
    pymysql.install_as_MySQLdb()

     

  • 相关阅读:
    c#实现MD5加密
    AJAX学习笔记 一:简单的XMLHTTPRequest示例和asp.net异步更新。
    客户端JS验证fileupload控件,设置只允许特定的文件类型。
    三层架构下的用户登录检测。
    常用用户注册页面客户端验证脚本。
    Android Debug Bridge 技术实现原理
    Android反编译与防止反编译
    android用sharepreference保存输入框中的内容
    android include 控件详解
    android程序排序算法实现
  • 原文地址:https://www.cnblogs.com/venicid/p/9365019.html
Copyright © 2011-2022 走看看