【在线OJ】发帖功能前后段代码实现

news2025/7/8 2:20:06

一、页面布局

 二、前端代码

<template>
  <div id="app">
    <div style="height: 100vh">
       <div style="display: flex" >
         <el-input style="width: 95%" v-model="title" placeholder="输入标题"></el-input>
          <el-button style="width: 5%; margin-left: 2px" type="primary" size="small" @click="submit">发布</el-button>
       </div>
      <quill-editor style="height: 100vh" v-model="content"></quill-editor>

      <el-drawer
          title="请选择类型"
          :before-close="handleClose"
          :visible.sync="dialog"
          direction="rtl"
          custom-class="demo-drawer"
          ref="drawer"
      >
        <div class="demo-drawer__content">
          <el-form :model="form">
            <el-form-item label="类型" :label-width="formLabelWidth">
              <el-select v-model="type" placeholder="请选择文章类型">
                <el-option v-for="item in types" :key="item.id" :label="item.type" :value="item.id" @click="onchange(item.id)"></el-option>
              </el-select>
            </el-form-item>

            <el-upload
                class="avatar-uploader"
                action="http://127.0.0.1:8388/forum/article/public/postPhoto"
                list-type="picture-card"
                :show-file-list="false"
                :on-success="success"
                :headers="headers"
                :before-upload="beforeAvatarUpload">
              <img v-if="imageUrl" :src="imageUrl" class="avatar">
              <i v-else class="el-icon-plus avatar-uploader-icon"></i>
            </el-upload>
          </el-form>
          <div class="demo-drawer__footer">
            <el-button @click="cancelForm">{{'取 消'}}</el-button>
            <el-button type="primary" @click="cancelForm">{{ '确 定' }}</el-button>
          </div>
        </div>
      </el-drawer>
    </div>
  </div>
</template>

<script>

import axios from "axios";

const options = {
  data: function () {
    return {
      imageUrl: '',
      headers: {
        "token": localStorage.getItem("token")
      },
      types: [],
      form: {
        name: '',
        region: '',
        date1: '',
        date2: '',
        delivery: false,
        type: [],
        resource: '',
        desc: ''
      },
      formLabelWidth: '80px',
      timer: null,
      dialog: false,
      title: "",
      content: "",
      type: "",
      photo: "",
      loading: false,
    };
  },

  async mounted() {
    await this.getTypes()
    // 获取查询字符串
    let id = this.$route.query.id
    if (id === '' || id === undefined) {
       console.log(id)
    } else {
      this.$message({
        message: '查询数据',
        type: 'success'
      });
      this.title = '这是一篇关于……的帖子'
      this.content= '需要查询数据库进行编写'
      const resp = await axios.get("http://localhost:8388/forum/article/public/queryById", {
        params: {
          "id": id,
        }
      })
      if (resp.data.code === 200) {
        this.title = resp.data.data.title
        this.content = resp.data.data.content
      }
    }
  },

  methods: {
    onchange(id) {
      this.type = id
    },
    success: function(response, file, fileList) {
      console.log(file)
      console.log(fileList)
      const data = response; // 从服务器返回的数据中获取上传成功后的头像地址
      console.log(data)
      if (data.code === 200) {
        console.log(data)
        this.photo = data.data
      }
      console.log(response)
    },

    beforeAvatarUpload(file) {

      const isJPG = file.type === 'image/jpeg';
      const isLt2M = file.size / 1024 / 1024 < 2;

      if (!isJPG) {
        this.$message.error('上传头像图片只能是 JPG 格式!');
        return false

      }
      if (!isLt2M) {
        this.$message.error('上传头像图片大小不能超过 2MB!');
        return false
      }
      return true
    },
    cancelForm() {
      this.dialog = false;
      this.loading = false;
    },
    async getTypes() {
      this.currentType = 0
      const resp = await axios.get("http://localhost:8388/forum/article/public/showTypes");
      if (resp.data.code === 200) {
        this.types = resp.data.data
      }
      // this.types.unshift({id : 0, type: "全部"})
    },
    handleClose() {
      this.dialog = false
    },
    async submit() {
      console.log(this.type)
      console.log(this.photo)
      if (!this.type || !this.photo) {
        this.dialog = true;
        return;
      }

      if (this.$route.query.id === undefined) {
        console.log('提交的内容:', this.content)
        const resp = await axios.post("http://localhost:8388/forum/article/public/PostArticle", {

            title: this.title,
            content: this.content,
            type: this.type,
            photo: this.photo

        }, {
          headers: {
            token: localStorage.getItem("token")
          }
        })
        if (resp.data.code === 200) {
          this.$message({
            message: '发布成功',
            type: 'success'
          });
          await this.$router.push({
            path: '/forum',
          })
        }
      } else {
        console.log('提交的内容:', this.content)

        const resp = await axios.post("http://localhost:8388/forum/article/public/updateArticle", {

            title: this.title,
            content: this.content,
            type: this.type,
            id: this.$route.query.id

        }, {
          headers: {
            token: localStorage.getItem("token")
          }
        })
        if (resp.data.code === 200) {
          this.$message({
            message: '修改成功',
            type: 'success'
          });
          await this.$router.push({
            path: '/article',
            query: {
              id: this.$route.query.id
            }
          })
        }
      }
    }
  },

  computed: {

  }
};
export default options;
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}

