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

This commit is contained in:
maghny@126.com
2025-04-26 21:07:13 +08:00
committed by 陆光LG
parent 9d0498d262
commit dce7096928
2 changed files with 277 additions and 354 deletions

View File

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