vue新增删除内容排序问题解决处理

2023-11-15

本次答题选项的删除添加是个人最初比较头疼的地方。比如ABCD四个选项,删除c选项后,点击【新增答题类型】选项按钮,则默认创建是E选项。再或者就是ABCD四个选项位置删除任意一个后,顺序被打乱等,最后解决了,就是多写好几行代码,有点繁琐。

1.点击【新增答题类型】,创建答题选项,此处答题选项个数做了限制,不能超过8个。
2.根据正确答案选项个数决定该道题是否为多选题,若正确答案只有一个即为单选题,否则是多选题
3.可以根据需要删除对应的答题选项,添加新答题类型
在这里插入图片描述
在这里插入图片描述

<template>
  <div class="addquestion">
    <div class="question-title">
      <span>{{title}}</span>
      <span class="back" style="font-size: 18px;" @click="back()">返回</span>
    </div>
    <div class="question_body">
      <el-form
        :model="dynamicValidateForm"
        ref="dynamicValidateForm"
        label-width="100px"
        class="demo-dynamic"
      >
        <el-form-item
          prop="content"
          label="题目内容"
          :rules="[{ required: true, message: '请输入题目内容', trigger: 'blur' }]"
        >
          <span v-if="keyword=='show'">{{dynamicValidateForm.content}}</span>
          <el-input type="textarea" v-if="keyword!='show'" v-model="dynamicValidateForm.content"></el-input>
        </el-form-item>
        <div class="domains_fileds">
          <div class="domain_title">
            <span>答题选项:</span>
            <el-button
              @click="addDomain"
              v-if="keyword!='show'"
              style="background:#409EFF;color:white"
            >新增答题类型</el-button>
          </div>
          <el-form-item
            v-for="(domain,index) in dynamicValidateForm.domains"
            :label="domain.id"
            :key="domain.id"
            :prop="'domains.' + index + '.value'"
            :rules="{required: true, message: '答题选项不能为空', trigger: 'blur'}"
          >
            <el-input v-model="domain.value" v-if="keyword!='show'"></el-input>
            <span v-if="keyword=='show'">{{domain.value}}</span>
            <span
              class="linkDel"
              v-if="keyword!='show'"
              @click.prevent="removeDomain(domain,index)"
            >删除</span>
          </el-form-item>
        </div>


        <el-form-item
          label="正确答案"
          prop="answer_right"
          :rules="{required: true, message: '正确答案不能为空', trigger: 'blur'}"
        >
          <span v-if="keyword=='show'">{{dynamicValidateForm.answer_right.toString()}}</span>
          <el-select
            v-if="keyword!='show'"
            v-model="dynamicValidateForm.answer_right"
            multiple
            placeholder="请选择正确答案"
          >
            <el-option
              v-for="item in dynamicValidateForm.domains "
              :key="item.id"
              :label="item.id"
              :value="item.id"
            ></el-option>
          </el-select>
        </el-form-item>
        <el-form-item
          prop="answer_parse"
          label="答案解析"
          :rules="[{ required: true, message: '请输入答案解析', trigger: 'blur' }]"
        >
          <span v-if="keyword=='show'">{{dynamicValidateForm.answer_parse}}</span>
          <el-input
            v-if="keyword!='show'"
            type="textarea"
            v-model="dynamicValidateForm.answer_parse"
          ></el-input>
        </el-form-item>
        <el-form-item v-if="keyword!='show'">
          <el-button type="primary" @click="submitForm('dynamicValidateForm')">提交</el-button>
          <el-button @click="resetForm('dynamicValidateForm')">重置</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>


<script>
import { Message } from "element-ui";
import {
  addQuestion,
  findByIdQuestion,
  randomQuestion,
  deleteQuestion,
  getQuestionList
} from "../../api/api";


