第十七章:BBS(仿博客园项目笔记部分)

博客项目需求分析
-首页(显示文章)
-文章详情
-点赞,点踩
-文章评论
-字评论
-评论的展示
-登录功能(图片验证码)
-注册功能(基于form验证,ajax)
-个人站点(不同人不同样式,文章过滤)
-后台管理:
-文章展示
-新增文章
-富文本编辑器

数据库设计:
User
-nid
-name
-password
-email
-phone
-avatar 用户头像
-create_date 用户注册时间
-blog
Blog
-nid
-title
-site_name
-theme
category:
-nid
-title
-blog 跟blog一对多

tag:(文章关键字)
-nid
-title
-blog 跟blog一对多

article
-nid
-title
-desc 摘要
-create_time auto_add_now:当该条记录创建时,自动添加当前时间
-content 文章内容

-category 一对多
-tag 多对多
-blog 一对多

commit
-nid
-user 哪个用户
-article 对哪篇文章
-content 评论了什么内容
-commit_time 时间

-parent_id
如何实现根评论与子评论?
-有同学分析,要再建一张表,跟commit是一对多的关系(不好)

-如何用这一个表,表示出根评论和子评论?
-再加一个字段,标志,给那条评论,评论的



nid user article content parent_id

1 1 1 111 null
2 2 1 222 null
3 3 1 333 1
4 4 1 444 3
5 3 1 反弹 4
UpandDown
-nid
-user 哪个用户
-article 对哪篇文章
-is_up 点赞还是点踩

 

UserInfo----->auth组件
-跟blog是一对一
blog----个人站点
category---分类表
-跟blog,一对多

tag----标签表(关键字)
-跟blog 一对多
-跟文章是多对多(得有第三张表,这个关联字段放在了文章表)

article
-跟blog是一对多
-跟category是一对多
-跟tag是多对多(关联字段写在谁中都可以)

updanddown
-跟user一对多
-article 一对多

commit
-跟user一对多
-article 一对多

-parent 跟自己做一对多的关联(自关联)

登录:
-前端:
-label--->for-->指定一个id,点label的时候,指定的id的控件会获取焦点
-后台:
-返回图片
-直接打开图片,返回二进制
-自动生成图片pillow
img = Image.new('RGB', (320, 35), color=get_random_color())
-内存管理:
f=BytesIo()
元来存到硬盘上的f文件,现在存到内存中的f
img.save(f)
读出来:
f.getValue()
----往f中设置值
f.write(b'ddfaddfd')
-随机一个颜色
-在图片上写文字
-

-登录功能
-获取验证码
-验证码刷新
- $("#img_code").click(function () {
//在路径后面加一个问号
//$("#img_code")[0].src+=?
// alert(11)
$("#img_code")[0].src+='?'

})
-验证码保存
保存到session中
-注册功能
forms组件

 

1 验证码刷新
-$("#img_code")[0].src+="?"
-本质就是向这个地址又发了一次请求


2 js中字符串拼接
-es5之前是没有字符串替换
'lqz'+'is handsome'
-且听下回分解(自己去学,es6的语法)

3 python中字符串替换
-'%s is handsome'%"lqz"
-'{}is handsome'.format('lqz')

4 注册
-用forms组件渲染
-forms组件
-定义一个类,继承自Form
-写一些字段
-指定生成的input框是什么类型的
widget=widgets.PasswordInput(attrs={'class': 'form-control','id':''}))
-校验数据:
-传入的数据多?可以校验,只是clean_data中多的数据没了
-传入的数据少,is_valiad(),false
-不管校验通过与失败,clean_data始终会有校验通过的值
-form对象有errors(字典,字典的value值是列表),
-单个属性也有errors,通常情况也是取第0个位置的错误信息
-局部钩子函数
-全局钩子函数

-模板渲染:
-for循环这种方式
-csrf:urlencoded,formdata---->django能给分解
-放在header中
-头像预览

 

注册错误页面渲染
-个人首页
-栅格系统
-admin的简单使用
-
要点:
-个人站点路由设计
- 放到最后,都匹配完成,没有匹配到,再匹配它
url(r'^(?P<username>[\w]+)', views.user_blog),
-视图函数:
def user_blog(request,username):
print(username)
去数据库过滤,存在,返回个人博客,不存在,返回404页面
-个人站点样式的显示
-不同的人都有一个自己的css文件,
-<link rel="stylesheet" href="/static/css/{{ blog.theme }}">


截断函数

文章标题 时间 blog_id y_m
文章1 2018-11-29 03:27:22.342697 1 2018-11
文章2 2018-10-02 03:28:03.000000 1 2018-10
文章3 2018-10-11 03:29:16.000000 1 2018-10

