评论管理功能

news2025/1/11 23:44:57

后端

@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添加一个属性posts
    board = 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-button
              type="danger"
              circle
              size="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.coloradmin.cn/o/781173.html

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

相关文章

Python模块requests基本用法

简介 Python 的 requests 模块是一个流行的第三方库&#xff0c;用于发送HTTP请求。它提供了一组简洁且易于使用的API&#xff0c;使得在Python中进行网络通信变得更加简单和灵活。 目录 1. 基本概念 1.1. HTTP 协议 1.2. GET 请求 1.3. POST 请求 1.4. get 和 post 的区别…

uniapp 小程序 评分组件

效果图&#xff1a; 1、组件&#xff1a;starsRating.vue <template><view class"stars"><image click"btnStars1" class"starsicon" :src"starsObject[0]" mode"widthFix"></image><image c…

Stream API将对象中的某一字段取出转换为list或数组

List<DevicePartMaintain> devicePartMaintainList devicePartMaintainMapper.selectDevicePartMaintainByMitId(mitId);所有id转换为List 要使用Stream流获取devicePartMaintainList中所有的id&#xff0c;您可以使用stream()方法将列表转换为流&#xff0c;然后使用…

从C语言到C++_28(红黑树RedBlackTree)概念+插入接口实现

目录 1. 红黑树的引入和简介 2. 红黑树的性质和定义 3. 红黑树的插入 3.1 调整情况一 3.2 调整情况二 3.2.1 调整情况二中的单旋变色 3.2.2 调整情况二中的双旋变色 3.3 调整情况三 3.4 红黑树插入完整代码 4. 红黑树的验证和完整代码 4.1 验证是不是搜索树&#xf…

Pytorch个人学习记录总结 07

目录 神经网络-非线性激活 神经网络-线形层及其他层介绍 神经网络-非线性激活 官方文档地址&#xff1a;torch.nn — PyTorch 2.0 documentation 常用的&#xff1a;Sigmoid、ReLU、LeakyReLU等。 作用&#xff1a;为模型引入非线性特征&#xff0c;这样才能在训练过程中…

【0基础学习python】顺序结构+条件语句+循环结构(文章后面有人生重开模拟器的相关逻辑和简单实现)

1.顺序语句 默认情况下&#xff0c;python的代码执行顺序是按照从上到下的顺序&#xff0c;依次执行的。 print(1) print(2) print(3)执行的结果一定为 1 2 3 &#xff0c;而不会出现 3 2 1 或者 1 3 2等&#xff0c;这种按照顺序执行的代码&#xff0c;我们称为顺序语句。 …

C++第六讲

思维导图 顺序栈定义成模板类 /* ---------------------------------author&#xff1a;YoungZorncreated on 2023/7/22 16:23.--------------------------------- */ #include<iostream>using namespace std;template<typename T> class my_stack { private:T *p…

Unity进阶--声音管理器学习笔记

文章目录 声音管理器 using System.Collections; using System.Collections.Generic; using UnityEngine;public class AudioManager : MyrSingletonBase<AudioManager> {//环境音private AudioSource enPlayer;//音效private AudioSource sePlayer;//音乐private Audio…

IDEA使用AWS CodeWhisperer

IDEA使用AWS CodeWhisperer 首先在IDEA的插件市场中下载AWS Toolkit&#xff1a; 这里我使用的IDEA是2023.1&#xff0c;就是在ToolWindows里把AWS Toolkit面板调出来&#xff1a; 连接&#xff1a; 打开的网页中粘贴上面提过的代码。进入注册流程。 注册完成后返回IDEA&am…

自动驾驶感知系统-毫米波雷达

毫米波雷达就是电磁波&#xff0c;雷达通过发射无线电信号并接收反射信号来测定车辆与物体间的距离&#xff0c;其频率通常介于10~300GHz之间。与厘米波导引头相比&#xff0c;毫米波导引头体积小&#xff0c;质量轻&#xff0c;空间分辨率高&#xff1b;与红外、激光、电视等光…

Vue--插槽

一、插槽-默认插槽 1.作用 让组件内部的一些 结构 支持 自定义 2.需求 将需要多次显示的对话框,封装成一个组件 3.问题 组件的内容部分&#xff0c;不希望写死&#xff0c;希望能使用的时候自定义。怎么办 4.插槽的基本语法 组件内需要定制的结构部分&#xff0c;改用**…

STM32 HAL库定时器输入捕获+更新中断

STM32 HAL库定时器输入捕获更新中断 &#x1f4cd;相关参考&#xff1a;https://www.cnblogs.com/kevin-nancy/p/12569377.html#4621839&#x1f4cc;相关篇《STM32 HAL库定时器输入捕获SlaveMode脉宽测量》 ✨高级定时器的输入捕获功能在脉宽信号测量方面是非常方便的。尤其时…

代码随想录算法训练营第二十一天 | 读PDF复习环节1

读PDF复习环节1 本博客的内容只是做一个大概的记录&#xff0c;整个PDF看下来&#xff0c;内容上是不如代码随想录网站上的文章全面的&#xff0c;并且PDF中有些地方的描述&#xff0c;是很让我疑惑的&#xff0c;在困扰我很久后&#xff0c;无意间发现&#xff0c;其网站上的讲…

JavaEE——Spring中存取Bean的注解

目录 一、存储Bean对象 1、定义 2、存储方式 &#xff08;1&#xff09;、类注解 【1】、Controller&#xff08;控制器存储&#xff09; 【2】、Service&#xff08;服务存储&#xff09; 【3】、Repository&#xff08;仓库存储&#xff09; 【4】、Component&#xf…

创造型模式-原型模式(场景体验-》方案解决===代码图解)

创造型模式-原型模式 创建重复对象-场景体验解决方案&#xff08;原型模式&#xff09;原型模式定义 创建重复对象-场景体验 今天来一个大客户&#xff0c;他要求帮他下100个订单。每个订单除了用户ID&#xff0c;和用户名不同之外&#xff0c;其他个人信息完全相同。 订单类 …

DASCTF 2023 0X401七月暑期挑战赛RE题解

比赛期间没有什么时间&#xff0c;赛后做的题。 TCP 这题最难&#xff0c;耗时最久&#xff0c;好像做出来的人不多。 程序开始有个初始化随机数的过程&#xff0c;数据写入qword_5060开始的48个字节。 这里是主函数&#xff0c;连接到服务器以后&#xff0c;先接收32个字节…

c函数学习

函数的概念 函数是c语言的功能单位&#xff0c;实现一个功能可以封装一个函数来实现。定义函数的时候一切以功能为目的&#xff0c;根据功能去定义函数的参数和返回值 函数的分类 从定义角度分类&#xff1a;库函数&#xff08;c库实现的&#xff09;&#xff0c;自定义函数&…

springboot集成

maven配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>org.apache.commons</groupId><artifactId>…

小程序中vant-weapp时间选择使用方法

一、选择单个时间点&#xff1a; wxml&#xff1a; <van-celltitle"选择预约时间"value"{{ time }}"bind:click"onDisplay"/><van-calendarshow"{{ show }}"bind:close"onClose"bind:confirm"onConfirm"…

数学建模学习(3):综合评价类问题整体解析及分析步骤

一、评价类算法的简介 对物体进行评价&#xff0c;用具体的分值评价它们的优劣 选这两人其中之一当男朋友&#xff0c;你会选谁&#xff1f; 不同维度的权重会产生不同的结果 所以找到每个维度的权重是最核心的问题 0.25 二、评价前的数据处理 供应商ID 可靠性 指标2 指…