评论后端逻辑实现

设计评论模型表, 编辑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. [洛谷P3460] [POI2007]TET-Tetris Attack

    洛谷题目链接:[POI2007]TET-Tetris Attack 题目描述 A puzzle called "Tetris Attack" has lately become a ...

  2. 「模板」 树链剖分 HLD

    「模板」 树链剖分 HLD 不懂OOP的OIer乱用OOP出人命了. 谨此纪念人生第一次类套类. 以及第一次OI相关代码打过200行. #include <algorithm> #incl ...

  3. Data Mining的十种分析方法——摘自《市场研究网络版》谢邦昌教授

    Data Mining的十种分析方法: 记忆基础推理法(Memory-Based Reasoning:MBR)        记忆基础推理法最主要的概念是用已知的案例(case)来预测未来案例的一些属 ...

  4. bzoj 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列——map+hash+转换

    Description N(1<=N<=100000)头牛,一共K(1<=K<=30)种特色, 每头牛有多种特色,用二进制01表示它的特色ID.比如特色ID为13(1101), ...

  5. 【bzoj】1927 [Sdoi2010]星际竞速

    [算法]最小费用最大流 [题解]跟滑雪略有类似,同样因为可以重复所以不是最小路径覆盖. 连向汇的边容量为1足矣,因为一个点只会出去一次(路径结束). bzoj 1927 [Sdoi2010]星际竞速 ...

  6. 如何设计一个优雅健壮的Android WebView?(下)

    转:如何设计一个优雅健壮的Android WebView?(下) 前言 在上文<如何设计一个优雅健壮的Android WebView?(上)>中,笔者分析了国内WebView的现状,以及在 ...

  7. 【CSS】凹槽的写法

    效果图: 实例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  8. hdu 1070 Milk(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1070 Milk Time Limit: 2000/1000 MS (Java/Others)    M ...

  9. Spring Boot提供的特性

    一.导览 本文主要按以下模块介绍spring Boot(1.3.6.RELEASE)提供的特性. SpringApplication类 外部化配置 Profiles 日志 开发WEB应用 Securi ...

  10. Linux 入门记录:二十、Linux 包管理工具 YUM

    一.YUM(Yellowdog Updater, Modified) 1. YUM 简介 RPM 软件包形式管理软件虽然方便,但是需要手动解决软件包的依赖问题.很多时候安装一个软件首先需要安装 1 个 ...