nav {
  padding: 30px;
}

nav a {
  font-weight: bold;
  color: #2c3e50;
}

nav a.router-link-exact-active {
  color: #42b983;
}
</style>

三、后端代码

 

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

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

相关文章

光储充一体化,开启绿色出行新篇章

一、追光逐梦&#xff0c;绿色能源点亮未来 在蔚蓝的天空下&#xff0c;光伏发电板如同一片片金色的叶子&#xff0c;静静地捕捉着太阳的光芒。它们不仅为大地带来光明&#xff0c;更是绿色出行的强大后盾。光储充一体化充电站&#xff0c;以光伏为源&#xff0c;储能为桥&…

蓝牙模块的不同版本迭代发展与技术趋势

蓝牙技术自1999年首次亮相以来&#xff0c;已经历了从1.0到5.0的多个版本迭代&#xff0c;每一次的更新都带来了显著的性能提升和广泛的应用前景。本文将综述蓝牙模块的版本迭代&#xff0c;分析其主要改进点&#xff0c;并探讨蓝牙模块在物联网、医疗、穿戴式设备等领域的应用…

Luma AI 推出梦幻机:据说吊打Sora和快手可灵(KLING)|TodayAI

近日&#xff0c;美国初创公司 Luma AI 宣布推出其最新的文本生成视频工具——梦幻机&#xff08;Dream Machine&#xff09;。这一消息发布的时间正好在中国科技公司快手推出其文本生成视频模型可灵&#xff08;KLING&#xff09;几天之后&#xff0c;标志着视频生成领域的又一…

560亿美元薪酬获批!马斯克:特斯拉未来市值将不止5万亿美元

KlipC报道&#xff1a;6月13日&#xff0c;美国电动汽车制造商特斯拉公司举办年度股东大会&#xff0c;其CEO马斯克对特斯拉生产销售、未来车型计划和在无人驾驶能等领域的发展进行了报告。此外&#xff0c;特斯拉股东批准了马斯克的560亿美元薪酬方案以及特斯拉总部迁至得克萨…

qt如何在linux平台上设置编译生成windows程序文件,跨平台?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「qt的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;QT本来目标就是跨平台&#xf…

【PL理论】(23) 函数式语言:let-in 示例的分解 | 谁在使用动态作用域?

&#x1f4ad; 写在前面&#xff1a;本章我们将对函数式语言的讲解进行收尾&#xff0c;分解一下之前讲的 let-in 示例。然后讨论一下谁在使用动态作用域。 目录 0x00 let-in 示例的分解 0x01 谁使用动态作用域&#xff1f; 0x00 let-in 示例的分解 让我们详细检查这个示例…

Kafka流计算培训:打造Kafka技术专家,引领大数据未来

Kafka流计算培训课程是一门旨在帮助大数据从业人员和欲从事Kafka技术的人员快速掌握Kafka核心技术的专业培训项目。 在这个3天的课程中&#xff0c;我们将全面细致地讲解Kafka流计算软件的配置、Kafka流计算开发和流计算管道设计等内容&#xff0c;让学员能够在实际工作中灵活…

【MySQL】日志详解

本文使用的MySQL版本是8 日志概览 它们记录了数据库系统中的不同操作和事件&#xff0c;以便于故障排除、性能优化和数据恢复。本文将介绍MySQL中常见的几种日志&#xff0c;同时也会介绍一点常用的选项。 官方文档&#xff1a;MySQL :: MySQL 8.0 Reference Manual :: 7.4 M…

QT:QT中的默认代码 QT 创建控件的两种方式

目录 QT中的默认代码 新项目的结构 主函数 wiget类的声明文件.h wiget类的定义文件.cpp form file界面文件 .pro文件 QT 创建控件的两种方式 通过ui界面创建控件 通过代码方式创建控件 QT中的默认代码 新项目的结构 主函数 基本概念&#xff1a;Qt 在创建的一个 Wi…