export default {
  data() {
    return {
      alpha: [
        "A",
        "B",
        "C",
        "D",
        "E",
        "F",
        "G",
        "H",
        "I",
        "J",
        "K",
        "L",
        "M",
        "N"
      ],
      title: "添加题目",
      keyword: "add",
      domainsSum: 0,
      removeList: [],
      dynamicValidateForm: {
        type: "",
        domains: [
          {
            value: "",
            id: "A"
            // key: Date.now()
          }
        ],
        content: "",
        answer_parse: "",
        answer_right: ""
      }
    };
  },
  methods: {
    submitForm(formName) {
      if (this.dynamicValidateForm.domains.length <= 1) {
        Message.info("答题选项至少要两个才行");
        return;
      }


      this.$refs[formName].validate(valid => {
        if (valid) {
          let tempdata = [];
          this.dynamicValidateForm.domains.map(res => {
            tempdata.push(res.id + ":" + res.value);
          });
          let data = {
            type:
              this.dynamicValidateForm.answer_right.length > 1
                ? "多选题"
                : "单选题",
            content: this.dynamicValidateForm.content,
            answer_options: tempdata,
            answer_right: this.dynamicValidateForm.answer_right,
            answer_parse: this.dynamicValidateForm.answer_parse
          };
          if (this.$route.query.paramId) {
            data.question_id = this.$route.query.paramId;
          }
          addQuestion(data).then(res => {
            if (res.ret == "OK") {
              Message.info("添加成功");
            } else {
              Message.info("添加失败");
            }
            this.$router.push({ path: "answer" });
          });
        } else {
          return false;
        }
      });
    },


    resetForm(formName) {
      this.$refs[formName].resetFields();
    },
    removeDomain(item, index) {
      this.removeList.push(index);
      var index = this.dynamicValidateForm.domains.indexOf(item);
      if (index !== -1) {
        this.dynamicValidateForm.domains.splice(index, 1);
      }
      if (this.dynamicValidateForm.answer_right.length > 0) {
        this.dynamicValidateForm.answer_right.forEach((res, index) => {
          if (res == item.id) {
            this.dynamicValidateForm.answer_right.splice(index, 1);
          }
        });
      }
    },


    getArrayIndex(arr, obj) {
      var i = arr.length;
      while (i--) {
        if (arr[i] === obj) {
          return i;
        }
      }
      return -1;
    },


    /**
     * 去除数组中arr1及arr2中数组不同的数
     * let aa = ["a", "b","k", "c", "d"];
     * let bb = ["e", "f","g", "c", "d"];
     * let kk = getArrDifference(aa, bb);
     * console.log(kk)
     * console.log(aa.indexOf("k"))//2  获取数组下标
     *  打印结果kk: ["a", "b", "k", "c", "d", "e", "f", "g", "c", "d"]
     */
    getArrDifference(arr1, arr2) {
      return arr1.concat(arr2).filter(function(v, i, arr) {
        return arr.indexOf(v) === arr.lastIndexOf(v);
      });
    },
    /**
     * 获取到a,b两个数组中的交集部分
     * let aa = ["a", "b","k", "c", "d"];
     * let bb = ["e", "f","g", "c", "d"];
     * 交集cc:[ "c", "d"];
     *
     */
    array_intersection(a, b) {
      // 交集
      var result = [];
      for (var i = 0; i < b.length; i++) {
        var temp = b[i];
        for (var j = 0; j < a.length; j++) {
          if (temp === a[j]) {
            result.push(temp);
            break;
          }
        }
      }
      return result;
    },
    /**
     * 本地解题思路
     * 涉及splice,slice,filter,
     */
    addDomain() {
      let temAlpha = [];
      if (this.dynamicValidateForm.domains.length > 8) {
        Message.info("抱歉,答题选项已经上限了");
        return;
      }
      let domainObj = []; //添加的答题选项的abc值保存
      let domainLen = this.dynamicValidateForm.domains.length; //答题选项长度获取
      let alphaObj = this.alpha.slice(0, domainLen); //截取alpha字符串长度作为数组
      this.dynamicValidateForm.domains.map(res => {
        domainObj.push(res.id);
      });
      let unqualList = this.getArrDifference(alphaObj, domainObj); //获取字符串中不相等的内容
      if (unqualList.length > 0) {
        let interList = this.array_intersection(unqualList, alphaObj); //交集的数组
        let alphaIndex = alphaObj.indexOf(interList[0]);
        this.dynamicValidateForm.domains.splice(alphaIndex, 0, {
          value: "",
          id: this.alpha[alphaIndex]
        });
      } else {
        this.dynamicValidateForm.domains.push({
          value: "",
          id: this.alpha[this.dynamicValidateForm.domains.length]
        });
      }
    },


    back() {
      this.$router.push({ path: "answer" });
    },


    getQuestion(id) {
      this.dynamicValidateForm.domains = [];
      findByIdQuestion(id).then(res => {
        if (res.ret == "OK") {
          this.dynamicValidateForm.content = res.content.content;
          this.dynamicValidateForm.answer_parse = res.content.answer_parse;
          this.dynamicValidateForm.type = res.content.type;
          this.dynamicValidateForm.answer_right = res.content.answer_right;
          this.domainsSum = res.content.answer_options.length;
          res.content.answer_options.forEach((item, index) => {
            this.dynamicValidateForm.domains.push({
              value: item.substring(2),
              id: this.alpha[index]
            });
          });
        }
      });
    }
  },

  activated() {
    if (this.$route.query.paramId) {
      let paramId = this.$route.query.paramId;
      this.keyword = this.$route.query.keyword;
      this.title =
        this.keyword == "edit"
          ? "编辑题目"
          : this.keyword == "show"
          ? "查看题目"
          : "添加题目";
      this.domainsSum = this.keyword == "edit" ? 0 : 0;
      this.getQuestion(paramId);
    } else {
      this.dynamicValidateForm = {
        type: "",
        domains: [
          {
            value: "",
            id: "A"
          }
        ],
        content: "",
        answer_parse: "",
        answer_right: ""
      };
    }
  },
  deactivated() {
    this.keyword = "add";
  }
};
</script>


