Files
fe-manage/src/components/CreatedCourse/chooseFileList.vue
陈昱达 feb5453eb0 fix(upload): 统一使用$message提示并优化文件校验逻辑
- 移除重复引入的ElMessage组件
- 使用$message.error替换ElMessage错误提示
- 添加文件上传前的console.log调试信息
- 优化文件格式和大小校验的提示逻辑
- 在dragTable.vue中使用ElInput组件替换原生input
- 优化HomeWorkComp.vue中附件显示条件判断

chore(style): 统一element-plus弹窗样式

- 为el-dialog和el-message-box添加圆角样式
- 调整消息框标题和内容的字体样式
- 优化按钮样式和间距布局
- 规范化弹窗内部元素的显示效果
2025-12-12 16:19:37 +08:00

368 lines
8.2 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.
<script setup>
import { reactive, onMounted, ref, h } from "vue";
import { ElButton, ElInput, ElUpload } from "element-plus";
import { $message } from "@/utils/useMessage";
import BasicTable from "@/components/BasicElTable/BasicTable.vue";
import {
getPageListByType,
getType,
getMapsItem,
getPaperList,
} from "@/hooks/useCreateCourseMaps";
import apiCourseFile from "@/api/modules/courseFile";
import { useRoute } from "vue-router";
import Cookies from "vue-cookies";
const route = useRoute();
const props = defineProps({
resType: {
type: Number,
default: "",
},
});
// 响应式数据
const tableData = ref([]);
const loading = ref(false);
const fileList = ref([]);
// 表单数据
const form = reactive({
name: "",
resType: props.resType,
});
// 分页配置
const pagination = reactive({
pageSize: 10,
current: 1,
total: 0,
});
// 视频表单数据
const dialogVideoForm = reactive({
name: "",
isDrag: false,
completeSetup: 0,
setupTage: "",
});
// 上传配置
const uploadData = reactive({
headers: {
"XBOE-Access-Token": Cookies.get("token"),
},
data: {
dir: "course",
},
actionUrl: process.env.VUE_APP_SYS_API + "/xboe/sys/xuploader/file/upload",
});
// 表格列配置
const columns = [
{
title: "序号",
render: (params) => {
return h("span", {}, params.index + 1);
},
},
{
title: "名称",
key: "name",
dataIndex: "name",
},
{
title: "创建人",
key: "sysCreateBy",
dataIndex: "sysCreateBy",
},
{
title: "创建时间",
key: "sysCreateTime",
dataIndex: "sysCreateTime",
},
{
title: "操作",
key: "action",
dataIndex: "action",
width: 150,
render: (params) => {
return h("div", [
h(
ElButton,
{
type: "primary",
size: "small",
style: {
display: [40, 50, 62].includes(props.resType) ? "" : "none",
},
onClick: () => {
handlePreviewItem(params.row);
},
},
"预览"
),
h(
ElButton,
{
type: "primary",
size: "small",
onClick: () => {
handleChooseItem(params.row);
},
},
"选择"
),
]);
},
},
];
// 事件发射
const emit = defineEmits(["chooseItem", "choosePreviewItem", "chooseCusExam"]);
// 处理选择项目
const handleChooseItem = (row) => {
switch (props.resType) {
case 61:
console.log(row);
if (row.counts === 0) {
$message.error("此试卷无试题内容,请重新选择");
return;
}
break;
default:
// emit("chooseItem", {
// ...row,
// isDrag: false,
// completeSetup: 0,
// setupTage: "",
// resType: props.resType,
// dir: props.resType === 50 ? "scorm" : "course",
// });
break;
}
let obj = {
...row,
isDrag: false,
completeSetup: 0,
setupTage: "",
resType: props.resType,
dir: props.resType === 50 ? "scorm" : "course",
};
if (props.resType === 61) {
obj.paperType = 2;
}
emit("chooseItem", obj);
};
const handlePreviewItem = (row) => {
emit("choosePreviewItem", {
...row,
isDrag: false,
completeSetup: 0,
setupTage: "",
resType: props.resType,
dir: props.resType === 50 ? "scorm" : "course",
});
};
// 分页改变处理
const changePagination = (PAGINATION) => {
Object.assign(pagination, PAGINATION);
getCourseList();
};
// 获取视频列表
const getCourseList = () => {
loading.value = true;
let paramsData = {};
switch (props.resType) {
// 考试
case 61:
paramsData = {
keyWord: form.name,
pageSize: pagination.pageSize,
pageIndex: pagination.current,
};
getPaperList(paramsData).then((res) => {
loading.value = false;
tableData.value = res.result.list.map((item) => {
return {
...item,
name: item.testName,
};
});
pagination.total = res.result.count;
});
break;
default:
// 非考试列表
paramsData = {
...form,
pageSize: pagination.pageSize,
pageIndex: pagination.current,
self: true,
};
getPageListByType(paramsData).then((res) => {
loading.value = false;
tableData.value = res.result.list;
pagination.total = res.result.count;
});
break;
}
};
// 上传成功处理
const handleUploadSuccess = (res, file) => {
if (res.status === 200) {
// 上传到课件库
const routeQuery = route.query;
const courseWare = {
fileName: res.result.displayName,
fileType: res.result.fileType,
filePath: res.result.filePath,
resType: props.resType,
orgId: routeQuery.orgId,
orgName: routeQuery.orgName,
duration: routeQuery.duration,
remark: "课程中直接上传",
};
apiCourseFile.saveUpload(courseWare).then((rs) => {
if (rs.status === 200) {
emit("chooseItem", {
...dialogVideoForm,
name: res.result.displayName,
resType: props.resType,
...rs.result,
});
fileList.value = [];
} else {
$message.error(rs.message);
}
});
}
};
// 上传前处理
const handleBeforeUpload = (file) => {
console.log(file);
const { fileType, name, uploadSize, uploadSizeName } = getMapsItem(
props.resType
);
if (file.name.lastIndexOf(".") === -1) {
$message.error(`文件格式不正确!`);
return false;
}
let fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
fileExtension = fileExtension.toLowerCase();
// 校检文件类型
if (fileType.join(",").indexOf(fileExtension) === -1) {
$message.error(`文件格式不正确, 请上传正确格式的${name}文件!`);
return false;
}
// 校检文件大小
if (uploadSize) {
const isLt = file.size / 1024 / 1024 < uploadSize;
if (!isLt) {
$message.error(`上传文件大小不能超过 ${uploadSizeName} !`);
return false;
}
}
if (props.resType === 50) {
dialogVideoForm.dir = "scorm";
} else {
dialogVideoForm.dir = "course";
}
return true;
};
const openCusExam = () => {
emit("chooseCusExam", {
resType: props.resType,
dir: props.resType === 50 ? "scorm" : "course",
paperType: 1,
name: "自定义考试",
});
};
// 生命周期
onMounted(() => {
getCourseList();
});
</script>
<template>
<div class="add-video">
<div class="add-vide-header">
<div style="display: flex; align-items: center">
<el-upload
:action="uploadData.actionUrl"
:headers="uploadData.headers"
:data="uploadData.data"
:on-success="handleUploadSuccess"
:file-list="fileList"
:before-upload="handleBeforeUpload"
>
<el-button
v-if="[10, 20, 40, 50].includes(props.resType)"
type="primary"
>上传新{{ getType(props.resType) }}</el-button
>
</el-upload>
<el-button
v-if="[61].includes(props.resType)"
type="primary"
@click="openCusExam"
>自定义考试</el-button
>
<span class="desc ml10" v-if="![61].includes(props.resType)"
>文件大小限制{{
getMapsItem(props.resType).uploadSizeName
}},支持的文件类型:{{ getMapsItem(props.resType).fileType.join(",") }}
</span>
</div>
<div>
<el-input
style="width: 150px"
:placeholder="`请输入${getType(props.resType)}名称`"
v-model="form.name"
clearable
></el-input>
<el-button class="ml10" @click="getCourseList" type="primary"
>查询</el-button
>
</div>
</div>
<div class="mt10">
<BasicTable
:columns="columns"
:data="tableData"
:pagination="pagination"
@changePage="changePagination"
:loading="loading"
></BasicTable>
</div>
</div>
</template>
<style scoped lang="scss">
.add-video {
.add-vide-header {
display: flex;
justify-content: space-between;
.desc {
font-size: 12px;
color: #999;
}
}
}
</style>