group by mouth
from django.db.models.functions import TruncMonth
models.Article.obbject.all().annotate(y_m=TruncMonth('create_time)).vaules('y_m').

annotate(coun=Count('y_m')).values('y_m','coun')

 

一 个人站点路由设计
-url(r'^(?P<username>[\w]+)', views.user_blog),
-放在路由的最后
-有名分组:(?P<分组的名字>\w+)
二 分组查询:
-查询当前站点下每个分类的文章数
-总结:filter在前,表示where,values在前,表示group by,
value在后,表示取值,filter在后,表示havaing
-Category.objects.all().filter(blog=blog).annotate(cout=Count(article__title)).values_list('title','count')
-查询当前站点下每个标签的文章数
-Tag.objects.all().filter(blog=blog).annotate(cout=Count(article__title)).values_list('title','count')
-归档:查询当前站点每年每月发表的文章数
-截断函数
-from django.db.models.functions import TruncMonth -Article.objects.all().filter(blog=blog).annotate(y_m=TruncMonth('create_time')).values('y_m').annotate(cout=Count(y_m)).values_list('y_m','count')


要点:
-inclosion_tag
-在app下创建一个模块:名字必须叫:templatetags
-在模块下创建一个py文件:my_tag.py(这个名字随意)
-my_tag.py下,写方法:
-from django.template import Library
-register = Library() register名字不能变
@register.inclusion_tag('classify.html')
def classify(username):
return 字典
-使用:
在模板中:
-{%load my_tag%}
-{% classify 传参%}

 

-查询标签下的文章
-查询分类下的文章
-查询归档文章
-设计路由:url(r'^(?P<username>[\w]+)/(?P<condition>category|tag|archive)/(?P<param>.*)', views.user_blog),

-inclusion_tag
-创建一个模块(文件夹)templatetags(名字一定)
-在模块下新建一个py文件:XX.py
-在py文件中写:
-from django.template improt Library
-register=Library()
-@register.inclusion_tag('模板文件')
-def 函数():
return 字典
-返回的字典,在模板中可以拿到
-写任意的html页面(用模板语言渲染)
-使用:
-{% load XX %}
-{% 函数 参数1%}

-文章详情页
-模板继承
-定义一个母版
-定义几个盒子({% block 名字%})
-使用:
-{% extends 'base.html' %}
-扩写盒子
-模板语言渲染:DTL
-文章内容,在数据库存,不是一个纯文本,它是html的代码
-用safe处理,要注意,数据是安全的
-点赞
-图片防盗链
-事务
- with transaction.atomic():
-F函数:
-models.Article.objects.filter(pk=article_id).update(up_num=F('up_num')+1)

要点:

-清浏览器缓存

-评论功能
-构建样式

-根评论提交

-显示根评论
-render显示
-ajax的显示
-提交子评论

-显示子评论
-render显示
-ajax的显示

-点赞
-前端样式
-后台逻辑
-评论
-根评论
-子评论
-render显示
-ajax显示

要点::
后台管理页面
文章新增

富文本编辑器

 

-后台管理:用bootstrap的js组件,必须引入它的js,但是它的js依赖于jquery,需要先导入jquery,再倒入它的js
	-lay-ui--自己看看
	
	-母版
		-写一个模板,里面留几个盒子
		{%block 名字 %}
			也可以写东西
		{% endblock %}
		-使用:
			在子模板中:
			{% extends '母版的名字'%}
				{%block 名字 %}
					也可以写东西
				{% endblock %}
	-文章新增
		-布局
		-富文本编辑器:kindeditor	
			-官网下载:引入到项目中
			-   KindEditor.ready(function (K) {
					window.editor = K.create('#editor_id', {
						width: '100%'}
						});
			-uploadJson:'/upload_img/',
				-formdata
			-添加一些额外的参数
                extraFileUploadParams:{
                    'csrfmiddlewaretoken':'{{ csrf_token }}'
                },
			-filePostName:'myfile'  --修改上传图片名字
			
			
			-上传完图片,返回的格式
				  //成功时
					{
							"error" : 0,
							"url" : "http://www.example.com/path/to/file.ext"
					}
					//失败时
					{
							"error" : 1,
							"message" : "错误信息"
					}
				
				
			-xss攻击(跨站脚本攻击)
			-bs4
				-soup=BeautifulSoup(content,'html.parser')
				-soup对象,有好多方法,有好多属性
				-删除指定的标签
				-tag.decompose()
				-soup.text拿到html所有文本的内容
				
				
				
			-问?发布文章的时候,上传的图片,没用到,如何清理?
				创建一个表:
					id    path        article_id
					1      aa/1.jpg      
				创建文章:
					-把文章id关联进去
				如果最终article_id为空,说明没关联文章,需要定期清理
			
要点:
	-django发送邮件
		-基础包下,smtp模块
		-在smtp基础上封装了一下
		
		
	-头像修改
	
	-文章编辑
posted @ 2018-12-10 13:53  不沉之月  阅读(87)  评论(0编辑  收藏  举报