dbsd_kczx/src/views/kc/wjxWjxxTmlb/TikuList.vue

1033 lines
42 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div>
<!--查询区域-->
<div class="jeecg-basic-table-form-container">
<a-form @keyup.enter.native="reload" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-row :gutter="24">
<a-col :lg="24">
<a-button type="primary" @click="importOpen = true">导入试题</a-button>
<a-button type="primary" @click="addOpen = true" style="margin-left: 20px">手动添加</a-button>
</a-col>
</a-row>
</a-form>
</div>
<div class="jeecg-basic-table-form-container">
<a-form @keyup.enter.native="reload" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
<a-row :gutter="24">
<a-col :lg="6">
<a-form-item label="问题标题">
<j-input placeholder="请输入问题标题" v-model:value="queryParam.wjTitle"></j-input>
</a-form-item>
</a-col>
<a-col :lg="6">
<a-form-item label="题目类型">
<a-select placeholder="请选择题目类型" ref="select" v-model:value="queryParam.wjType">
<a-select-option value="">全部</a-select-option>
<a-select-option value="3">单选题</a-select-option>
<a-select-option value="4">多选题</a-select-option>
<a-select-option value="5">填空题</a-select-option>
<a-select-option value="8">文件题</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :lg="6">
<a-form-item label="是否公有">
<JDictSelectTag placeholder="请选择" v-model:value="queryParam.wjSytype" dictCode="yn" />
</a-form-item>
</a-col>
<a-col :xl="6" :lg="6" :md="8" :sm="24">
<span style="float: left; overflow: hidden" class="table-page-search-submitButtons">
<a-col :lg="6">
<a-button type="primary" preIcon="ant-design:search-outlined" @click="searchQuery">查询</a-button>
</a-col>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!--引用表格-->
<BasicTable @register="registerTable">
<!--插槽:table标题-->
<!-- <template #tableTitle>
</template> -->
<!--操作栏-->
<template #action="{ record }">
<TableAction :actions="getTableAction(record)" />
</template>
<template #wjTitleaction="{ record }">
<div v-html="record.wjTitle"></div>
</template>
<!--字段回显插槽-->
<template #htmlSlot="{ text }">
<div v-html="text"></div>
</template>
<template #fileSlot="{ text }">
<span v-if="!text" style="font-size: 12px; font-style: italic">无文件</span>
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small"
@click="downloadFile(text)">下载</a-button>
</template>
</BasicTable>
<a-modal title="Excel导入指导" :width="800" :visible="importOpen" :maskClosable="false"
:okButtonProps="{ class: { 'jee-hidden': true } }" @cancel="importOpen = false" cancelText="关闭">
<div style="padding: 20px; background-color: rgb(225, 243, 237); border-radius: 5px; margin: 20px">
<p>Excel导入指导</p>
<p>1.下载题目导入模板文件。</p>
<p>2.按要求格式填写题目信息。</p>
<p>3.在模板内录入信息后,上传文件导入题目。</p>
<p>4.点击导入题目,选择已完成录入的文件,平台将会验证数据的正确性。</p>
<p>5.若发现错误,会给予提示,重新修正后再次上传:若无错误,即将数据导入到平台中。</p>
<p><a @click="downloadByUrl({ url: '/downPath/stdrmb.xls', target: '_self', fileName: '试题导入模板.xls' })">
<Icon icon="ant-design:download-outlined" :size="20" />导入模板下载
</a></p>
</div>
<div style="text-align: center; margin-top: 20px; margin-bottom: 20px">
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="importXls">导入试题</j-upload-button>
</div>
</a-modal>
<a-modal title="手动添加" :style="{ width: computedWidth }" :visible="addOpen" :maskClosable="false" @cancel="addOpen = false"
cancelText="关闭" @ok="handleOk">
<div class="sdtj-div">
<a-row :gutter="[16, 16]">
<a-col :xs="24" :lg="4" style="padding: 10px">
<a-card title="可选题型" style="height: 360px; border: 1px solid #e8e8e8">
<p><a-button type="primary" preIcon="ant-design:check-square-outlined" @click="addTigan(3)">单选题</a-button>
</p>
<p><a-button type="primary" preIcon="ant-design:check-square-outlined" @click="addTigan(4)">多选题</a-button>
</p>
<p><a-button type="primary" preIcon="ant-design:check-square-outlined" @click="addTigan(5)">填空题</a-button>
</p>
<p><a-button type="primary" preIcon="ant-design:check-square-outlined" @click="addTigan(8)">文件题</a-button>
</p>
<p><a-button type="primary" preIcon="ant-design:check-square-outlined"
@click="addTigan(502)">简答题</a-button></p>
<p><a-button type="primary" preIcon="ant-design:check-square-outlined"
@click="addTigan(305)">判断题</a-button></p>
</a-card>
</a-col>
<a-col :xs="24" :lg="20" style="overflow-y: scroll; min-height: 100px">
<draggable :handle="isSmallScreen ? '.drag-handle' : null" @end="end" v-model="tiganData" item-key="id">
<template #item="{ index, element: item }">
<div>
<!-- 单选题 -->
<div style="width: 100%" v-if="(item.wjType == 3 || item.wjType == '3') && item.wjSubtype == null">
<a-card>
<template #title>
<div>
<a-row>
<a-col :span="11">
<span>{{ index + 1 }}、<span style="color: #c2bfbf">[单选题]</span></span>
</a-col>
<a-col :span="13" style="text-align: right;">
<a-tooltip placement="topLeft" title="题目分数" v-if="isShow">
<a-select style="width: 120px" v-model:value="item.wjScore" placeholder="请选择分数"
v-if="item.wjSfqh == '0'" :disabled="editDisabled">
<a-select-option :value="item" v-for="(item) in scoreData">{{item}}</a-select-option>
</a-select>
</a-tooltip>
<a-tooltip placement="topRight" title="删除此题">
<Icon icon="ant-design:delete-outlined"
style="cursor: pointer; font-size: 20px; margin: 5px"
@click="handleDelTigan(item, index)" v-if="!editDisabled" />
</a-tooltip>
<Icon
v-if="isSmallScreen && !editDisabled"
icon="pixelarticons:chevrons-vertical"
class="drag-handle"
style="cursor: move; font-size: 20px; margin-right: 10px;"
/>
</a-col>
</a-row>
</div>
<JEditor2 placeholder="请填写文件题题干" v-model:value="item.wjTitle" :bordered="false"
:style="{ width: '30rem' }" :auto-size="{ minRows: 1, maxRows: 5 }" :disabled="editDisabled"
v-if="!editDisabled" />
<div v-else v-html="item.wjTitle"></div>
<div style="text-align: right;color: #c2bfbf" v-if="isShow">是否加入题库:
<j-dict-select-tag type='radio' v-model:value="item.sftjtk" dictCode="yn" placeholder="是否加入题库"
:disabled="editDisabled" />
</div>
</template>
<a-row v-if="isShow">
<a-col :span="24" style="color: darkgrey; font-size: 13px"> 注:选中即为正确答案 </a-col>
</a-row>
<a-radio-group v-model:value="item.itemSelected" style="width: 100%" size="default"
:disabled="!isShow">
<div style="width: 100%" v-for="(tmxx, index) in item.wjxWjxxTmxxList" :key="index">
<a-radio :value="tmxx.itemIndex + ``" style="width: 100%">
<a-input placeholder="请填写选项" v-model:value="tmxx.itemTitle" :style="{ width: '30rem' }"
:bordered="false" :disabled="editDisabled" />
<span style="color: #ecb646" v-if="item.itemSelected == tmxx.itemIndex">(正确答案)</span>
<a-tooltip placement="topLeft" title="在下方添加新的选项">
<Icon icon="ant-design:plus-circle-outlined"
style="cursor: pointer; margin: 5px; font-size: 20px; color: #1890ff"
@click="handleAddTmxx(tmxx, index, item.wjxWjxxTmxxList)" v-if="!editDisabled" />
</a-tooltip>
<a-tooltip placement="topLeft" title="删除选项">
<Icon icon="ant-design:minus-circle-outlined"
style="cursor: pointer; margin: 5px; font-size: 20px; color: #1890ff"
@click="handleRemTmxx(tmxx, index, item.wjxWjxxTmxxList)" v-if="!editDisabled" />
</a-tooltip>
</a-radio>
</div>
</a-radio-group>
</a-card>
</div>
<!-- 多选题 -->
<div style="width: 100%" v-else-if="item.wjType == 4 || item.wjType == '4'">
<a-card>
<template #title>
<div>
<a-row>
<a-col :span="11">
<span>{{ index + 1 }}、<span style="color: #c2bfbf">[多选题]</span></span>
</a-col>
<a-col :span="13" style="text-align: right;">
<a-tooltip placement="topLeft" title="题目分数" v-if="isShow">
<a-select style="width: 120px" v-model:value="item.wjScore" placeholder="请选择分数"
v-if="item.wjSfqh == '0'" :disabled="editDisabled">
<a-select-option :value="item" v-for="(item) in scoreData">{{item}}</a-select-option>
</a-select>
</a-tooltip>
<a-tooltip placement="topRight" title="删除此题">
<Icon icon="ant-design:delete-outlined"
style="cursor: pointer; font-size: 20px; margin: 5px"
@click="handleDelTigan(item, index)" v-if="!editDisabled" />
</a-tooltip>
<Icon
v-if="isSmallScreen && !editDisabled"
icon="pixelarticons:chevrons-vertical"
class="drag-handle"
style="cursor: move; font-size: 20px; margin-right: 10px;"
/>
</a-col>
</a-row>
</div>
<JEditor2 placeholder="请填写多选题题干" v-model:value="item.wjTitle" :bordered="false"
:style="{ width: '30rem' }" :auto-size="{ minRows: 1, maxRows: 5 }" :disabled="editDisabled"
v-if="!editDisabled" />
<div v-else v-html="item.wjTitle"></div>
<div style="text-align: right;color: #c2bfbf" v-if="isShow">是否加入题库:
<j-dict-select-tag type='radio' v-model:value="item.sftjtk" dictCode="yn" placeholder="是否加入题库"
:disabled="editDisabled" />
</div>
</template>
<a-row v-if="isShow">
<a-col :span="24" style="color: darkgrey; font-size: 13px"> 注:选中即为正确答案 </a-col>
</a-row>
<a-checkbox-group v-model:value="item.itemSelected" style="width: 100%" :disabled="!isShow"
@change="handleChecked">
<a-row>
<a-col :span="24" v-for="(tmxx, index) in item.wjxWjxxTmxxList" :key="index">
<!-- -{{item.itemSelected}}-{{tmxx.itemIndex}} -->
<a-checkbox :value="tmxx.itemIndex"><a-input placeholder="请填写选项"
v-model:value="tmxx.itemTitle" :bordered="false" :style="{ width: '30rem' }"
:disabled="editDisabled" /></a-checkbox>
<span style="color: #ecb646" v-if="cheGrp(item.itemSelected, tmxx.itemIndex)">(正确答案)</span>
<a-tooltip placement="topLeft" title="在下方添加新的选项">
<Icon icon="ant-design:plus-circle-outlined"
style="cursor: pointer; margin: 5px; font-size: 20px; color: #1890ff"
@click="handleAddTmxx(tmxx, index, item.wjxWjxxTmxxList)" v-if="!editDisabled" />
</a-tooltip>
<a-tooltip placement="topLeft" title="删除选项">
<Icon icon="ant-design:minus-circle-outlined"
style="cursor: pointer; margin: 5px; font-size: 20px; color: #1890ff"
@click="handleRemTmxx(tmxx, index, item.wjxWjxxTmxxList)" v-if="!editDisabled" />
</a-tooltip>
</a-col>
</a-row>
</a-checkbox-group>
</a-card>
</div>
<!-- 填空题 -->
<div style="width: 100%"
v-else-if="(item.wjType == 5 || item.wjType == '5') && item.wjSubtype == null">
<a-card>
<template #title>
<div>
<a-row>
<a-col :span="11">
<span>{{ index + 1 }}、<span style="color: #c2bfbf">[填空题]</span></span>
</a-col>
<a-col :span="13" style="text-align: right;">
<a-tooltip placement="topLeft" title="题目分数" v-if="isShow">
<a-select style="width: 120px" v-model:value="item.wjScore" placeholder="请选择分数"
v-if="item.wjSfqh == '0'" :disabled="editDisabled">
<a-select-option :value="item" v-for="(item) in scoreData">{{item}}</a-select-option>
</a-select>
</a-tooltip>
<a-tooltip placement="topRight" title="删除此题">
<Icon icon="ant-design:delete-outlined"
style="cursor: pointer; font-size: 20px; margin: 5px"
@click="handleDelTigan(item, index)" v-if="!editDisabled" />
</a-tooltip>
<Icon
v-if="isSmallScreen && !editDisabled"
icon="pixelarticons:chevrons-vertical"
class="drag-handle"
style="cursor: move; font-size: 20px; margin-right: 10px;"
/>
</a-col>
</a-row>
</div>
<JEditor2 placeholder="请填写填空题题干" v-model:value="item.wjTitle" :bordered="false"
:style="{ width: '30rem' }" :auto-size="{ minRows: 1, maxRows: 5 }" :disabled="editDisabled"
v-if="!editDisabled" />
<div v-else v-html="item.wjTitle"></div>
<div style="text-align: right;color: #c2bfbf" v-if="isShow">是否加入题库:
<j-dict-select-tag type='radio' v-model:value="item.sftjtk" dictCode="yn" placeholder="是否加入题库"
:disabled="editDisabled" />
</div>
</template>
<a-row>
<a-col :span="24">
<a-textarea placeholder="请填写答案" v-model:value="item.wjAnswer" :bordered="false"
style="width: 100%" :auto-size="{ minRows: 1, maxRows: 5 }" :disabled="editDisabled" />
</a-col>
</a-row>
</a-card>
</div>
<!-- 文件上传 -->
<div style="width: 100%" v-else-if="item.wjType == 8 || item.wjType == '8'">
<a-card>
<template #title>
<div>
<a-row>
<a-col :span="11">
<span>{{ index + 1 }}、<span style="color: #c2bfbf">[文件题]</span></span>
</a-col>
<a-col :span="13" style="text-align: right;">
<a-tooltip placement="topLeft" title="题目分数" v-if="isShow">
<a-select style="width: 120px" v-model:value="item.wjScore" placeholder="请选择分数"
v-if="item.wjSfqh == '0'" :disabled="editDisabled">
<a-select-option :value="item" v-for="(item) in scoreData">{{item}}</a-select-option>
</a-select>
</a-tooltip>
<a-tooltip placement="topRight" title="删除此题">
<Icon icon="ant-design:delete-outlined"
style="cursor: pointer; font-size: 20px; margin: 5px"
@click="handleDelTigan(item, index)" v-if="!editDisabled" />
</a-tooltip>
<Icon
v-if="isSmallScreen && !editDisabled"
icon="pixelarticons:chevrons-vertical"
class="drag-handle"
style="cursor: move; font-size: 20px; margin-right: 10px;"
/>
</a-col>
</a-row>
</div>
<JEditor2 placeholder="请填写文件题题干" v-model:value="item.wjTitle" :bordered="false"
:style="{ width: '30rem' }" :auto-size="{ minRows: 1, maxRows: 5 }" :disabled="editDisabled"
v-if="!editDisabled" />
<div v-else v-html="item.wjTitle"></div>
<div style="text-align: right;color: #c2bfbf" v-if="isShow">是否加入题库:
<j-dict-select-tag type='radio' v-model:value="item.sftjtk" dictCode="yn" placeholder="是否加入题库"
:disabled="editDisabled" />
</div>
</template>
</a-card>
</div>
<!-- 判断题 -->
<div style="width: 100%"
v-else-if="(item.wjType == 3 || item.wjType == '3') && (item.wjSubtype == 305 || item.wjSubtype == '305')">
<a-card>
<template #title>
<div>
<a-row>
<a-col :span="11">
<span>{{ index + 1 }}、<span style="color: #c2bfbf">[判断题]</span></span>
</a-col>
<a-col :span="13" style="text-align: right;">
<a-tooltip placement="topLeft" title="题目分数" v-if="isShow">
<a-select style="width: 120px" v-model:value="item.wjScore" placeholder="请选择分数"
v-if="item.wjSfqh == '0'" :disabled="editDisabled">
<a-select-option :value="item" v-for="(item) in scoreData">{{item}}</a-select-option>
</a-select>
</a-tooltip>
<a-tooltip placement="topRight" title="删除此题">
<Icon icon="ant-design:delete-outlined"
style="cursor: pointer; font-size: 20px; margin: 5px"
@click="handleDelTigan(item, index)" v-if="!editDisabled" />
</a-tooltip>
<Icon
v-if="isSmallScreen && !editDisabled"
icon="pixelarticons:chevrons-vertical"
class="drag-handle"
style="cursor: move; font-size: 20px; margin-right: 10px;"
/>
</a-col>
</a-row>
</div>
<JEditor2 placeholder="请填写文件题题干" v-model:value="item.wjTitle" :bordered="false"
:style="{ width: '30rem' }" :auto-size="{ minRows: 1, maxRows: 5 }" :disabled="editDisabled"
v-if="!editDisabled" />
<div v-else v-html="item.wjTitle"></div>
<div style="text-align: right;color: #c2bfbf" v-if="isShow">是否加入题库:
<j-dict-select-tag type='radio' v-model:value="item.sftjtk" dictCode="yn" placeholder="是否加入题库"
:disabled="editDisabled" />
</div>
</template>
<a-row v-if="isShow">
<a-col :span="24" style="color: darkgrey; font-size: 13px"> 注:选中即为正确答案 </a-col>
</a-row>
<a-radio-group v-model:value="item.itemSelected" style="width: 100%" size="default"
:disabled="!isShow">
<div style="width: 100%" v-for="(tmxx, index) in item.wjxWjxxTmxxList" :key="index">
<a-radio :value="tmxx.itemIndex + ``" style="width: 100%">
<a-input placeholder="请填写选项" v-model:value="tmxx.itemTitle" :style="{ width: '30rem' }"
:bordered="false" :disabled="editDisabled" />
<span style="color: #ecb646" v-if="item.itemSelected == tmxx.itemIndex">(正确答案)</span>
<a-tooltip placement="topLeft" title="在下方添加新的选项">
<Icon icon="ant-design:plus-circle-outlined"
style="cursor: pointer; margin: 5px; font-size: 20px; color: #1890ff"
@click="handleAddTmxx(tmxx, index, item.wjxWjxxTmxxList)" v-if="!editDisabled" />
</a-tooltip>
<a-tooltip placement="topLeft" title="删除选项">
<Icon icon="ant-design:minus-circle-outlined"
style="cursor: pointer; margin: 5px; font-size: 20px; color: #1890ff"
@click="handleRemTmxx(tmxx, index, item.wjxWjxxTmxxList)" v-if="!editDisabled" />
</a-tooltip>
</a-radio>
</div>
</a-radio-group>
</a-card>
</div>
<!-- 简答题 -->
<div style="width: 100%"
v-else-if="(item.wjType == 5 || item.wjType == '5') && (item.wjSubtype == 5 || item.wjSubtype == '5')">
<a-card>
<template #title>
<div>
<a-row>
<a-col :span="11">
<span>{{ index + 1 }}、<span style="color: #c2bfbf">[简答题]</span></span>
</a-col>
<a-col :span="13" style="text-align: right;">
<a-tooltip placement="topLeft" title="题目分数" v-if="isShow">
<a-select style="width: 120px" v-model:value="item.wjScore" placeholder="请选择分数"
v-if="item.wjSfqh == '0'" :disabled="editDisabled">
<a-select-option :value="item" v-for="(item) in scoreData">{{item}}</a-select-option>
</a-select>
</a-tooltip>
<a-tooltip placement="topRight" title="删除此题">
<Icon icon="ant-design:delete-outlined"
style="cursor: pointer; font-size: 20px; margin: 5px"
@click="handleDelTigan(item, index)" v-if="!editDisabled" />
</a-tooltip>
<Icon
v-if="isSmallScreen && !editDisabled"
icon="pixelarticons:chevrons-vertical"
class="drag-handle"
style="cursor: move; font-size: 20px; margin-right: 10px;"
/>
</a-col>
</a-row>
</div>
<JEditor2 placeholder="请填写简答题题干" v-model:value="item.wjTitle" :bordered="false"
:style="{ width: '30rem' }" :auto-size="{ minRows: 1, maxRows: 5 }" :disabled="editDisabled"
v-if="!editDisabled" />
<div v-else v-html="item.wjTitle"></div>
<div style="text-align: right;color: #c2bfbf" v-if="isShow">是否加入题库:
<j-dict-select-tag type='radio' v-model:value="item.sftjtk" dictCode="yn" placeholder="是否加入题库"
:disabled="editDisabled" />
</div>
</template>
</a-card>
</div>
<div v-else> 无对应类型 </div>
</div>
</template>
</draggable>
<!-- 题干信息 -->
<div style="width: 100%" v-for="(item, index) in tiganData" :key="index"> </div>
</a-col>
</a-row>
</div>
</a-modal>
<!-- 表单区域 -->
<WjxWjxxTmlbModal @register="registerModal" @success="handleSuccess"></WjxWjxxTmlbModal>
</div>
</template>
<script lang="ts" name="wjxWjxxTmlb-siyou" setup>
import { ref, reactive, watch, computed, unref, onMounted, onUnmounted } from 'vue';
import { BasicTable, useTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { useModal } from '/@/components/Modal';
import { defHttp } from '/@/utils/http/axios';
import WjxWjxxTmlbModal from './components/WjxWjxxTmlbModal.vue';
import { columns, searchFormSchema } from './WjxWjxxTmlb.data';
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl, distinctList } from './WjxWjxxTmlb.api';
import { downloadFile } from '/@/utils/common/renderUtils';
import { JInput, JDictSelectTag } from '/@/components/Form';
import { useUserStore } from '/@/store/modules/user';
import { useMessage } from '/@/hooks/web/useMessage';
import { useGlobSetting } from '/@/hooks/setting';
import { downloadByUrl } from '/@/utils/file/download';
import draggable from 'vuedraggable';
import JEditor from '/@/components/Form/src/jeecg/components/JEditor.vue';
import JEditor2 from '/@/components/Form/src/jeecg/components/JEditor2.vue';
//用户相关
const userStore = useUserStore();
const checkedKeys = ref<Array<string | number>>([]);
const importOpen = ref<boolean>(false);
const addOpen = ref<boolean>(false);
const glob = useGlobSetting();
// 定义一个响应式的宽度
const width = ref('80%');
const tiganData = ref<any>([]);
const isShow = ref<boolean>(true);
const mainId = ref<string>('');
const wjLeixing = ref<string>('6');
const editDisabled = ref<boolean>(false);
// const wjLeixing = ref<string>('');
//注册model
const [registerModal, { openModal }] = useModal();
const { createConfirm, createMessage, createWarningModal } = useMessage();
const scoreData = [
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,60,70,80,90,100
]
//注册table数据
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
tableProps: {
// title: '题目信息',
api: distinctList,
columns,
canResize: false,
useSearchForm: false,
actionColumn: {
width: 320,
},
beforeFetch: (params) => {
(params.column = 'id'), (params.order = 'desc'); //新生成的默认不带排序
return Object.assign(params, queryParam.value);
},
},
exportConfig: {
name: '题目信息',
url: getExportUrl,
},
importConfig: {
url: getImportUrl,
success: handleSuccess,
},
});
const [registerTable, { reload }, { rowSelection, selectedRowKeys }] = tableContext;
const props = defineProps({
wjLeixing: { type: String },
});
//监听条件变化
watch(
() => props.wjLeixing,
async (newRow, oldRow) => {
console.log(`🚀 ~ watch ~ newRow, oldRow:`, newRow, oldRow);
queryParam.value.wjLeixing = newRow;
},
{ deep: true }
);
function handleOk() {
const data = tiganData.value;
console.log('🧝‍♀️', data);
defHttp.post({ url: '/wjxWjxxTmlb/wjxWjxxTmlb/addNew', params: {addList:data} }).then((res) => {
console.log('👞', res);
addOpen.value = false;
searchQuery();
});
}
function handleChecked(record) {
record = record + '';
}
/**
* 拖动结束事件
* @param evt
*/
function end(evt) {
for (var i = 0; i < tiganData.value.length; i++) {
tiganData.value[i].wjIndex = i + 1;
}
}
function cheGrp(a, b) {
var retChe = false;
if (a) {
for (var i = 0; i < a.length; i++) {
if (a[i] == b) {
retChe = true;
break;
}
}
}
return retChe;
}
//添加选项
function handleAddTmxx(record, index, list) {
var itemIndex = 0;
for (var i = 0; i < list.length; i++) {
var lssx = list[i].itemIndex;
if (itemIndex < parseInt(lssx)) {
itemIndex = lssx;
}
}
list.push({ itemTitle: null, itemIndex: parseInt(itemIndex) + 1 });
}
//删除选项
function handleRemTmxx(record, index, list) {
if (list.length <= 2) {
createMessage.error('至少保留两个选项');
} else {
list.splice(index, 1);
}
}
//计算输入框宽度
function handinpwei(value) {
if (!value) {
return '20rem';
} else {
if (String(value).length * 1.1 < 20) {
return '20rem';
} else if (String(value).length * 1.1 > 60) {
return '60rem';
} else {
return String(value).length * 1.1 + 'rem';
}
}
}
//切换题目分数类型
function handleQiehuan(record, type) {
console.log(`🚀 ~ handleQiehuan ~ type:`, type);
console.log(`🚀 ~ handleQiehuan ~ record:`, record);
record.wjSfqh = type;
}
//删除题目
function handleDelTigan(record, index) {
tiganData.value.splice(index, 1);
for (var i = 0; i < tiganData.value.length; i++) {
tiganData.value[i].wjIndex = i + 1;
}
}
//添加单选题
function addTigan(type) {
var list = tiganData.value;
//单选题
if (type == 3) {
var chk = '';
if (isShow.value) {
chk = '1';
}
let params = {
wjType: parseInt(type),
wjIndex: list.length + 1,
mainId: mainId,
wjTitle: null,
wjScore: null,
wjLeixing,
itemSelected: chk,
wjSfqh: '0',
sftjtk: '1',
wjxWjxxTmxxList: [
{ itemTitle: null, itemIndex: '1' },
{ itemTitle: null, itemIndex: '2' },
],
};
console.log('💇‍♀️', params);
list.push(params);
console.log('👩‍🔬', list);
tiganData.value = [...list];
//多选题
} else if (type == 4) {
let chk = '';
if (isShow.value) {
chk = '1,2';
}
let params = {
wjType: parseInt(type),
wjIndex: list.length + 1,
mainId: mainId,
wjTitle: null,
wjScore: null,
wjLeixing,
itemSelected: chk,
wjSfqh: '0',
sftjtk: '1',
wjxWjxxTmxxList: [
{ itemTitle: null, itemIndex: '1' },
{ itemTitle: null, itemIndex: '2' },
],
};
list.push(params);
tiganData.value = [...list];
//填空题
} else if (type == 5) {
let params = {
wjType: parseInt(type),
wjSubtype: null,
wjIndex: list.length + 1,
mainId: mainId,
wjTitle: null,
wjScore: null,
wjLeixing,
wjAnswer: null,
wjSfqh: '0',
sftjtk: '1',
};
list.push(params);
tiganData.value = [...list];
//文件题
} else if (type == 8) {
var chk = '';
if (isShow.value) {
chk = '1';
}
let params = {
wjType: parseInt(type),
wjIndex: list.length + 1,
mainId: mainId,
wjTitle: null,
wjScore: null,
wjLeixing,
wjSfqh: '0',
sftjtk: '1',
};
list.push(params);
tiganData.value = [...list];
//判断题
}else if (type == 305) {
var chk = '';
if (isShow.value) {
chk = '1';
}
let params = {
wjType: 3,
wjSubtype: 305,
wjIndex: list.length + 1,
mainId: mainId,
wjTitle: null,
wjScore: null,
wjLeixing,
itemSelected: chk,
wjSfqh: '0',
sftjtk: '1',
wjxWjxxTmxxList: [
{ itemTitle: '对', itemIndex: '1' },
{ itemTitle: '错', itemIndex: '2' },
],
};
list.push(params);
tiganData.value = [...list];
} else if (type == 502) {
let params = {
wjType: 5,
wjSubtype: 5,
wjIndex: list.length + 1,
mainId: mainId,
wjTitle: null,
wjScore: null,
wjLeixing,
wjAnswer: null,
wjSfqh: '0',
sftjtk: '1',
};
list.push(params);
tiganData.value = [...list];
//文件题
}
}
/**
* 导入xls
* @param data 导入的数据
* @param url
*/
async function importXls(data, url) {
// url = '/wjxWjxxTmlb/wjxWjxxTmlb/importTmlbExcel?mainId=1234';
url = '/wjxWjxxTmlb/wjxWjxxTmlb/importTmlbExcel';
const isReturn = (fileInfo) => {
try {
if (fileInfo.code === 201) {
let {
message,
result: { msg, fileUrl, fileName },
} = fileInfo;
let href = glob.uploadUrl + fileUrl;
createWarningModal({
title: message,
centered: false,
content: `<div>
<span>${msg}</span><br/>
<span>具体详情请<a href = ${href} download = ${fileName}> 点击下载 </a> </span>
</div>`,
});
//update-begin---author:wangshuai ---date:20221121 for[VUEN-2827]导入无权限,提示图标错误------------
} else if (fileInfo.code === 500 || fileInfo.code === 510) {
createMessage.error(fileInfo.message || `${data.file.name} 导入失败`);
//update-end---author:wangshuai ---date:20221121 for[VUEN-2827]导入无权限,提示图标错误------------
} else {
createWarningModal({
centered: false,
content: `<div>
<span>${fileInfo.message}</span><br/>
</div>`,
});
}
} catch (error) {
console.log('导入的数据异常', error);
} finally {
}
};
await defHttp.uploadFile({ url }, { file: data.file }, { success: isReturn });
}
/**
* 编辑事件
*/
function handleEdit(record: Recordable, wjSytype) {
defHttp.post({ url: '/wjxWjxxTmlb/wjxWjxxTmlb/editSwgysy', params: { id: record.id, wjSytype } }).then((res) => {
reload();
});
}
/**
* 详情
*/
function handleDetail(record: Recordable) {
// 添加自定义类名
openModal(true, {
record,
isUpdate: true,
showFooter: false,
className: 'custom-modal-detail', // 添加自定义类名
});
}
/**
* 详情
*/
function handleEdit2(record: Recordable) {
openModal(true, {
record,
isUpdate: true,
showFooter: true,
});
}
/**
* 成功回调
*/
function handleSuccess() {
(selectedRowKeys.value = []) && reload();
}
/**
* 删除事件
*/
async function handleDelete(record) {
await deleteOne({ id: record.id }, handleSuccess);
}
/**
* 移出题库
*/
function handleYctk(record){
console.log("🚀 ~ handleYctk ~ record:", record)
defHttp.post({url:'/wjxWjxxTmlb/wjxWjxxTmlb/yctk',params:{wjTitle:record.wjTitle,createBy:record.createBy}}).then(res=>{
console.log('res--->',res);
reload();
})
}
/**
* 操作栏
*/
function getTableAction(record) {
return [
{
label: '设为私有',
onClick: handleEdit.bind(null, record, '0'),
ifShow:record.wjSytype == '1'
},
{
label: '设为公有',
onClick: handleEdit.bind(null, record, '1'),
ifShow:record.wjSytype == '0'
},
{
label: '详情',
onClick: handleDetail.bind(null, record),
},
{
label: '删除',
onClick: handleDelete.bind(null, record),
ifShow: (record.mainId == '' || record.mainId == null),
},
{
label: '移出题库',
onClick: handleYctk.bind(null, record),
},
{
label: '修改',
onClick: handleEdit2.bind(null, record),
ifShow: (record.mainId == '' || record.mainId == null),
},
{
label: '已使用不能修改',
ifShow: (record.mainId != '' && record.mainId != null),
disabled: true,
},
];
// if (record.wjSytype == '0') {
// return [
// {
// label: '设为公有',
// onClick: handleEdit.bind(null, record, '1'),
// },
// {
// label: '详情',
// onClick: handleDetail.bind(null, record),
// ifShow: (record.mainId == '' || record.mainId == null),
// },
// {
// label: '详情',
// onClick: handleDetail.bind(null, record),
// ifShow: (record.mainId == '' || record.mainId == null),
// },
// ];
// } else {
// return [
// {
// label: '设为私有',
// onClick: handleEdit.bind(null, record, '0'),
// },
// {
// label: '详情',
// onClick: handleDetail.bind(null, record),
// },
// ];
// }
}
/* ----------------------以下为原生查询需要添加的-------------------------- */
const queryParam = ref<any>({});
const toggleSearchStatus = ref<boolean>(false);
const labelCol = reactive({
xs: { span: 24 },
sm: { span: 7 },
});
const wrapperCol = reactive({
xs: { span: 24 },
sm: { span: 16 },
});
/**
* 查询
*/
function searchQuery() {
reload();
}
/**
* 重置
*/
function searchReset() {
queryParam.value = {};
selectedRowKeys.value = [];
//刷新数据
reload();
}
// 计算属性来决定实际使用的宽度
const computedWidth = computed(() => {
return isSmallScreen.value ? '90%' : width.value;
});
// 响应式地检查是否是小屏幕
const isSmallScreen = ref(false);
// 更新 isSmallScreen 的函数
const updateScreenWidth = () => {
isSmallScreen.value = window.innerWidth < 600; // 你可以调整这个断点
};
onUnmounted(() => {
window.removeEventListener('resize', updateScreenWidth);
});
onMounted(() => {
// 监听窗口大小变化
window.addEventListener('resize', updateScreenWidth);
// 初始化时也调用一次
updateScreenWidth();
// wjLeixing.value = "1";
// console.log(`🚀 ~ onMounted ~ wjLeixing:`, wjLeixing)
// queryParam.value.wjLeixing = wjLeixing;
queryParam.value.createBy = userStore.getUserInfo.username;
queryParam.value.sftjtk = "1";
reload();
});
</script>
<style lang="less" scoped>
@media (max-width: 768px) {
.sdtj-div {
padding: 0;
margin: 0;
}
}
@media (min-width: 769px) {
.sdtj-div {
padding: 20px;
margin: 20px;
}
}
.jeecg-basic-table-form-container {
.table-page-search-submitButtons {
display: block;
margin-bottom: 24px;
white-space: nowrap;
}
.query-group-cust {
width: calc(50% - 15px);
min-width: 100px !important;
}
.query-group-split-cust {
width: 30px;
display: inline-block;
text-align: center;
}
}
/deep/.ant-card-head-title {
padding:0px;
}
.custom-modal-detail .ant-card-head-title {
white-space: normal !important; /* 覆盖原有的 white-space: nowrap */
}
</style>