评论管理功能

后端

@bp.get("/comment/list")
def comment_list():comments = CommentModel.query.order_by(CommentModel.create_time.desc()).all()comment_list = []for comment in comments:comment_dict = comment.to_dict()comment_list.append(comment_dict)return restful.ok(data=comment_list)@bp.post("/comment/delete")
def delete_comment():comment_id = request.form.get("id")CommentModel.query.filter_by(id=comment_id).delete()return restful.ok()
class CommentModel(db.Model, SerializerMixin):__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("user.id"), nullable=False)post = db.relationship("PostModel", backref=db.backref('comments', order_by="CommentModel.create_time.desc()", cascade="delete, delete-orphan"))author = db.relationship("UserModel", backref='comments')
serialize_only = ("id", "title", "content", "create_time", "board", "author")

在这里插入图片描述

class PostModel(db.Model, SerializerMixin):serialize_only = ("id", "title", "content", "create_time", "board", "author")__tablename__ = "post"id = db.Column(db.Integer, primary_key=True, autoincrement=True)title = db.Column(db.String(200), nullable=False)content = db.Column(db.Text, nullable=False)create_time = db.Column(db.DateTime, default=datetime.now)board_id = db.Column(db.Integer, db.ForeignKey("board.id"))author_id = db.Column(db.String(100), db.ForeignKey("user.id"))# 这里关联了BoardModel 也会将其序列化   所以 BoardModel也需要继承SerializerMixin# 另外 序列化的时候会给BoardModel添加一个属性postsboard = db.relationship("BoardModel", backref=db.backref("posts"))author = db.relationship("UserModel", backref=db.backref("posts"))

前端

