|
@@ -0,0 +1,349 @@
|
|
|
+<template>
|
|
|
+ <div v-loading="loading">
|
|
|
+ <el-form
|
|
|
+ ref="form"
|
|
|
+ :model="form"
|
|
|
+ :rules="rules"
|
|
|
+ label-width="80px"
|
|
|
+ :disabled="dlgType === 3"
|
|
|
+ >
|
|
|
+ <el-form-item label="问题分类" prop="categoryId">
|
|
|
+ <SelectRemote
|
|
|
+ url="/question/category/list"
|
|
|
+ field="name"
|
|
|
+ v-model="form.categoryId"
|
|
|
+ :selectObj="selectObj"
|
|
|
+ :searchParams="searchParams"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="问题类型" prop="type">
|
|
|
+ <el-radio-group v-model="form.type" @input="changeType">
|
|
|
+ <el-radio label="1">单选</el-radio>
|
|
|
+ <el-radio label="2">多选</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="问题描述" prop="descripiton">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ :rows="4"
|
|
|
+ v-model="form.descripiton"
|
|
|
+ placeholder="请输入问题描述"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="选项列表" prop="itemList">
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ @click="addOption"
|
|
|
+ style="margin-bottom: 6px"
|
|
|
+ v-if="dlgType !== 3"
|
|
|
+ >添加选项</el-button
|
|
|
+ >
|
|
|
+ <el-table :data="form.itemList" style="width: 100%">
|
|
|
+ <el-table-column prop="code" label="选项" width="80" align="center" />
|
|
|
+ <el-table-column prop="optVal" label="值" align="center" />
|
|
|
+ <el-table-column
|
|
|
+ label="操作"
|
|
|
+ width="120"
|
|
|
+ align="center"
|
|
|
+ v-if="dlgType !== 3"
|
|
|
+ >
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-button type="text" size="small" @click="editOption(row)"
|
|
|
+ >修改</el-button
|
|
|
+ >
|
|
|
+ <el-button type="text" size="small" @click="deleteOption(row)"
|
|
|
+ >删除</el-button
|
|
|
+ >
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="正确选项" prop="correctItem">
|
|
|
+ <!-- value-key="code" -->
|
|
|
+ <el-select
|
|
|
+ ref="selectRef"
|
|
|
+ :multiple="form.type === '2'"
|
|
|
+ v-model="form.correctItem"
|
|
|
+ placeholder="请选择正确选项"
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
+ <!-- :label="`${item.code} - ${item.value}`" -->
|
|
|
+ <el-option
|
|
|
+ v-for="item in form.itemList"
|
|
|
+ :key="item.code"
|
|
|
+ :label="item.code"
|
|
|
+ :value="item.code"
|
|
|
+ ></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="问题解析" prop="analysis">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ :rows="4"
|
|
|
+ v-model="form.analysis"
|
|
|
+ placeholder="请输入问题解析"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="备注" prop="remark">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ :rows="4"
|
|
|
+ v-model="form.remark"
|
|
|
+ placeholder="请输入备注"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div style="text-align: right" v-if="dlgType !== 3">
|
|
|
+ <el-button type="primary" @click="handleConfirm">确 定</el-button>
|
|
|
+ <el-button @click="handleCancel">取 消</el-button>
|
|
|
+ </div>
|
|
|
+ <div style="text-align: right" v-else>
|
|
|
+ <el-button @click="handleCancel">关 闭</el-button>
|
|
|
+ </div>
|
|
|
+ <!-- 新增/编辑选项框 -->
|
|
|
+ <el-dialog
|
|
|
+ :title="dlgTitle"
|
|
|
+ :visible.sync="optionVisible"
|
|
|
+ width="30%"
|
|
|
+ append-to-body
|
|
|
+ >
|
|
|
+ <el-form
|
|
|
+ ref="optionForm"
|
|
|
+ :model="optionForm"
|
|
|
+ :rules="optionRules"
|
|
|
+ label-width="80px"
|
|
|
+ >
|
|
|
+ <el-form-item label="选项">
|
|
|
+ <el-input v-model="optionForm.code" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="值" prop="optVal">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ :rows="4"
|
|
|
+ v-model="optionForm.optVal"
|
|
|
+ placeholder="请输入选项值"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <span slot="footer" class="dialog-footer">
|
|
|
+ <el-button type="primary" @click="confirmOption">确 定</el-button>
|
|
|
+ <el-button @click="optionVisible = false">取 消</el-button>
|
|
|
+ </span>
|
|
|
+ </el-dialog>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import SelectRemote from "@/components/SelectRemote";
|
|
|
+export default {
|
|
|
+ components: { SelectRemote },
|
|
|
+ props: {
|
|
|
+ data: {
|
|
|
+ type: Object,
|
|
|
+ default: () => {},
|
|
|
+ },
|
|
|
+ loading: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false,
|
|
|
+ },
|
|
|
+ dlgType: {
|
|
|
+ // 弹窗类型 1 - 新增 2 - 修改 3 - 查看
|
|
|
+ type: Number,
|
|
|
+ default: 1,
|
|
|
+ },
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ // 选中的问题分类
|
|
|
+ selectObj: {},
|
|
|
+ // 远程搜索框的查询条件
|
|
|
+ searchParams: {},
|
|
|
+ // 选项弹窗相关参数
|
|
|
+ dlgTitle: "",
|
|
|
+ optionVisible: false,
|
|
|
+ optionForm: {},
|
|
|
+ optionRules: {
|
|
|
+ optVal: [
|
|
|
+ { required: true, trigger: "blur", message: "选项值不能为空" },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ form: {
|
|
|
+ categoryId: "",
|
|
|
+ type: "1",
|
|
|
+ descripiton: "",
|
|
|
+ itemList: [],
|
|
|
+ correctItem: "",
|
|
|
+ analysis: "",
|
|
|
+ remark: "",
|
|
|
+ },
|
|
|
+ rules: {
|
|
|
+ categoryId: [
|
|
|
+ { required: true, trigger: "change", message: "请选择问题分类" },
|
|
|
+ ],
|
|
|
+ descripiton: [
|
|
|
+ { required: true, trigger: "blur", message: "请输入问题描述" },
|
|
|
+ ],
|
|
|
+ itemList: [{ required: true, trigger: "blur", message: "请添加选项" }],
|
|
|
+ correctItem: [
|
|
|
+ { required: true, trigger: "change", message: "请选择正确选项" },
|
|
|
+ ],
|
|
|
+ analysis: [
|
|
|
+ { required: true, trigger: "blur", message: "请输入问题解析" },
|
|
|
+ ],
|
|
|
+ },
|
|
|
+ };
|
|
|
+ },
|
|
|
+ watch: {
|
|
|
+ data: {
|
|
|
+ handler(newVal) {
|
|
|
+ if (newVal) {
|
|
|
+ this.form = {
|
|
|
+ id: newVal.id || "",
|
|
|
+ categoryId: newVal.categoryId || "",
|
|
|
+ type: newVal.type || "1",
|
|
|
+ descripiton: newVal.descripiton || "",
|
|
|
+ itemList: newVal.itemList ? JSON.parse(newVal.itemList) : [],
|
|
|
+ correctItem: newVal.correctItem
|
|
|
+ ? newVal.type === "1"
|
|
|
+ ? newVal.correctItem
|
|
|
+ : newVal.correctItem.split(",")
|
|
|
+ : "",
|
|
|
+ analysis: newVal.analysis || "",
|
|
|
+ remark: newVal.remark || "",
|
|
|
+ };
|
|
|
+ this.selectObj = {
|
|
|
+ id: newVal.categoryId || "",
|
|
|
+ selectLabel: newVal.categoryName || "",
|
|
|
+ };
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.$refs.form && this.$refs.form.clearValidate();
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ },
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ // 切换单选多选
|
|
|
+ changeType(val) {
|
|
|
+ console.log(this.form.correctItem);
|
|
|
+ // console.log(val, this.form.correctItem, this.$refs.selectRef);
|
|
|
+ if (val === "2") {
|
|
|
+ this.form.correctItem = [];
|
|
|
+ this.$refs.selectRef.selectedLabel = "";
|
|
|
+ } else {
|
|
|
+ this.form.correctItem = undefined;
|
|
|
+ }
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.$refs.form && this.$refs.form.clearValidate();
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 确认添加选项
|
|
|
+ confirmOption() {
|
|
|
+ this.$refs.optionForm.validate((valid) => {
|
|
|
+ if (valid) {
|
|
|
+ if (this.dlgTitle === "编辑选项") {
|
|
|
+ let targetIndex = this.form.itemList.findIndex(
|
|
|
+ (item) => item.code === this.optionForm.code
|
|
|
+ );
|
|
|
+ this.$set(this.form.itemList, targetIndex, this.optionForm);
|
|
|
+ } else {
|
|
|
+ this.form.itemList.push(this.optionForm);
|
|
|
+ }
|
|
|
+ this.optionVisible = false;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 删除选项(需要更新一下code值)
|
|
|
+ deleteOption(row) {
|
|
|
+ console.log("删除的当前行数据", row);
|
|
|
+ let targetIndex = this.form.itemList.findIndex(
|
|
|
+ (item) => item.code === row.code
|
|
|
+ );
|
|
|
+ // 先判断一下删除的选项是否被选中为正确选项
|
|
|
+ // 是的话 需要确认是否删除
|
|
|
+ if (this.form.correctItem.includes(row.code)) {
|
|
|
+ this.$modal
|
|
|
+ .confirm("当前选项已被选中为正确选项,是否确认删除?")
|
|
|
+ .then(() => {
|
|
|
+ this.form.itemList.splice(targetIndex, 1);
|
|
|
+ // 清除正确选项
|
|
|
+ this.form.correctItem = this.form.type === "1" ? "" : [];
|
|
|
+ // 更新选项列表的code
|
|
|
+ this.form.itemList.forEach((item, index) => {
|
|
|
+ item.code = String.fromCharCode(index + 65);
|
|
|
+ });
|
|
|
+ })
|
|
|
+ .catch(() => {});
|
|
|
+ } else {
|
|
|
+ this.form.itemList.splice(targetIndex, 1);
|
|
|
+ // 更新选项列表的code
|
|
|
+ this.form.itemList.forEach((item, index) => {
|
|
|
+ item.code = String.fromCharCode(index + 65);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ // 编辑选项
|
|
|
+ editOption(row) {
|
|
|
+ console.log("编辑的当前行数据", row);
|
|
|
+ this.dlgTitle = "编辑选项";
|
|
|
+ this.optionVisible = true;
|
|
|
+ this.optionForm = { ...row };
|
|
|
+ },
|
|
|
+ // 添加选项
|
|
|
+ addOption() {
|
|
|
+ // 首先拿到选项列表的最后一项的code,然后根据这个code生成下一项的code
|
|
|
+ // 也可以拿到选项列表的长度,根据长度判断下一个的code, A ---- 65
|
|
|
+ let index = this.form.itemList.length;
|
|
|
+ let nextCode = String.fromCharCode(index + 65);
|
|
|
+ console.log("下一项的code", nextCode);
|
|
|
+ this.dlgTitle = "新增选项";
|
|
|
+ this.optionVisible = true;
|
|
|
+ this.optionForm = { code: nextCode, optVal: "" };
|
|
|
+ // 清除一下校验
|
|
|
+ this.$refs.optionForm && this.$refs.optionForm.clearValidate();
|
|
|
+ },
|
|
|
+ // 确定
|
|
|
+ handleConfirm() {
|
|
|
+ this.$refs.form.validate((valid) => {
|
|
|
+ if (valid) {
|
|
|
+ let obj = {
|
|
|
+ ...this.form,
|
|
|
+ itemList: JSON.stringify(this.form.itemList),
|
|
|
+ correctItem:
|
|
|
+ this.form.type === "1"
|
|
|
+ ? this.form.correctItem
|
|
|
+ : this.sortEn(this.form.correctItem).join(","),
|
|
|
+ };
|
|
|
+ console.log(obj);
|
|
|
+ this.$emit("confirm", obj);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ // 数组的值按照英文字母排序
|
|
|
+ sortEn(arr) {
|
|
|
+ arr.sort(function (a, b) {
|
|
|
+ return a.charCodeAt(0).toString(16) - b.charCodeAt(0).toString(16);
|
|
|
+ });
|
|
|
+ return arr;
|
|
|
+ },
|
|
|
+ // 取消
|
|
|
+ handleCancel() {
|
|
|
+ this.form = {
|
|
|
+ categoryId: "",
|
|
|
+ type: "1",
|
|
|
+ descripiton: "",
|
|
|
+ itemList: [],
|
|
|
+ correctItem: "",
|
|
|
+ analysis: "",
|
|
|
+ remark: "",
|
|
|
+ };
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.$refs.form && this.$refs.form.clearValidate();
|
|
|
+ });
|
|
|
+ this.$emit("cancel");
|
|
|
+ },
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped></style>
|