评论后端逻辑实现

设计评论模型表, 编辑apps.models.py

class CommentModel(db.Model):
__tablename__ = 'comment'
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
content = db.Column(db.Text,nullable=False)
create_time = db.Column(db.DateTime,default=datetime.now)
post_id = db.Column(db.Integer,db.ForeignKey("post.id"))
author_id = db.Column(db.String(100), db.ForeignKey("front_user.id"), nullable=False) post = db.relationship("PostModel",backref='comments')
author = db.relationship("FrontUser",backref='comments')

同步表到数据库

python manage.py db migrate
python manage.py db upgrade

后端需要对评论进行表单验证,编辑front.forms.py

class AddCommentForm(BaseForm):
content = StringField(validators=[InputRequired(message='请输入评论内容!')])
post_id = IntegerField(validators=[InputRequired(message='请输入帖子id!')])

写视图函数,编辑front.views.py

from .forms import AddCommentForm
from apps.models import CommentModel
... @bp.route('/acomment/',methods=['POST'])
@login_required
def add_comment():
add_comment_form = AddCommentForm(request.form)
if add_comment_form.validate():
content = add_comment_form.content.data
post_id = add_comment_form.post_id.data
post = PostModel.query.get(post_id)
if post:
comment = CommentModel(content=content)
comment.post = post
comment.author = g.front_user
db.session.add(comment)
db.session.commit()
return xjson.json_success()
else:
return xjson.json_param_error('没有这篇帖子!')
else:
return xjson.json_param_error(add_comment_form.get_error())

评论前端布局

<div class="lg-container">
...
<div class="comment-group">
<h3>评论列表</h3>
<ul class="comment-list-group">
{% for comment in post.comments %}
<li>
<div class="avatar-group">
<img src="{{ comment.author.avatar or url_for('static', filename='common/images/logo.png') }}" alt="">
</div>
<div class="comment-content">
<p class="author-info">
<span>{{ comment.author.username }}</span>
<span>{{ comment.create_time }}</span>
</p>
<p class="comment-txt">
{{ comment.content|safe }}
</p>
</div>
</li>
{% endfor %}
</ul>
</div>
<div class="add-comment-group">
<h3>发表评论</h3>
<script id="editor" type="text/plain" style="height:100px;"></script>
<div class="comment-btn-group">
<button class="btn btn-primary" id="comment-btn">发表评论</button>
</div>
</div>
</div>

front_pdetail.html

在贴子详情那里绑定帖子id

评论需要用到ueditor编辑器,因此也要引入以下js

{% block head %}
<script src="{{ url_for('static',filename='ueditor/ueditor.config.js') }}"></script>
<script src="{{ url_for('static',filename='ueditor/ueditor.all.min.js') }}"></script>
...
{% endblock %}

编辑front_pdetail.css,设置样式

...
.comment-group{
margin-top: 20px;
border: 1px solid #e8e8e8;
padding: 10px;
} .add-comment-group{
margin-top: 20px;
padding: 10px;
border: 1px solid #e8e8e8;
} .add-comment-group h3{
margin-bottom: 10px;
} .comment-btn-group{
margin-top: 10px;
text-align:right;
} .comment-list-group li{
overflow: hidden;
padding: 10px 0;
border-bottom: 1px solid #e8e8e8;
} .avatar-group{
float: left;
} .avatar-group img{
width: 50px;
height: 50px;
border-radius: 50%;
} .comment-content{
float: left;
margin-left:10px;
} .comment-content .author-info{
font-size: 12px;
color: #8c8c8c;
} .author-info span{
margin-right: 10px;
} .comment-content .comment-txt{
margin-top: 10px;
}

front_pdetail.css

发表帖子必须要登录才行,为了判断是否登录,我们在front_base.html,设置个登录标签

最后,创建front_pdetail.js并引入

