【新增】试题单选题弹窗代码迁移

This commit is contained in:
maghny@126.com
2025-04-26 21:07:13 +08:00
parent dfa8971013
commit 831bf5f25b
2 changed files with 277 additions and 354 deletions

View File

@@ -1,262 +1,239 @@
<template>
<Dialog
v-model="dialogVisible"
:title="dialogTitle"
width="70%"
top="10vh">
<el-scrollbar height="700px">
<div class="main">
<el-form
<div class="edit-dialog">
<Dialog v-model="dialogVisible" :title="dialogTitle" width="85%" top="10vh">
<el-scrollbar>
<div class="main">
<el-form
ref="formRef"
v-loading="formLoading"
:model="formData"
:rules="formRules"
label-width="80px"
>
<el-row>
<el-col :span="12">
<el-form-item label="专业" prop="specialtyName">
<el-input v-model="formData.specialtyName" placeholder="请输入专业" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="试题名称" prop="quBankName">
<el-input v-model="formData.quBankName" placeholder="请输入专业" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="题库" prop="required">
<el-input v-model="formData.required" placeholder="请输入手机题库" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="章节名称" prop="chapteridDictText">
<el-input v-model="formData.chapteridDictText" placeholder="请输入章节名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="课程" prop="courseName">
<el-input v-model="formData.courseName" placeholder="请输入课程" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<div class="edit-bottom">
<div class="edit-left bottom-common">
<el-tabs v-model="leftActiveName" class="demo-tabs">
<el-tab-pane label="试题描述" name="desc">
<div class="block">
<Editor v-model="formData.content" height="150px" />
</div>
</el-tab-pane>
</el-tabs>
</div>
<div class="edit-right bottom-common">
<el-tabs
v-model="rightActiveName"
class="demo-tabs"
@tab-click="rightHandleClick"
>
<el-tab-pane class="answer" label="试题答案" name="answer">
<div class="block">
<div class="tip">
<p>答案设置&nbsp;&nbsp;|&nbsp;选项数</p>
<el-select
v-model="optionNumVal"
class="m-2"
placeholder="Select"
size="large"
style="width: 30%"
>
<el-option
v-for="item in optionNumber"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</div>
<el-radio-group v-model="radio">
<div
class="options"
v-for="item in optionNumVal"
:key="item"
>
<div class="content">
<el-radio :label="String.fromCharCode(64 + item)">
{{ String.fromCharCode(64 + item) }}
</el-radio>
<el-input
class="text"
v-model="optionsContent[item]"
:rows="3"
type="textarea"
placeholder="请输入答案内容"
/>
</div>
<!-- <el-button class="more-btn" @click="moreEdit">更多</el-button> -->
<el-row>
<el-col :span="12">
<el-form-item label="专业" prop="specialtyName">
<el-input v-model="formData.specialtyName" placeholder="请输入专业" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="试题名称" prop="quBankName">
<el-input v-model="formData.quBankName" placeholder="请输入专业" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="题库" prop="required">
<el-input v-model="formData.required" placeholder="请输入手机题库" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="章节名称" prop="chapteridDictText">
<el-input v-model="formData.chapteridDictText" placeholder="请输入章节名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="课程" prop="courseName">
<el-input v-model="formData.courseName" placeholder="请输入课程" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="edit-bottom">
<div class="edit-left bottom-common">
<el-tabs v-model="leftActiveName" class="demo-tabs">
<el-tab-pane label="试题描述" name="desc">
<div class="block">
<Editor v-model="formData.content" height="150px" />
</div>
</el-radio-group>
</div>
</el-tab-pane>
<el-tab-pane label="试题解析" name="analysis">
<div class="block">
<Editor v-model="formData.analysis" height="150px" />
</div>
</el-tab-pane>
<el-tab-pane name="keyword">
<template #label>
<div class="custom-tabs-label">
<p>关键字</p>
<el-dropdown>
</el-tab-pane>
</el-tabs>
</div>
<div class="edit-right bottom-common">
<el-tabs v-model="rightActiveName" class="demo-tabs" @tab-click="rightHandleClick">
<el-tab-pane class="answer" label="试题答案" name="answer">
<div class="block">
<div class="tip">
<p>答案设置&nbsp;&nbsp;|&nbsp;选项数</p>
<el-select
v-model="optionNumVal"
class="m-2"
placeholder="Select"
size="large"
style="width: 30%"
>
<el-option
v-for="item in optionNumber"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</div>
<el-radio-group v-model="radio">
<div class="options" v-for="item in optionNumVal" :key="item">
<div class="content">
<el-radio :label="String.fromCharCode(64 + item)">
{{ String.fromCharCode(64 + item) }}
</el-radio>
<el-input
class="text"
v-model="optionsContent[item]"
:rows="3"
type="textarea"
placeholder="请输入答案内容"
/>
</div>
<!-- <el-button class="more-btn" @click="moreEdit">更多</el-button> -->
</div>
</el-radio-group>
</div>
</el-tab-pane>
<el-tab-pane label="试题解析" name="analysis">
<div class="block">
<Editor v-model="formData.analysis" height="150px" />
</div>
</el-tab-pane>
<el-tab-pane name="keyword">
<template #label>
<div class="custom-tabs-label">
<p>关键字</p>
<el-dropdown>
<span class="el-dropdown-link" @click.stop="false">
<div class="setting_icon"></div>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="editKeyword('create')"
>新建</el-dropdown-item
>
<el-dropdown-item @click="editKeyword('create')"
>编辑</el-dropdown-item
>
<el-dropdown-item @click="editKeyword('delete')"
>删除</el-dropdown-item
>
<el-dropdown-item @click="editKeyword('deleteall')"
>删除全部</el-dropdown-item
>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
<div class="block">
<el-table
ref="keywordTableRef"
row-key="id"
:columns="keywordColumns"
:datasource="keywordList"
:toolbar="false"
:show-overflow-tooltip="true"
highlight-current-row
style="width: 100%"
/>
<el-dialog
v-model="keyVisible"
title="编辑关键字"
width="50%"
:before-close="keyDialogClose"
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<div class="main" style="width: 100%; height: 100%">
<el-input
v-model="keyWord"
placeholder="请输入关键字"
size="large"
/>
<div class="dialog-footer">
<el-button @click="keyDialogClose">取消</el-button>
<el-button
type="primary"
@click="confirmKeyDialogVisible"
>
确定
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="editKeyword('create')">新建</el-dropdown-item>
<el-dropdown-item @click="editKeyword('create')">编辑</el-dropdown-item>
<el-dropdown-item @click="editKeyword('delete')">删除</el-dropdown-item>
<el-dropdown-item @click="editKeyword('deleteall')"
>删除全部</el-dropdown-item
>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
<div class="block">
<el-table
:data="keywordList"
style="width: 100%"
@selection-change="handleKeywordSelectionChange"
>
<el-table-column type="index" width="50" />
<el-table-column type="selection" width="55" />
<el-table-column prop="keyword" label="关键字" />
</el-table>
<el-dialog
v-model="keyVisible"
title="编辑关键字"
width="50%"
:before-close="keyDialogClose"
:close-on-click-modal="false"
:close-on-press-escape="false"
>
<div class="main" style="width: 100%; height: 100%">
<el-input v-model="keyWord" placeholder="请输入关键字" size="large" />
<div class="dialog-footer">
<el-button @click="keyDialogClose">取消</el-button>
<el-button type="primary" @click="confirmKeyDialogVisible">
确定
</el-button>
</div>
</div>
</el-dialog>
</div>
</el-dialog>
</div>
</el-tab-pane>
<el-tab-pane name="medium">
<template #label>
<div class="custom-tabs-label">
<p>媒体文件</p>
<el-dropdown>
<span class="el-dropdown-link" @click.stop="false">
<div class="setting_icon"></div>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<el-upload
v-model:file-list="fileList"
class="upload-demo"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
>
<el-button>导入</el-button>
</el-upload>
</el-dropdown-item>
<el-dropdown-item>导出</el-dropdown-item>
<el-dropdown-item>播放</el-dropdown-item>
<el-dropdown-item>编辑</el-dropdown-item>
<el-dropdown-item>删除选中</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
<div class="block">
<el-table
ref="mediumTableRef"
row-key="id"
:columns="mediumColumns"
:datasource="mediumList"
:toolbar="false"
:show-overflow-tooltip="true"
highlight-current-row
style="width: 100%"
/>
</div>
</el-tab-pane>
<el-tab-pane name="annex">
<template #label>
<div class="custom-tabs-label">
<p>试题附件</p>
<el-dropdown>
<span class="el-dropdown-link" @click.stop="false">
<div class="setting_icon"></div>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>导入单文件</el-dropdown-item>
<el-dropdown-item>导入多文件</el-dropdown-item>
<el-dropdown-item>导出</el-dropdown-item>
<el-dropdown-item>删除</el-dropdown-item>
<el-dropdown-item>帮助</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
<div class="block">
<el-table
ref="annexTableRef"
row-key="id"
:columns="annexColumns"
:datasource="annexList"
:toolbar="false"
:show-overflow-tooltip="true"
highlight-current-row
style="width: 100%"
/>
</div>
</el-tab-pane>
</el-tabs>
</el-tab-pane>
<el-tab-pane name="medium">
<template #label>
<div class="custom-tabs-label">
<p>媒体文件</p>
<el-dropdown>
<span class="el-dropdown-link" @click.stop="false">
<div class="setting_icon"></div>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>
<el-upload
v-model:file-list="fileList"
class="upload-demo"
action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15"
>
<el-button>导入</el-button>
</el-upload>
</el-dropdown-item>
<el-dropdown-item>导出</el-dropdown-item>
<el-dropdown-item>播放</el-dropdown-item>
<el-dropdown-item>编辑</el-dropdown-item>
<el-dropdown-item>删除选中</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
<div class="block">
<el-table
:data="mediumList"
style="width: 100%"
@selection-change="handleMediumSelectionChange"
>
<el-table-column type="index" width="50" />
<el-table-column type="selection" width="55" />
<el-table-column prop="type" label="媒体类型" width="80" />
<el-table-column prop="title" label="标题" />
<el-table-column prop="displayIndex" label="显示序号" />
<el-table-column prop="size" label="大小" />
</el-table>
</div>
</el-tab-pane>
<el-tab-pane name="annex">
<template #label>
<div class="custom-tabs-label">
<p>试题附件</p>
<el-dropdown>
<span class="el-dropdown-link" @click.stop="false">
<div class="setting_icon"></div>
</span>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>导入单文件</el-dropdown-item>
<el-dropdown-item>导入多文件</el-dropdown-item>
<el-dropdown-item>导出</el-dropdown-item>
<el-dropdown-item>删除</el-dropdown-item>
<el-dropdown-item>帮助</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</div>
</template>
<div class="block">
<el-table
:data="documentList"
style="width: 100%"
@selection-change="handleDocumentSelectionChange"
>
<el-table-column type="index" width="50" />
<el-table-column prop="type" label="附件" />
<el-table-column prop="size" label="大小" width="80" />
</el-table>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
</div>
</div>
</el-scrollbar>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</el-scrollbar>
<template #footer>
<el-button :disabled="formLoading" type="primary" @click="submitForm"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</div>
</template>
<script lang="ts" setup>
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
@@ -292,123 +269,63 @@ const formRef = ref() // 表单 Ref
const deptList = ref<Tree[]>([]) // 树形结构
const postList = ref([] as PostApi.PostVO[]) // 岗位列表
// 左侧试题描述
const leftActiveName = ref('desc');
const leftActiveName = ref('desc')
// 右侧tab
const rightActiveName = ref('answer');
const rightActiveName = ref('answer')
const rightHandleClick = (tab, e) => {
rightActiveName.value = tab.paneName.value;
};
const optionNumVal = ref(4);
const optionNumber = ref(26);
const radio = ref('A');
const keyEditType = ref('');
const keyVisible = ref(false);
const keyWord = ref([null]);
const annexList = ref([]);
const fileList = [];
const mediumList = ref([]);
const keywordList = ref([]);
rightActiveName.value = tab.paneName.value
}
const optionNumVal = ref(4)
const optionNumber = ref(26)
const radio = ref('A')
const annexList = ref([])
// 保留选项的值
const optionsContent = reactive({});
const editKeyword = (key) => {
keyEditType.value = key;
keyVisible.value = true;
};
const optionsContent = reactive({})
// 关键字
const keywordColumns = computed(() => {
return [
{
type: 'index',
columnKey: 'index',
width: 55,
align: 'center',
showOverflowTooltip: false
},
{
prop: 'keyword',
label: '关键字',
align: 'left',
showOverflowTooltip: true
}
];
});
// 试题附件
const annexColumns = computed(() => {
return [
{
type: 'index',
columnKey: 'index',
width: 55,
align: 'center',
showOverflowTooltip: false
},
{
prop: 'name',
label: '附件',
align: 'left',
showOverflowTooltip: true
},
{
prop: 'size',
label: '大小',
align: 'center',
width: 55,
showOverflowTooltip: false
}
];
});
// 媒体文件
const mediumColumns = computed(() => {
return [
{
type: 'index',
columnKey: 'index',
width: 55,
align: 'center',
showOverflowTooltip: false
},
{
prop: 'type',
label: '媒体类型',
align: 'center',
width: 80,
showOverflowTooltip: false
},
{
prop: 'title',
label: '标题',
align: 'left',
showOverflowTooltip: true
},
{
prop: 'displayIndex',
label: '显示序号',
align: 'center',
showOverflowTooltip: false
},
{
prop: 'size',
label: '大小',
align: 'center',
showOverflowTooltip: false
}
];
});
const keywordList = ref([] as any)
const multipleKeywordSelection = ref([] as any)
const handleKeywordSelectionChange = (val: any) => {
multipleKeywordSelection.value = val
}
const keyVisible = ref(false)
const keyEditType = ref('')
const keyWord = ref([null])
const editKeyword = (key) => {
keyEditType.value = key
keyVisible.value = true
}
const keyDialogClose = () => {
keyVisible.value = false
}
const confirmKeyDialogVisible = () => {
if (keyEditType.value === 'create') {
keywordList.value.push({
keyword: keyWord.value
});
})
}
keyVisible.value = false;
};
keyVisible.value = false
}
// 媒体文件
const mediumList = ref([] as any)
const multipleMediumSelection = ref([] as any)
const handleMediumSelectionChange = (val: any) => {
multipleMediumSelection.value = val
}
const fileList = []
// 媒体文件
const documentList = ref([] as any)
const multipleDocumentSelection = ref([] as any)
const handleDocumentSelectionChange = (val: any) => {
multipleDocumentSelection.value = val
}
const keyDialogClose = () => {
keyVisible.value = false;
};
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
@@ -566,8 +483,7 @@ const resetForm = () => {
.setting_icon {
width: 16px;
height: 16px;
background: url('@/assets/icon/setting_blue.png') no-repeat
center;
background: url('@/assets/icon/setting_blue.png') no-repeat center;
background-size: 100%;
margin-left: 3px;
display: none;

View File

@@ -297,7 +297,10 @@ const handleDeptNodeClick = async (row) => {
}
/** 处理专业被点击 */
const handleSpecialtyNodeClick = async (row) => {
const chooseQuestionType = ref('');
const handleSpecialtyNodeClick = async (row: any) => {
chooseQuestionType.value = row.name;
// 判断点击的层级结构,进行入参
if (!row.children != null){
// 说明是题型
@@ -359,7 +362,11 @@ const findNamePathFromTreeList = (treeList: Tree[], targetId: number): string[]
const formRef = ref()
const cformRef = ref()
const openForm = (type: string, id?: number) => {
cformRef.value.open(type, id)
if (chooseQuestionType.value.includes("选择题")){
formRef.value.open(type, id)
} else {
cformRef.value.open(type, id)
}
}
/** 用户导入 */