博客系统整体思路

前言:                                                      

  这是我第一次写博客,虽然我的博客园账号已经创建的5个月了。这种感觉就好像我创建于1998年,但是在2018年1月18号我才用python写下第一句代码:“hello,world”一样。

  word less,do more。让我们开始进入正题。

前提:                                 

  首先我们先来明确我们写一个项目的流程是什么:

           1. 搞清楚需求(产品经理提出)

               #你要花很多时间和产品经理讨论这个事,不能南辕北辙

           2. 设计表结构

               #把项目所有的功能的表结构都设计出来。

               #如果你实现一个功能设计一张表,那么一个月后你突然发现这张表和前面的有冲突,然后这张表你又必须得要,那么前面的内容就得推倒重做了。

               #所以说你一定要高瞻远瞩,格局放到最高,然后一步一步弄清楚细节,最后再去实现。

          3. 按每一个功能进行开发。

          4. 功能测试(每个企业会有专门的测试岗位)

          5. 项目部署上线(放去服务器,这个我们最后会讲)

               #我们现在只需要做到第三步就可以了。

第一步:搞清楚需求                                 

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

 

          (2) 注册功能:基于forms组件和Ajax实现注册功能

 

          (3) 分页:设计系统首页,完成文章列表渲染

 

          (4) 设计个人站点页面(ORM查询:练习分组和多表查询的)

 

          (5) 文章详情页

 

          (6) 实现点赞功能

 

          (7) 实现文章的评论(文章的评论,评论的评论)

 

          (8) 后台管理页面

 

          (9) 副文本编辑框和防止xss攻击(防止用户恶意评论导致用户安全受威胁)

第二步:设计表结构                                                                                     

   图例:

    

  代码展示:

 1 from django.db import models
 2 
 3 # Create your models here.
 4 from django.contrib.auth.models import User,AbstractUser
 5 
 6 class UserInfo(AbstractUser):
 7 '''用户信息表'''
 8 id = models.AutoField(primary_key=True)
 9 telephone = models.CharField(max_length=11,null=True,unique=True)
10 avatar = models.FileField(upload_to='avatars/',default="/avatars/default.png")
11 create_time = models.DateTimeField(verbose_name="创建时间",auto_now_add=True)
12 blog = models.OneToOneField(to="Blog",to_field="id",null=True,on_delete=models.CASCADE)
13 
14 def __str__(self,on_delect=models.CASCADE):
15 return self.username
16 
17 class Blog(models.Model):
18 "博客信息表(站点表)"
19 id = models.AutoField(primary_key=True)
20 title = models.CharField(verbose_name="个人博客标题",max_length=64)
21 site_name = models.CharField(verbose_name="站点名称",max_length=64)
22 theme = models.CharField(verbose_name="博客主题",max_length=32)
23 
24 def __str__(self):
25 return self.title
26 
27 class Category(models.Model):
28 "博主个人文章分类表"
29 id = models.AutoField(primary_key=True)
30 title = models.CharField(verbose_name="分类标题",max_length=32)
31 blog = models.ForeignKey(verbose_name="所属博客",to="Blog",to_field="id",on_delete=models.CASCADE)
32 
33 def __str__(self):
34 return self.title
35 
36 class Tag(models.Model):
37 "标签表"
38 id = models.AutoField(primary_key=True)
39 title = models.CharField(verbose_name="标签名称",max_length=32)
40 blog = models.ForeignKey(verbose_name="所属博客",to="Blog",to_field="id",on_delete=models.CASCADE)
41 
42 def __str__(self):
43 return self.title
44 
45 class Article(models.Model):
46 "文章表"
47 id = models.AutoField(primary_key=True)
48 title = models.CharField(verbose_name="文章标题",max_length=50)
49 desc = models.CharField(verbose_name="文章描述",max_length=255)
50 content = models.TextField()
51 
52 comment_count = models.IntegerField(default=0)
53 up_count = models.IntegerField(default=0)
54 down_count = models.IntegerField(default=0)
55 
56 user = models.ForeignKey(verbose_name="作者",to="UserInfo",to_field="id",on_delete=models.CASCADE)
57 category = models.ForeignKey(to="Category",to_field="id",null=True,on_delete=models.CASCADE)
58 tags = models.ManyToManyField(to="Tag",through="Article2Tga",through_fields=("article","tag"))
59 
60 def __str__(self):
61 return self.title
62 
63 class Article2Tga(models.Model):
64 id = models.AutoField(primary_key=True)
65 article = models.ForeignKey(verbose_name="文章",to="Article",to_field="id",on_delete=models.CASCADE)
66 tag = models.ForeignKey(verbose_name="标签",to="Tag",to_field="id",on_delete=models.CASCADE)
67 
68 class Meta:
69 unique_together = [("article","tag"),]
70 
71 def __str__(self):
72 v = self.article.title + "---" + self.tag.title
73 return v
74 
75 class ArticleUpDown(models.Model):
76 "点赞表"
77 id = models.AutoField(primary_key=True)
78 user = models.ForeignKey(verbose_name="用户",to="UserInfo",to_field="id",null=True,on_delete=models.CASCADE)
79 # user = models.ForeignKey("UserInfo",null=True) #导师这个表是这种写法,意思跟上行代码一样
80 article = models.ForeignKey(verbose_name="文章",to="Article",to_field="id",null=True,on_delete=models.CASCADE)
81 is_up = models.BooleanField(default=True)
82 
83 class Meta:
84 unique_together = [("article","user"),]
85 
86 class Comment(models.Model):
87 "评论表"
88 id = models.AutoField(primary_key=True)
89 user = models.ForeignKey(verbose_name="评论者",to="UserInfo",to_field="id",on_delete=models.CASCADE)
90 article = models.ForeignKey(verbose_name="评论文章",to="Article",to_field="id",on_delete=models.CASCADE)
91 create_time = models.DateTimeField(verbose_name="创建时间",auto_now_add=True)
92 content = models.CharField(verbose_name="评论内容",max_length=255)
93 
94 # parent_comment = models.ForeignKey("self",null=True) #导师是这样写的
95 parent_comment = models.ForeignKey(verbose_name="父级评论",to="Comment",to_field="id",null=True,on_delete=models.CASCADE)
96 
97 def __str__(self):
98 return self.content
View Code

  提醒:你在写这个UserInfo表的时候是把原先的Django自带的django-user表替代了,但是你要告诉Django一声,所以我们需要在settings中进行配置。

 1 DATABASES = {
 2 'default':{
 3 'ENGINE':'django.db.backends.mysql',
 4 'NAME':'blog', #要连接的数据库,连接前需要创建好
 5 'USER':'root', #连接数据库的用户名
 6 'PASSWORD':'123', #连接数据库的密码
 7 'HOST':'127.0.0.1', #连接主机,默认本级
 8 'PORT':3306, #端口 默认3306
 9 }
10 }
11 AUTH_USER_MODEL = "blog.UserInfo"
View Code

第三步:功能实现                                                           

  说明:关于这部分,我目前还没有去实现,所以以后进行补充

                                                        

猜你喜欢

转载自www.cnblogs.com/python-Li/p/9263856.html