$(function () {
var ue = UE.getEditor("editor",{
'serverUrl': '/ueditor/upload/',
//因为是评论,富文本比编辑器不需要那么多功能,所以这里只列出要用的
//一个列表代表一行
"toolbars": [
[
'undo', //撤销
'redo', //重做
'bold', //加粗
'italic', //斜体
'source', //源代码
'blockquote', //引用
'selectall', //全选
'insertcode', //代码语言
'fontfamily', //字体
'fontsize', //字号
'simpleupload', //单图上传
'emotion' //表情
]
]
});
//把ue设置为全局
window.ue = ue;
}); $(function () {
$("#comment-btn").click(function (event) {
event.preventDefault();
var loginTag = $("#login-tag").attr("data-is-login");
if(!loginTag){
window.location = '/signin/';
}else{
var content = window.ue.getContent();
var post_id = $("#post-content").attr("data-id");
bbsajax.post({
'url': '/acomment/',
'data':{
'content': content,
'post_id': post_id
},
'success': function (data) {
if(data['code'] == 200){
window.location.reload();
}else{
xtalert.alertInfo(data['message']);
}
}
});
}
});
});

front_pdetail.js

Flask实战第63天:评论布局和功能实现的更多相关文章

  1. Flask实战第58天:发布帖子功能完成

    发布帖子后台逻辑完成 首先给帖子设计个模型,编辑apps.models.py class PostModel(db.Model): __tablename__ = 'post' id = db.Col ...

  2. 一百四十四:CMS系统之评论布局和功能二

    在base页加一个登录标识符 给加页面两个id,方便取值 js $(function () { //初始化ueditor var ue = UE.getEditor('editor', { 'serv ...

  3. 一百四十三:CMS系统之评论布局和功能一

    模型 class CommentModel(db.Model): """ 评论 """ __tablename__ = 'comment' ...

  4. Flask实战-留言板-安装虚拟环境、使用包组织代码

    Flask实战 留言板 创建项目目录messageboard,从GreyLi的代码中把Pipfile和Pipfile.lock文件拷贝过来,这两个文件中定义了虚拟环境中需要安装的包的信息和位置,进入m ...

  5. Asp.Net Core 项目实战之权限管理系统(6) 功能管理

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  6. Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  7. Unity3D项目实战笔记(5):延时功能的几种实现

    我所做过的系统,分单机版系统(2005年).CS系统(2010年).实时系统(2015年),各个系统均有“延时”功能:定时调度的: 本博客说的是实时系统中的延时功能(基于Unity3D游戏引擎). 在 ...

  8. h5、jq 移动端评论点攒功能

    h5.jq 移动端评论点攒功能 平时做的项目中大部分都会涉及到评论的功能,之前用angular写的项目,功能写起来很方便,但是对于一个单页来说,angular有点大材小用了,所有今天分享一个关于jq制 ...

  9. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

随机推荐

  1. 长ping域名带时间戳

    ping www.baidu.com |awk '{print $0 "\t" strftime("%Y:%m:%d-%H:%M:%S",systime())} ...

  2. html 制作静态页面新知识

    1.在区块线边框添加一条水平线 例如:<div  style:"height :300px;width:800px;border-bottom: solid 1px orange ;& ...

  3. 天气预报service

    https://weather.com/ https://api.weather.com/v2/turbo/vt1dailyForecast?apiKey=c1ea9f47f6a88b9acb43ab ...

  4. ASP.NET 设置DropDownList的当前选项

    1.通过显示字符Text DropDownList.Items.FindByText("你的值").Selected=true; 如果在设置之前,进行过设置,应用如下格式: Dro ...

  5. Perl6 Bailador框架(7):模版编写

    先看一个例子: use v6; use Bailador; my $data = ' <form action="", method="get"> ...

  6. Opencv模块功能介绍

    本文为原创作品,转载请注明出处 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和http://www.cnblogs.com/xujianqing/   站在巨 ...

  7. linux中的tasklet机制【转】

    转自:http://blog.csdn.net/yasin_lee/article/details/12999099 转自: http://www.kerneltravel.net/?p=143 中断 ...

  8. php快速入门总结

    因为本人已经接触了C和C++两年多了,虽然真正用它们的机会很少,但是基本的语法还是相对熟悉的.半年前的课程设计用了PHP,所以当初我也只是现学先用, 学得很粗糙,现在,跟一个同学合作搞一个比赛的项目, ...

  9. git - 使用原理

    对git操作最大的功臣就是.git目录下的HEAD HEAD是什么 HEAD其实是一个类似于指针的东西,只不过这个指针的含义是指向当前的分支,当你再[ git checkout 分支 ] 的时候这个分 ...

  10. div左右自适应高度一致

    <div style="width:300px;"> <div id="Left" style="float:left;" ...