getCommentList(){const url = "/comment/list"return this.http.get(url)}deleteComment(comment_id){const url = "/comment/delete"return this._post(url, {"id": comment_id})
<template><div><el-space direction="vertical" :size="20"><h1>评论管理</h1><el-table :data="comments" style="width: 100%"><el-table-column prop="content" label="内容" /><el-table-column prop="author.username" label="作者" /><el-table-column label="帖子"><template #default="scope"><a :href="$http.server_host + '/post/detail/' + scope.row.post.id" target="_blank">{{ scope.row.post.title }}</a></template></el-table-column><el-table-column prop="create_time" label="发布时间" width="180" /><el-table-column label="操作"><template #default="scope"><el-buttontype="danger"circlesize="mini"@click="onDeleteCommentClick(scope.$index)"><el-icon><delete /></el-icon></el-button></template></el-table-column></el-table></el-space><!-- 删除轮播图确认对话框 --><el-dialog v-model="confirmDialogVisible" title="提示" width="30%"><span>您确定要删除这个评论吗?</span><template #footer><span class="dialog-footer"><el-button @click="confirmDialogVisible = false">取消</el-button><el-button type="primary" @click="onConfirmDeleteCommentClick">确定</el-button></span></template></el-dialog></div>
</template><script>
import { ElMessage } from 'element-plus';
import {Delete} from "@element-plus/icons";
export default {name: "Comment",data() {return {deletingIndex: 0,confirmDialogVisible: false,comments: [],};},mounted(){this.$http.getCommentList().then(res => {this.comments = res['data'];})},methods: {onDeleteCommentClick(index) {this.deletingIndex = index;this.confirmDialogVisible = true;},onConfirmDeleteCommentClick(){let comment = this.comments[this.deletingIndex];this.$http.deleteComment(comment.id).then(res => {if(res && res['code'] == 200){ElMessage.success("评论删除成功!");this.confirmDialogVisible = false;this.comments.splice(this.deletingIndex, 1);}else{ElMessage.info(res['message']);}});}},components: {Delete}
};
</script><style scoped>
.el-space {display: block;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/8006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络超时导致namenode被kill的定位

交换机升级导致部分网络通信超时, 集群的namenode主从切换后,主namenode进程被杀死。 网络问题导致namenode与zk间的连接超时触发了hadoop集群的防脑裂机制而主动kill掉了超时的namenode进程。 日志分析发现zk和namenode之间的网络连接超时: 超时触发了namenode切换,并将超时…

linux 无桌面运行 GUI 程序(electron、arm)

操作 开发板事先连接好屏幕&#xff0c;并用串口连接开发板 apt install xorg dpkg-reconfigure x11-common # 允许任何用户连接到X11服务器 startx # 会在屏幕启动一个命令行终端将键盘连接到开发板&#xff0c;并在开发板上执行命令运行 GUI 应用即可 ./your_program如果是…

ES6基础知识七:你是怎么理解ES6中 Generator的?使用场景?

一、介绍 Generator 函数是 ES6 提供的一种异步编程解决方案&#xff0c;语法行为与传统函数完全不同 回顾下上文提到的解决异步的手段&#xff1a; 回调函数promise 那么&#xff0c;上文我们提到promsie已经是一种比较流行的解决异步方案&#xff0c;那么为什么还出现Gen…

Flutter中如何取消任务

前言 在开发过程中&#xff0c;取消需求是很常见的&#xff0c;但很容易被忽略。然而&#xff0c;取消需求的好处也很大。例如&#xff0c;在页面中会发送很多请求。如果页面被切走并处于不可见状态&#xff0c;就需要取消未完成的请求任务。如果未及时取消&#xff0c;则可能…

linux系统more基本命令python源码分享

此贴python源码是linux系统more基本命令的实现。 实现linux中more的基本功能&#xff0c;当more后加一个文件名参数时候&#xff0c;分屏显示按空格换页&#xff0c;按回车换行,在左下角显示百分比&#xff1b; 以处理管道参数的输入&#xff0c;处理选项num:从指定行开始显示&…

crawlab爬虫python篇(保姆级图文教程)

文章目录 前言一、创建项目二、创建爬虫1.新建项目2.新建爬虫3. 上传文件总结资料解决方案记录前言 一个python刚到门槛水平的程序员是如何使用crawlab爬取网站,在这里做个图文教程记录下。 提示:这里做一个简单的网站爬取完整示例图文教程 一、创建项目 首先,我们将创建一…

Android平台GB28181设备接入模块之按需编码和双码流编码

技术背景 我们在做执法记录仪或指挥系统的时候&#xff0c;会遇到这样的情况&#xff0c;大多场景下&#xff0c;我们是不需要把设备端的数据&#xff0c;实时传给国标平台端的&#xff0c;默认只需要本地录像留底&#xff0c;如果指挥中心需要查看前端设备实时数据的时候&…

Python实现九宫格数独小游戏

1 问题 有1-9个数字&#xff0c;将他们填入一个3*3的九宫格中&#xff0c;使得他们的每行&#xff0c;每列&#xff0c;以及对角线上的和相等&#xff0c;且要求每个格子的数字不可以重复。使用python列出所有可能的组合。示例如下: 2 方法 每行&#xff0c;列&#xff0c;对角…

临时文档4

Redis有哪些数据类型 Redis主要有5种数据类型&#xff0c;包括String&#xff0c;List&#xff0c;Set&#xff0c;Zset&#xff0c;Hash&#xff0c;满足大部分的使用要求 Redis的应用场景 总结一 计数器 可以对 String 进行自增自减运算&#xff0c;从而实现计数器功能。…

uni-app优雅的实现时间戳转换日期格式

现在显示的格式如下图&#xff1a; 我期望统一格式&#xff0c;所以不妨前端处理一下&#xff0c;核心代码如下 filters: {// 时间戳处理formatDate: function(value, spe /) {value value * 1000let data new Date(value);let year data.getFullYear();let month data.…

API简意

API&#xff08;Application Programming Interface&#xff09;即应用程序接口&#xff0c;是一组定义的规则和协议&#xff0c;用于不同软件之间的交互和通信。它定义了软件组件之间如何相互访问和使用&#xff0c;简化了开发者的工作&#xff0c;提高了系统的可扩展性和灵活…

ubuntu上安装firefox geckodriver 实现爬虫

缘由&#xff1a;当时在windows 上运行chrom 的时候 发现要找到 浏览器和 webdirver 相匹配的 版本比较麻烦&#xff0c;当时搞了大半天才找到并安装好。 这次在ubuntu上尝试用firefox 实现爬虫 文章分为三个部分&#xff1a; 环境搭建浏览器弹窗输入用户名&#xff0c;密码的…

微信认证申请流程(个体工商户)

登录微信公众平台->设置->微信认证->开通 第一步&#xff1a;同意协议&#xff1a;签署《微信公众平台认证服务协议》 第二步&#xff1a;选择认证类型及填写认证资料 选择认证类型及上传申请公函 个体户资质信息 认证联系人信息&#xff1a;个体工商户联系人必须为法…

Python单例模式介绍、使用

一、单例模式介绍 概念&#xff1a;单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供访问该实例的全局访问点。 功能&#xff1a;单例模式的主要功能是确保在应用程序中只有一个实例存在。 优势&#xff1a; 节省系统资源&#xff1a;由…

【如何训练一个中译英翻译器】LSTM机器翻译模型部署之ncnn(python)(五)

系列文章 【如何训练一个中译英翻译器】LSTM机器翻译seq2seq字符编码&#xff08;一&#xff09; 【如何训练一个中译英翻译器】LSTM机器翻译模型训练与保存&#xff08;二&#xff09; 【如何训练一个中译英翻译器】LSTM机器翻译模型部署&#xff08;三&#xff09; 【如何训练…

【优选算法题练习】day8

文章目录 一、974. 和可被 K 整除的子数组1.题目简介2.解题思路3.代码4.运行结果 二、525. 连续数组1.题目简介2.解题思路3.代码4.运行结果 三、560. 和为 K 的子数组1.题目简介2.解题思路3.代码4.运行结果 总结 一、974. 和可被 K 整除的子数组 1.题目简介 974. 和可被 K 整…

React之组件的分类、使用,事件对象,this指向问题,修改状态以及受控组件与非受控组件

React之组件的介绍、创建与使用,事件对象,this指向问题,修改状态以及受控组件与非受控组件 一、组件基本介绍二、组件创建2.1 函数组件2.2 类组件 三、将组件提取到单独的js文件中四、有状态组件和无状态组件五、类组件的状态六、事件处理6.1 注册事件6.2 事件对象6.3 this指向…

【设计模式】单例设计模式详解(包含并发、JVM)

文章目录 1、背景2、单例模式3、代码实现1、第一种实现&#xff08;饿汉式&#xff09;为什么属性都是static的&#xff1f;2、第二种实现&#xff08;懒汉式&#xff0c;线程不安全&#xff09;3、第三种实现&#xff08;懒汉式&#xff0c;线程安全&#xff09;4、第四种实现…

day38-Mobile Tab Navigation(手机tab栏导航切换)

50 天学习 50 个项目 - HTMLCSS and JavaScript day38-Mobile Tab Navigation&#xff08;手机tab栏导航切换&#xff09; 效果 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"…

3ds MAX 洗菜池

在家居中我们显然离不开这个对吧 首先绘制一个长方体作为基础 注意设置长宽高的网格大小&#xff0c;方便后续调整 俯视图网格线如下&#xff1a; 长方形变换为可编辑网络&#xff0c;并在【多边形】界面选择底面的所有多边形&#xff0c;按delete删除&#xff0c;形成一个壳体…