添加导入导出功能

This commit is contained in:
yangjun 2024-09-23 13:31:31 +08:00
parent 9cf96035d8
commit 88fdde0cd4
8 changed files with 232 additions and 13 deletions

BIN
public/downPath/stdrmb.xls Normal file

Binary file not shown.

View File

@ -1,6 +1,6 @@
<template>
<BasicModal v-bind="$attrs" @register="registerModal" :title="title" :width="800" @ok="handleSubmit">
<bl-teacher-main-form ref="formComponent" :formDisabled="formDisabled" :formBpm="false" @success="submitSuccess"></bl-teacher-main-form>
<BlTeacherMainForm ref="formComponent" :formDisabled="formDisabled" :formBpm="false" @success="submitSuccess"></BlTeacherMainForm>
</BasicModal>
</template>

View File

@ -170,6 +170,11 @@
>填空</a-button
></p
>
<!-- <p
><a-button type="primary" preIcon="ant-design:check-square-outlined" @click="addTigan(8)" :disabled="editDisabled"
>文件</a-button
></p
> -->
</a-card>
<a-card title="引用题库">
<p><a-button type="primary" @click="handleYylx('0')" :disabled="editDisabled">我的题库</a-button></p>
@ -181,7 +186,7 @@
<template #item="{ index, element: item }">
<div>
<!-- 单选题 -->
<div style="width: 100%" v-if="item.wjType == 3">
<div style="width: 100%" v-if="item.wjType == 3 || item.wjType == '3'">
<a-card>
<template #title>
<span>{{ index + 1 }}</span>
@ -265,7 +270,7 @@
</a-card>
</div>
<!-- 多选题 -->
<div style="width: 100%" v-else-if="item.wjType == 4">
<div style="width: 100%" v-else-if="item.wjType == 4 || item.wjType == '4'">
<a-card>
<template #title>
<span>{{ index + 1 }}</span
@ -351,7 +356,7 @@
</a-card>
</div>
<!-- 填空题 -->
<div style="width: 100%" v-else-if="item.wjType == 5">
<div style="width: 100%" v-else-if="item.wjType == 5 || item.wjType == '5'">
<a-card>
<template #title>
<span>{{ index + 1 }}</span
@ -415,7 +420,63 @@
</a-row>
</a-card>
</div>
<div v-else> 无对应类型 </div>
<!-- 文件上传 -->
<div style="width: 100%" v-else-if="item.wjType == 8 || item.wjType == '8'">
<a-card>
<template #title>
<span>{{ index + 1 }}</span>
<a-textarea
placeholder="请填写文件上传题题干"
v-model:value="item.wjTitle"
:bordered="false"
:style="{ width: handinpwei(item.wjTitle) }"
:auto-size="{ minRows: 1, maxRows: 5 }"
:disabled="editDisabled"
/>
<span style="color: #c2bfbf">[文件上传]</span>
</template>
<template #extra>
<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="5">5</a-select-option>
<a-select-option value="4">4</a-select-option>
<a-select-option value="3">3</a-select-option>
<a-select-option value="2">2</a-select-option>
<a-select-option value="1">1</a-select-option>
</a-select>
<span v-if="item.wjSfqh == '0'" @click="handleQiehuan(item, '1')" style="color: #9e9e9e" :disabled="editDisabled"
>自定义分数</span
>
<a-input-number
v-model:value="item.wjScore"
style="width: 120px"
v-if="item.wjSfqh == '1'"
:disabled="editDisabled"
></a-input-number>
<span v-if="item.wjSfqh == '1'" @click="handleQiehuan(item, '0')" style="color: #9e9e9e" :disabled="editDisabled"
>返回</span
>
</a-tooltip>
<a-tooltip placement="topRight" title="删除此题"
><Icon
icon="ant-design:delete-outlined"
style="cursor: pointer; font-size: 20px; margin: 10px"
@click="handleDelTigan(item, index)"
v-if="!editDisabled"
/></a-tooltip>
</template>
</a-card>
</div>
<div v-else> 无对应类型 -{{item.wjType}}- </div>
</div>
</template>
</draggable>
@ -567,7 +628,13 @@
<a-col :span="24" style="text-align: right; margin-top: 5px">
<a-button type="primary" @click="handleSzzycs(1)"><Icon icon="ant-design:edit-outlined" />修改课程测验次数</a-button>
<a-divider type="vertical" />
<a-button type="primary" @click="handleAddOne" class="mar-right20"><Icon icon="ant-design:file-add-outlined" />新增测验</a-button>
<a-button type="primary" @click="handleAddOne"><Icon icon="ant-design:file-add-outlined" />新增测验</a-button>
<!-- <a-divider type="vertical" />
<a-button type="primary" @click="handleTiku('6')" style="margin-left: 8px">题库</a-button>
<a-divider type="vertical" />
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="importXls">导入试题</j-upload-button>
<a-divider type="vertical" />
<a-button type="primary" @click="downloadByUrl({url:'/downPath/stdrmb.xls',target: '_self',fileName:'试题导入模板.xls'})" class="mar-right20"><Icon icon="ant-design:file-add-outlined" />下载试题模板</a-button> -->
</a-col>
<a-col :span="24">
<a-row style="padding: 10px">
@ -840,6 +907,7 @@
<YinyongTikuListModal ref="YinyongTikuListModalpage" @success="handleYytkSuccess" />
<YinyongTikuDcListModal ref="YinyongTikuDcListModalpage" @success="handleYytkSuccess" />
<TikuListModal ref="TikuListModalPage"></TikuListModal>
</div>
</template>
@ -863,15 +931,28 @@ import XxhbbksListModal from '/@/views/kc/xxhbbks/XxhbbksListModal.vue';
import KcTeachingUnitContentOneListModal from '/@/views/zy/zyInfo/zyCheckZcjc/KcTeachingUnitContentOneListModal.vue';
import YinyongTikuListModal from '/@/views/kc/wjxWjxxTmlb/YinyongTikuListModal.vue';
import YinyongTikuDcListModal from '/@/views/kc/wjxWjxxTmlb/YinyongTikuDcListModal.vue';
import TikuListModal from '/@/views/kc/wjxWjxxTmlb/TikuListModal.vue';
import { create } from 'sortablejs';
import { downloadByUrl } from '/@/utils/file/download';
const glob = useGlobSetting();
const globSetting = useGlobSetting();
/**
* 导出文件xlsx的mime-type
*/
const XLSX_MIME_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
/**
* 导出文件xlsx的文件后缀
*/
const XLSX_FILE_SUFFIX = '.xlsx';
//
const { currentRoute } = useRouter();
const { query } = unref(currentRoute);
const { rwbh, xqxn, type, teano } = query; //
const { createConfirm, createMessage } = useMessage();
const { createConfirm, createMessage,createWarningModal } = useMessage();
//
const userStore = useUserStore();
const XxhbbksListModalPage = ref();
@ -879,6 +960,7 @@ const WjxWjxxTmlbDjjgsModalPage = ref();
const registerZcjcModal = ref();
const YinyongTikuListModalpage = ref();
const YinyongTikuDcListModalpage = ref();
const TikuListModalPage = ref();
const showType = ref<number>(0);
const zycs = ref<number>(0);
@ -953,6 +1035,92 @@ function handleViewEwm(record) {
ewmInfo.value = record;
}
//61
function handleTiku(wjLeixing){
var record = {wjLeixing}
TikuListModalPage.value.disableSubmit = true;
TikuListModalPage.value.init(record);
}
async function exportTmlbXls(isXlsx = false) {
var name = "问卷导入模板";var url = "/wjxWjxxTmlb/wjxWjxxTmlb/exportDownXls"; var params ={title: '-1'} ;
const data = await defHttp.get({ url: url, params: params, responseType: 'blob', timeout: 9000000 }, { isTransformResponse: false });
if (!data) {
createMessage.warning('文件下载失败');
return;
}
if (!name || typeof name != 'string') {
name = '导出文件';
}
let blobOptions = { type: 'application/vnd.ms-excel' };
let fileSuffix = '.xls';
if (isXlsx === true) {
blobOptions['type'] = XLSX_MIME_TYPE;
fileSuffix = XLSX_FILE_SUFFIX;
}
if (typeof window.navigator.msSaveBlob !== 'undefined') {
window.navigator.msSaveBlob(new Blob([data], blobOptions), name + fileSuffix);
} else {
let url = window.URL.createObjectURL(new Blob([data], blobOptions));
let link = document.createElement('a');
link.style.display = 'none';
link.href = url;
link.setAttribute('download', name + fileSuffix);
document.body.appendChild(link);
link.click();
document.body.removeChild(link); //
window.URL.revokeObjectURL(url); //blob
}
}
/**
* 导入xls
* @param data 导入的数据
* @param url
*/
async function importXls(data, url) {
url = "/wjxWjxxTmlb/wjxWjxxTmlb/importExcel";
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 handleTeaDtjg(item) {
console.log('🧳', item);
@ -1253,6 +1421,22 @@ function addTigan(type) {
};
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',
};
list.push(params);
tiganData.value = [...list];
}
}
@ -1543,7 +1727,7 @@ async function submitForm() {
}
var wjType = param.wjType;
if (wjType != 5) {
if (wjType == 3 && wjType == 4) {
var itemlist = param.wjxWjxxTmxxList;
for (let j = 0; j < itemlist.length; j++) {
if (!itemlist[j].itemTitle) {
@ -1563,7 +1747,9 @@ async function submitForm() {
return;
}
}
} else {
}else if(wjType == 8){
} else if(wjType == 6) {
if (isShow.value) {
var wjAnswer = values[i].wjAnswer;
if (!wjAnswer || wjAnswer == 'NaN' || wjAnswer == 'undefined') {
@ -2008,4 +2194,12 @@ onMounted(() => {
margin-left: 10px;
font-size: 12px;
}
/deep/.ant-card-head-title {
display: inline-block;
flex: 1;
padding: 16px 0;
overflow: hidden;
white-space: nowrap;
text-overflow: clip;
}
</style>

View File

@ -11,6 +11,8 @@ enum Api {
deleteBatch = '/wjxWjxx/wjxWjxx/deleteBatch',
importExcel = '/wjxWjxx/wjxWjxx/importExcel',
exportXls = '/wjxWjxx/wjxWjxx/exportXls',
exportTmlbXls = '/wjxWjxxTmlb/wjxWjxxTmlb/exportXls',
}
/**
@ -18,6 +20,7 @@ enum Api {
* @param params
*/
export const getExportUrl = Api.exportXls;
export const exportTmlbXls = Api.exportTmlbXls;
/**
* api

View File

@ -59,7 +59,7 @@
</a-checkbox-group>
</a-card>
</div>
<!-- 多选-->
<!-- 填空-->
<div style="width: 100%" v-else-if="item.wjType == 5">
<div style="text-align: left; width: 100%; font-weight: bold; line-height: 80px; font-size: 18px">填空题</div>
<a-card>
@ -85,6 +85,26 @@
</a-row>
</a-card>
</div>
<!-- 填空题 -->
<div style="width: 100%" v-else-if="item.wjType == 8">
<div style="text-align: left; width: 100%; font-weight: bold; line-height: 80px; font-size: 18px">文件上传</div>
<a-card>
<template #title>
<span>{{ index + 1 }}</span
><span v-html="item.wjTitle" style="font-weight: bold; white-space: pre-wrap; word-wrap: break-word" />
</template>
<template #extra>
<span style="margin-left: 40px" v-if="isShow"
>题目分值 <span class="answer-word">{{ item.wjScore }}</span> </span
>
</template>
<a-row>
<a-col :span="24">
<j-upload v-model:value="item.wjAnswer" :disabled="disabled" ></j-upload>
</a-col>
</a-row>
</a-card>
</div>
<div v-else> 无对应类型 </div>
</div>
</a-col>
@ -151,6 +171,7 @@ import { defHttp } from '/@/utils/http/axios';
import { queryWjxWjxxTmxxListByMainId, queryDataById, saveOrUpdate, djtj } from '/@/views/kc/wjxWjxxTmlb/WjxWjxxTmlb.api';
import headerPage from '/@/views/site/common/header.vue';
import footerPage from '/@/views/site/common/footer.vue';
import JUpload from '/@/components/Form/src/jeecg/components/JUpload/JUpload.vue';
const title = ref<string>('');
const content = ref<string>('');
@ -213,7 +234,6 @@ function edit(record, isDisabled, type, flag) {
//
async function submitForm() {
const data = tiganData.value;
// console.log(`🚀 ~ submitForm ~ data:`, data)
const values = Object.assign([], data);
for (let i = 0; i < values.length; i++) {
let param = values[i];

View File

@ -90,6 +90,7 @@
fixed:'right'
},
beforeFetch: (params) => {
params.column = 'id',params.order = 'desc';//
return Object.assign(params, queryParam.value);
},
},

View File

@ -93,6 +93,7 @@
fixed:'right'
},
beforeFetch: (params) => {
params.column = 'id',params.order = 'desc';//
return Object.assign(params, queryParam.value);
},
},

View File

@ -481,7 +481,7 @@
</a-card>
<a-card
:title="'第' + item.sort + '次作业(占比' + item.score + '%)'"
v-if="item.endTime && item.zyStatus == '1'"
v-if="item.endTime && (item.zyStatus == '1' || item.zyStatus == '2')"
class="cardClass module-bg"
>
<template #extra><span class="card-label">已发布</span> </template>
@ -820,7 +820,7 @@ function handleKcnr() {
function searchQueryZyxq() {
selectedRowKeys.value = [];
queryParam.value.mainId = zyInfo.value.id;
// queryParam.value.mainId = zyInfo.value.id;
queryParam.value.queryType = queryType.value;
reload();
}