Allegro X PCB设计小诀窍--如何在Allegro X中为PCB标注尺寸

背景介绍&#xff1a;在PCB设计时&#xff0c;标注尺寸是非常重要的一步&#xff0c;PCB上标注的板框、孔径、倒角等尺寸信息可以辅助生产、组装和维护。Allegro X PCB设计工具提供了多种PCB标注方式&#xff0c;可以满足设计人员个性化的标注需求&#xff0c;提升PCB设计效率。…

SSM小区疫情防控系统-计算机毕业设计源码03748

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 小区疫情防控系统&#xff0c;主要的模块包括查看首页、轮播图&#xff08;轮播图管理&#xff09;、社区公告管理&#xff08;社区公告&#…

制造业几大系统(MES/WMS/QMS/ERP)的集成

制造业的几大系统包括MES&#xff08;制造执行系统&#xff09;、WMS&#xff08;仓库管理系统&#xff09;、QMS&#xff08;质量管理系统&#xff09;和ERP&#xff08;企业资源计划&#xff09;系统。这些系统在制造业中扮演着不同的角色&#xff0c;可以通过集成实现更高效…

【PLG洞察】|向Figma学习如何打造标杆客户和实施分销策略

Figma是一款功能强大的在线协同设计工具&#xff0c;它主要被用于界面设计、原型设计和用户体验设计。作为国外知名的saas企业&#xff0c;对标国内的saas蓝海&#xff0c;它的增长实在惊人&#xff01;据称&#xff0c;Figma2020年的收入已达$75M, 2021年6月&#xff0c;美国的…

深入解析 Java 标准库:构建高效应用的基石

Java 标准库&#xff0c;也称为 Java API&#xff0c;是一组预先编写的类和接口&#xff0c;为 Java 应用程序提供了一系列丰富的功能。这些库被组织成包&#xff08;packages&#xff09;&#xff0c;每个包都包含了一组相关的类和接口&#xff0c;用于处理特定的任务&#xf…

红黑树【C++实现】

文章目录 红黑树的概念红黑树的性质红黑树的操作红黑树结点的定义红黑树的插入情况一&#xff1a;插入结点的叔叔存在&#xff0c;且叔叔的颜色是红色情况二: 插入结点的叔叔存在&#xff0c;且叔叔的颜色是黑色情况三: 插入结点的叔叔不存在 红黑树的验证红黑树的查找 红黑树的…

香港裸机云多IP服务器与普通独享IP服务器的区别

在当前的云计算和服务器托管领域&#xff0c;香港裸机云多IP服务器和普通独享IP服务器是两种常见的选择。它们各自具有独特的特点和优势&#xff0c;适用于不同的应用场景。以下是对这两种服务器类型的详细比较&#xff1a; 一、概念定义 香港裸机云多IP服务器&#xff1a;这是…

ChromeOS 逐渐靠近安卓

ChromeOS 逐渐 “安卓化” 谷歌在博客中透露&#xff0c;将在ChromeOS底层更广泛地使用和Android相同的技术栈。一个具体的例子是&#xff0c;ChromeOS现在已经开始使用Android的蓝牙协议栈&#xff0c;取代了之前使用的自己的协议栈。这次改变不仅提高了蓝牙配对速度&#xf…

如何扩展自己的外部竞争力

前言 程序员是一个需要不断学习的职业&#xff0c;面对层出不穷的新技术&#xff0c;假如你不能够保持一个不断学习的热情。那么&#xff0c;在未来的就业市场中&#xff0c;可能优势会不太明显。那么&#xff0c;除了提高自己内部的技术竞争力外&#xff0c;有什么渠道可以提…

字节扣子搭建大模型擂台:匿名PK效果,用户当裁判,跑分时代要结束了

字节跳动的扣子&#xff08;coze.cn&#xff09;&#xff0c;给国产大模型们组了个大局—— 在同一个“擂台”上&#xff0c;两个大模型为一组&#xff0c;直接以匿名的方式PK效果&#xff01; 例如我们对两位参赛“选手”同时提问今年高考的题目&#xff1a; 阅读下面的材料&…

OpenGL3.3_C++_Windows(7)

演示 最终演示效果 ​​​​ 冯氏光照 光照原理&#xff1a;对于向量相乘默认为点乘&#xff0c;如果*lightColor(1.0f, 1.0f, 1.0f);白光&#xff0c;值不变物体的颜色显示原理&#xff1a;不被物体吸收的光反射&#xff0c;也就是由白光分解后的一部分&#xff0c;因此&…