<style lang="scss" scoped>
.addquestion {
  .domain_title {
    margin: 10px;
    justify-content: space-between;
    display: flex;
    span {
      color: #606266;
      font-size: 14px;
      align-items: center;
      display: flex;
    }
    el-button {
      background: #3a8ee6;
    }
  }
  .linkDel {
    color: #3a8ee6;
    width: 70px;
    text-align: center;
  }
  /deep/ .el-form-item__content {
    display: flex;
  }
  form {
    width: 520px;
  }
  .question-title {
    font-size: 22px;
    color: #88909c;
    padding: 20px;
    display: flex;
    justify-content: space-between;
  }
}
</style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue新增删除内容排序问题解决处理 的相关文章

随机推荐

  • Windows Server 2016搭建文件服务器

    1 进入系统在服务器管理器仪表盘中添加角色和功能 2 下一步 3 继续下一步 4 下一步 5 勾选Web服务器 IIS 6 添加功能 7 下一步 8 下一步 9 下一步 10 角色服务没有特殊要求 保持默认 下一步 我这里多选了IP和域限制
  • 2020年4月蓝桥杯第二次模拟赛解题报告(本科组)Java语言描述__2021/3/21

    3 单词重排 问题描述 将LANQIAO中的字母重新排列 可以得到不同的单词 如LANQIAO AAILNOQ等 注意这7个字母都要被用上 单词不一定有具体的英文意义 请问 总共能排列如多少个不同的单词 答案提交 这是一道结果填空的题 你只
  • 代理模式--动态代理--jdk代理

    动态代理 jdk代理 基于接口代理 cglib 基于类代理 javassist 基于字节码 一个jdk动态代理类代理的是一个接口 一般归属于一个业务 在不改动源代码的同时可以很方便的低成本的进行加工附属改造 jdk代理主要是通过java l
  • php邮件发送类源码,一个邮件发送类..

    一个邮件发送类 class emailui static function runlog mode SMTP b c d static function sendmail toemail subject message from cfg a
  • R语言确定聚类的最佳簇数:3种聚类优化方法

    原文链接 http tecdat cn p 7275 确定数据集中最佳的簇数是分区聚类 例如k均值聚类 中的一个基本问题 它要求用户指定要生成的簇数k 一个简单且流行的解决方案包括检查使用分层聚类生成的树状图 以查看其是否暗示特定数量的聚类
  • C++:指针

    目录 1 指针 1 1指针三要素 1 2修饰结构体struct 1 3 Pointers of Pointers 1 4constant修饰 pointer 2 指针和数组 2 1 数组的地址是连续的 2 2pointer arithmet
  • mysql5.7选取JDBC

    记录 springboot 2 5 0 springCloud2020 0 3 mysql5 7 选用 mysql connector java 8 0 25 报错 java security cert CertificateNotYetV
  • expected scalar type Long but found Int

    报错信息 expected scalar type Long but found Int 或者 expected scalar type Long but found Float 报错场景 pytorch的分类 本例具体为torch nn
  • anaconda和tensorflow安装教程

    即使以前安装过python的其它版本也没关系 本教程一样有效 1 anaconda安装 使用清华的源下载速度比较 下载地址 下载完成后安装 没什么需要注意的 添加环境变量 检测 anaconda环境是否安装成功 conda version
  • 解决:Pycharm无法识别Python已安装的模块,如cv2(OpenCV)模块

    https blog csdn net qq2399431200 article details 92832662 查看了好几篇这样的博客 该加的都加了 就是没解决 我装的是华军软件的破解版pycharm2018 搞了一下午 都没有弄好 最
  • rsync问题处理

    使用rsync同步时出现 in rsync opt failed Permission denied 13 检查了服务器的同步的目录权限都没有问题 网上找了说是开启了SELinux 的enforce模式 于事 root test01 etc
  • 技术解读倚天 ECS 实例 — Arm 芯片的 Python-AI 算力优化

    深度学习技术在图像识别 搜索推荐等领域得到了广泛应用 近年来各大 CPU 厂商也逐渐把 AI 算力纳入了重点发展方向 通过 Arm 芯片 Python AI 算力优化 我们将看到龙蜥社区 Arm 架构 SIG Special Interes
  • 三菱modbusRTU通讯实例_编程实例

    点击箭头处 工业之家 选择 关注公众号 台达PLC控制伺服项目接线及程序 今天主要分享的是关于台达 ASDA 伺服的相关控制案例 台达 ASDA 伺服定位演示系统 控制要求 1 由台达 PLC 和台达伺服组成一个简单的定位控制演示系统 通过
  • 2019年“华为杯”研究生数学建模比赛总结

    前言 参加数学建模比赛是学习生涯甚至是人生的一次难忘的经历 不管是比赛过程还是最终的结果 无论最终结果如何 自我学习生涯至今 在研究生期间参加一次数学建模更重要的是我对数学建模比赛的一种情怀 回想本科期间参加数学建模竞赛 从校赛到省赛 再到
  • qwt之左键控制局部放大,右键逐步还原功能

    一 完成新建工程 并配置完qwt的图形 这个后期会做一个专栏进行说明 二 拖上开始的按钮 布局如图所示 三 加上头文件 include
  • V4L2 摄像头应用编程

    目录 V4L2 简介 V4L2 摄像头应用程序 打开摄像头 查询设备的属性 能力 功能 设置帧格式 帧率 申请帧缓冲 内存映射 入队 开启视频采集 读取数据 对数据进行处理 结束视频采集 V4L2 摄像头应用编程实战 实战小项目之视频监控
  • PAT C语言入门题目-7-62 切分表达式——写个tokenizer吧 (20 分)

    7 62 切分表达式 写个tokenizer吧 20 分 先说点出题背景 这个题是为低年级同学 学C语言的同学准备的 因为 对这部分同学 这个题目编写起来略有一点复杂 如果是高年级 学过了正则表达式 Regular Expression 的
  • 银行转账项目

    package Day14 class Account String id 用户名称 double balance 用户余额 public void save double money 存钱方法 if money gt 0 balance
  • Postman设置中文

    1 下载资源 postman官网下载地址 postman汉化包 2 配置 Mac 访达 应用程序 Postman app 右键查看包内容 替换Postman app Contents Resources app windows 复制到Pos
  • vue新增删除内容排序问题解决处理

    本次答题选项的删除添加是个人最初比较头疼的地方 比如ABCD四个选项 删除c选项后 点击 新增答题类型 选项按钮 则默认创建是E选项 再或者就是ABCD四个选项位置删除任意一个后 顺序被打乱等 最后解决了 就是多写好几行代码 有点繁琐 1