forked from integrated_whb/integrated_whb_vue
init
parent
daa59776e3
commit
4bd0189616
|
@ -31,5 +31,6 @@ module.exports = {
|
|||
BMapGL: "readonly",
|
||||
JSEncrypt: "readonly",
|
||||
Aliplayer: "readonly",
|
||||
AliyunUpload: "readonly",
|
||||
}
|
||||
};
|
||||
|
|
|
@ -17,5 +17,8 @@
|
|||
<script type="module" src="/src/main.js"></script>
|
||||
<link rel="stylesheet" href="https://g.alicdn.com/apsara-media-box/imp-web-player/2.16.3/skins/default/aliplayer-min.css" />
|
||||
<script charset="utf-8" type="text/javascript" src="https://g.alicdn.com/apsara-media-box/imp-web-player/2.16.3/aliplayer-min.js"></script>
|
||||
<script src="/aliyun-upload-sdk-1.5.6/lib/es6-promise.min.js"></script>
|
||||
<script src="/aliyun-upload-sdk-1.5.6/lib/aliyun-oss-sdk-6.17.1.min.js"></script>
|
||||
<script src="/aliyun-upload-sdk-1.5.6/aliyun-upload-sdk-1.5.6.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -774,7 +774,7 @@ export default [
|
|||
children: [
|
||||
{
|
||||
path: "",
|
||||
component: "platform_resource_library/courseware/video",
|
||||
component: "platform_resource_library/courseware/video/index",
|
||||
},
|
||||
{
|
||||
path: "/platform_resource_library/courseware/video/view",
|
||||
|
@ -782,7 +782,7 @@ export default [
|
|||
title: "课件习题",
|
||||
activeMenu: "/platform_resource_library/courseware/video",
|
||||
},
|
||||
component: "platform_resource_library/courseware/view",
|
||||
component: "platform_resource_library/courseware/video/view",
|
||||
},
|
||||
],
|
||||
},
|
||||
|
@ -793,7 +793,7 @@ export default [
|
|||
children: [
|
||||
{
|
||||
path: "",
|
||||
component: "platform_resource_library/courseware/data",
|
||||
component: "platform_resource_library/courseware/data/index",
|
||||
},
|
||||
{
|
||||
path: "/platform_resource_library/courseware/data/view",
|
||||
|
@ -801,45 +801,45 @@ export default [
|
|||
title: "课件习题",
|
||||
activeMenu: "/platform_resource_library/courseware/data",
|
||||
},
|
||||
component: "platform_resource_library/courseware/view",
|
||||
component: "platform_resource_library/courseware/data/view",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: "/platform_resource_library/curriculum/list",
|
||||
path: "/platform_resource_library/curriculum",
|
||||
meta: { title: "课程管理", isSubMenu: false },
|
||||
component: "children",
|
||||
children: [
|
||||
{
|
||||
path: "",
|
||||
component: "platform_resource_library/curriculum/list",
|
||||
component: "platform_resource_library/curriculum/index",
|
||||
},
|
||||
{
|
||||
path: "/platform_resource_library/curriculum/view",
|
||||
meta: {
|
||||
title: "查看详情",
|
||||
activeMenu: "/platform_resource_library/curriculum/list",
|
||||
title: "查看",
|
||||
activeMenu: "/platform_resource_library/curriculum",
|
||||
},
|
||||
component: "platform_resource_library/curriculum/view",
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: "/platform_resource_library/paper/list",
|
||||
path: "/platform_resource_library/paper",
|
||||
meta: { title: "试卷管理", isSubMenu: false },
|
||||
component: "children",
|
||||
children: [
|
||||
{
|
||||
path: "",
|
||||
component: "platform_resource_library/paper/list",
|
||||
component: "platform_resource_library/paper/index",
|
||||
},
|
||||
{
|
||||
path: "/platform_resource_library/paper/view",
|
||||
meta: {
|
||||
title: "查看试卷",
|
||||
activeMenu: "/platform_resource_library/paper/list",
|
||||
title: "查看",
|
||||
activeMenu: "/platform_resource_library/paper",
|
||||
},
|
||||
component: "platform_resource_library/paper/view",
|
||||
},
|
||||
|
@ -869,13 +869,12 @@ export default [
|
|||
component: "online_learn_exam/courseware/video/index",
|
||||
},
|
||||
{
|
||||
path: "/online_learn_exam/courseware/video/question_list",
|
||||
path: "/online_learn_exam/courseware/video/exercises",
|
||||
meta: {
|
||||
title: "课件习题",
|
||||
activeMenu: "/online_learn_exam/courseware/video",
|
||||
},
|
||||
component:
|
||||
"online_learn_exam/courseware/question/question_list",
|
||||
component: "online_learn_exam/courseware/video/exercises",
|
||||
},
|
||||
],
|
||||
},
|
||||
|
@ -889,18 +888,36 @@ export default [
|
|||
component: "online_learn_exam/courseware/data/index",
|
||||
},
|
||||
{
|
||||
path: "/online_learn_exam/courseware/data/question_list",
|
||||
path: "/online_learn_exam/courseware/data/exercises",
|
||||
meta: {
|
||||
title: "课件习题",
|
||||
activeMenu: "/online_learn_exam/courseware/data",
|
||||
activeMenu: "/online_learn_exam/courseware/video",
|
||||
},
|
||||
component:
|
||||
"online_learn_exam/courseware/question/question_list",
|
||||
component: "online_learn_exam/courseware/data/exercises",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
path: "/online_learn_exam/curriculum",
|
||||
meta: { title: "课程管理", isSubMenu: false },
|
||||
component: "children",
|
||||
children: [
|
||||
{
|
||||
path: "/online_learn_exam/curriculum",
|
||||
component: "online_learn_exam/curriculum/index",
|
||||
},
|
||||
{
|
||||
path: "/online_learn_exam/curriculum/view",
|
||||
meta: {
|
||||
title: "查看",
|
||||
activeMenu: "/online_learn_exam/curriculum",
|
||||
},
|
||||
component: "online_learn_exam/curriculum/view",
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
|
|
@ -55,6 +55,13 @@ export const layoutFnGetTrainingPlateType = async () => {
|
|||
});
|
||||
return ref(JSON.parse(resData.zTreeNodes));
|
||||
};
|
||||
// 大纲类型
|
||||
export const layoutFnGetOutlineType = async () => {
|
||||
const resData = await getLevels({
|
||||
DICTIONARIES_ID: "3c0d9b5e74834adfacb76139e5d731e5",
|
||||
});
|
||||
return ref(resData.list);
|
||||
};
|
||||
// 管控措施分类1
|
||||
export const layoutFnGetControlMeasures1 = async () => {
|
||||
const resData = await getLevelsByParentId({
|
||||
|
|
|
@ -0,0 +1,74 @@
|
|||
import { setVideo, setVideoRefresh } from "@/request/api.js";
|
||||
|
||||
export default function useAliYunUpload({
|
||||
addFileSuccess,
|
||||
onUploadstarted,
|
||||
onUploadSucceed,
|
||||
onUploadFailed,
|
||||
onUploadCanceled,
|
||||
onUploadProgress,
|
||||
onUploadTokenExpired,
|
||||
onUploadEnd,
|
||||
}) {
|
||||
const uploader = new window.AliyunUpload.Vod({
|
||||
timeout: 60000,
|
||||
partSize: 1048576,
|
||||
parallel: 5,
|
||||
retryCount: 3,
|
||||
retryDuration: 2,
|
||||
region: "cn-shanghai",
|
||||
userId: "1663991162946873",
|
||||
addFileSuccess(uploadInfo) {
|
||||
addFileSuccess && addFileSuccess(uploadInfo);
|
||||
},
|
||||
async onUploadstarted(uploadInfo) {
|
||||
onUploadstarted && onUploadstarted();
|
||||
let uploadAddress;
|
||||
let uploadAuth;
|
||||
let videoId;
|
||||
if (!uploadInfo.videoId) {
|
||||
const resData = await setVideo({
|
||||
Title: uploadInfo.file.name,
|
||||
FileName: uploadInfo.file.name,
|
||||
});
|
||||
uploadAddress = resData.body.uploadAddress;
|
||||
uploadAuth = resData.body.uploadAuth;
|
||||
videoId = resData.body.videoId;
|
||||
} else {
|
||||
const resData = await setVideoRefresh({
|
||||
Title: uploadInfo.file.name,
|
||||
FileName: uploadInfo.file.name,
|
||||
VideoId: uploadInfo.videoId,
|
||||
});
|
||||
uploadAddress = resData.data.uploadAddress;
|
||||
uploadAuth = resData.data.uploadAuth;
|
||||
videoId = resData.data.videoId;
|
||||
}
|
||||
uploader.setUploadAuthAndAddress(
|
||||
uploadInfo,
|
||||
uploadAuth,
|
||||
uploadAddress,
|
||||
videoId
|
||||
);
|
||||
},
|
||||
onUploadSucceed(uploadInfo) {
|
||||
onUploadSucceed && onUploadSucceed(uploadInfo);
|
||||
},
|
||||
onUploadFailed(uploadInfo, code, message) {
|
||||
onUploadFailed && onUploadFailed(uploadInfo, code, message);
|
||||
},
|
||||
onUploadCanceled(uploadInfo, code, message) {
|
||||
onUploadCanceled && onUploadCanceled(uploadInfo, code, message);
|
||||
},
|
||||
onUploadProgress(uploadInfo, totalSize, progress) {
|
||||
onUploadProgress && onUploadProgress(uploadInfo, totalSize, progress);
|
||||
},
|
||||
onUploadTokenExpired(uploadInfo) {
|
||||
onUploadTokenExpired && onUploadTokenExpired(uploadInfo);
|
||||
},
|
||||
onUploadEnd(uploadInfo) {
|
||||
onUploadEnd && onUploadEnd(uploadInfo);
|
||||
},
|
||||
});
|
||||
return uploader;
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
import { getVideoAuth, getVideoSource } from "@/request/api.js";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { ref } from "vue";
|
||||
|
||||
export default async function useAliYunVideoPreview(data) {
|
||||
const src = ref("");
|
||||
const vid = ref("");
|
||||
const playAuth = ref("");
|
||||
const visible = ref(false);
|
||||
src.value = "";
|
||||
vid.value = "";
|
||||
playAuth.value = "";
|
||||
if (data.VIDEOCOURSEWARE_ID_REMOTE) {
|
||||
const resData = await getVideoSource({
|
||||
VIDEOCOURSEWARE_ID: data.VIDEOCOURSEWARE_ID_REMOTE,
|
||||
CURRICULUM_ID: data.CURRICULUM_ID_REMOTE,
|
||||
});
|
||||
const video = {};
|
||||
if (!resData.responseBody) {
|
||||
ElMessage.error("该课件暂无视频资源");
|
||||
return;
|
||||
}
|
||||
resData.responseBody?.videoList?.forEach((item) => {
|
||||
video[item.definition] = item.playURL;
|
||||
});
|
||||
src.value = JSON.stringify(video);
|
||||
visible.value = true;
|
||||
} else {
|
||||
const resData = await getVideoAuth({
|
||||
videoId: data.VIDEOFILES,
|
||||
});
|
||||
playAuth.value = resData.playAuth;
|
||||
vid.value = data.VIDEOFILES;
|
||||
visible.value = true;
|
||||
}
|
||||
return {
|
||||
src,
|
||||
vid,
|
||||
playAuth,
|
||||
visible,
|
||||
};
|
||||
}
|
|
@ -273,7 +273,7 @@ const fnGetData = async () => {
|
|||
data.checkList = resData.checkList;
|
||||
for (let i = 0; i < resData.hImgs.length; i++) {
|
||||
if (getFileSuffix(resData.hImgs[i].FILEPATH) === "mp4") {
|
||||
data.videoDialog.src = VITE_FILE_URL + resData.hImgs[i].FILEPATH;
|
||||
data.videoDialog.src = resData.hImgs[i].FILEPATH;
|
||||
} else {
|
||||
data.hImgs.push(resData.hImgs[i]);
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
<vue-pdf
|
||||
v-for="page in numOfPages"
|
||||
:key="page"
|
||||
:src="VITE_FILE_URL + src"
|
||||
:src="fnSrc(props.src)"
|
||||
:page="page"
|
||||
/>
|
||||
</div>
|
||||
|
@ -17,7 +17,7 @@
|
|||
<vue-pdf
|
||||
v-for="page in numOfPages"
|
||||
:key="page"
|
||||
:src="VITE_FILE_URL + src"
|
||||
:src="fnSrc(props.src)"
|
||||
:page="page"
|
||||
/>
|
||||
</div>
|
||||
|
@ -45,16 +45,27 @@ const props = defineProps({
|
|||
},
|
||||
model: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: "dialog", // 模式: dialog=弹窗, normal=直接显示
|
||||
validator: (value) => {
|
||||
if (["dialog", "normal"].includes(value)) {
|
||||
return true;
|
||||
} else {
|
||||
throw new Error("model必须是dialog或normal");
|
||||
}
|
||||
},
|
||||
default: "dialog",
|
||||
},
|
||||
});
|
||||
const emits = defineEmits(["update:visible"]);
|
||||
const visible = useVModel(props, "visible", emits);
|
||||
const numOfPages = ref(0);
|
||||
const fnSrc = (src) => {
|
||||
if (!src) return;
|
||||
if (src.indexOf("http") !== -1 || src.indexOf("https") !== -1) return src;
|
||||
else return VITE_FILE_URL + src;
|
||||
};
|
||||
watchEffect(() => {
|
||||
if (props.visible || props.src) {
|
||||
const loadingTask = createLoadingTask(VITE_FILE_URL + props.src);
|
||||
const loadingTask = createLoadingTask(fnSrc(props.src));
|
||||
loadingTask.promise
|
||||
.then((pdf) => {
|
||||
numOfPages.value = pdf.numPages;
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
<template>
|
||||
<el-cascader
|
||||
:options="options"
|
||||
:props="{
|
||||
multiple: true,
|
||||
value: 'id',
|
||||
children: 'nodes',
|
||||
label: 'name',
|
||||
}"
|
||||
v-model="modelValue"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { layoutFnGetTrainingPlateType } from "@/assets/js/data_dictionary.js";
|
||||
import { useVModel } from "@vueuse/core";
|
||||
|
||||
defineOptions({
|
||||
name: "LayoutTrainingSectionCascader",
|
||||
});
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: [String, Array],
|
||||
required: true,
|
||||
default: "",
|
||||
},
|
||||
});
|
||||
const emits = defineEmits(["update:modelValue"]);
|
||||
const modelValue = useVModel(props, "modelValue", emits);
|
||||
const options = await layoutFnGetTrainingPlateType();
|
||||
</script>
|
||||
|
||||
<style scoped></style>
|
|
@ -17,9 +17,11 @@ export const getInfo = (params) =>
|
|||
export const setUploadImg = (params) => upload("/imgfiles/add", params); // 上传附件
|
||||
export const setDeleteImg = (params) => post("/imgfiles/delete", params); // 删除附件
|
||||
export const getViewImg = (params) => post("/imgfiles/listImgs", params); // 查看图片
|
||||
|
||||
export const getVideoSource = (params) =>
|
||||
post("/videoRes/getVideoPlayAuth", params); // 获取视频 目前404
|
||||
|
||||
post("/videoRes/getVideoPlayAuth", params); // 获取视频
|
||||
export const getVideoAuth = (params) =>
|
||||
post("/videocourseware/getVideoPlayAuth", params); // 获取视频权限
|
||||
export const setVideo = (params) =>
|
||||
post("/app/audioOrVideo/createUploadVideo", params); // 阿里云上传视频
|
||||
export const setVideoRefresh = (params) =>
|
||||
post("/app/audioOrVideo/refreshUploadVideo", params); // 阿里云上传视频刷新凭证
|
||||
|
|
|
@ -78,6 +78,12 @@ export function post(url, params) {
|
|||
},
|
||||
})
|
||||
.then((res) => {
|
||||
if (
|
||||
res.config.url === "/app/audioOrVideo/createUploadVideo" ||
|
||||
res.config.url === "/app/audioOrVideo/refreshUploadVideo"
|
||||
) {
|
||||
res.data.result = "success";
|
||||
}
|
||||
if (res.data.result === "success") {
|
||||
resolve(res.data);
|
||||
} else {
|
||||
|
|
|
@ -1,33 +1,38 @@
|
|||
import { post, upload } from "@/request/axios.js";
|
||||
|
||||
export const getVideoCoursewareList = (params) =>
|
||||
post("/videocourseware/list", params); // 视频课件维护-获取课件列表
|
||||
|
||||
export const editVideoCoursewareState = (params) =>
|
||||
post("/videocourseware/editState", params); // 视频课件维护-启用/禁用
|
||||
|
||||
export const deleteVideoCourseware = (params) =>
|
||||
post("/videocourseware/delete", params); // 视频课件维护-删除
|
||||
|
||||
post("/videocourseware/list", params); // 视频课件维护列表
|
||||
export const getVideoCoursewareView = (params) =>
|
||||
post("/videocourseware/goEdit", params); // 视频课件维护查看
|
||||
export const setVideoCoursewareState = (params) =>
|
||||
post("/videocourseware/editState", params); // 视频课件维护启用禁用
|
||||
export const setVideoCoursewareDelete = (params) =>
|
||||
post("/videocourseware/delete", params); // 视频课件维护删除
|
||||
export const setVideoCoursewareAdd = (params) =>
|
||||
post("/videocourseware/add", params); // 视频课件维护添加
|
||||
export const setVideoCoursewareEdit = (params) =>
|
||||
post("/videocourseware/edit", params); // 视频课件维护修改
|
||||
export const getDataCoursewareList = (params) =>
|
||||
post("/datacourseware/list", params); // 视频课件维护-获取课件列表
|
||||
|
||||
export const editDataCoursewareState = (params) =>
|
||||
post("/datacourseware/editState", params); // 视频课件维护-启用/禁用
|
||||
|
||||
export const deleteDataCourseware = (params) =>
|
||||
post("/datacourseware/delete", params); // 视频课件维护-删除
|
||||
|
||||
export const getQuestionListByCoursewareIdAndType = (params) =>
|
||||
post("/question/list", params); // 课件管理-视频/资料课件维护-获取课件习题列表
|
||||
|
||||
export const deleteQuestion = (params) => post("/question/delete", params); // 课件管理-视频/资料课件维护-删除课件习题
|
||||
|
||||
export const deleteQuestionBatch = (params) =>
|
||||
post("/question/deleteAll", params); // 课件管理-视频/资料课件维护-批量删除课件习题
|
||||
|
||||
export const importQuestion = (params) => upload("/question/readExcel", params); // 课件管理-视频/资料课件维护-导入课件习题
|
||||
|
||||
export const addQuestion = (params) => upload("/question/add", params); // 课件管理-视频/资料课件维护-新增课件习题
|
||||
|
||||
export const editQuestion = (params) => upload("/question/edit", params); // 课件管理-视频/资料课件维护-修改课件习题
|
||||
post("/datacourseware/list", params); // 资料课件维护列表
|
||||
export const getDataCoursewareView = (params) =>
|
||||
post("/datacourseware/goEdit", params); // 资料课件维护查看
|
||||
export const setDataCoursewareState = (params) =>
|
||||
post("/datacourseware/editState", params); // 资料课件维护启用禁用
|
||||
export const setDataCoursewareDelete = (params) =>
|
||||
post("/datacourseware/delete", params); // 资料课件维护删除
|
||||
export const setDataCoursewareAdd = (params) =>
|
||||
upload("/datacourseware/add", params); // 资料课件维护添加
|
||||
export const setDataCoursewareEdit = (params) =>
|
||||
upload("/datacourseware/edit", params); // 资料课件维护修改
|
||||
export const getExercisesList = (params) => post("/question/list", params); // 课件习题列表
|
||||
export const setExercisesDelete = (params) => post("/question/delete", params); // 删除课件习题
|
||||
export const setExercisesDeleteBatch = (params) =>
|
||||
post("/question/deleteAll", params); // 批量删除课件习题
|
||||
export const setExercisesImport = (params) =>
|
||||
upload("/question/readExcel", params); // 导入课件习题
|
||||
export const setExercisesAdd = (params) => post("/question/add", params); // 新增课件习题
|
||||
export const setExercisesEdit = (params) => post("/question/edit", params); // 修改课件习题
|
||||
export const getCurriculumList = (params) => post("/curriculum/list", params); // 课程管理列表
|
||||
export const getCurriculumView = (params) => post("/curriculum/goEdit", params); // 课程管理查看
|
||||
export const setCurriculumDelete = (params) =>
|
||||
post("/curriculum/delete", params); // 课程管理删除
|
||||
|
|
|
@ -1,34 +1,24 @@
|
|||
import { post } from "@/request/axios.js";
|
||||
|
||||
export const getVideoCoursewareList = (params) =>
|
||||
post("/platform/videocourseware/list", params); // 课件资源管理-视频课件列表
|
||||
|
||||
post("/platform/videocourseware/list", params); // 课件资源管理视频课件列表
|
||||
export const getDataCoursewareList = (params) =>
|
||||
post("/platform/datacourseware/list", params); // 课件资源管理-资料课件列表
|
||||
|
||||
export const joinMyVideoCourseware = (params) =>
|
||||
post("/platform/videocourseware/joinMyCourseware", params); // 课件资源管理-视频课件-添加
|
||||
|
||||
export const joinMyDataCourseware = (params) =>
|
||||
post("/platform/datacourseware/joinMyCourseware", params); // 课件资源管理-资料课件-添加
|
||||
|
||||
post("/platform/datacourseware/list", params); // 课件资源管理资料课件列表
|
||||
export const setVideoCoursewareJoin = (params) =>
|
||||
post("/platform/videocourseware/joinMyCourseware", params); // 课件资源管理视频课件添加
|
||||
export const setDataCoursewareJoin = (params) =>
|
||||
post("/platform/datacourseware/joinMyCourseware", params); // 课件资源管理资料课件添加
|
||||
export const getQuestionListByCoursewareIdAndType = (params) =>
|
||||
post("/platform/question/list", params); // 课件资源管理-获取课件习题
|
||||
|
||||
post("/platform/question/list", params); // 课件资源管理课件习题列表
|
||||
export const getCurriculumList = (params) =>
|
||||
post("/platform/curriculum/list", params); // 课程管理-获取课程列表
|
||||
|
||||
export const joinMyCurriculum = (params) =>
|
||||
post("/platform/curriculum/joinMyCurriculum", params); // 课件资源管理-资料课件-添加
|
||||
|
||||
export const getCurriculumInfo = (params) =>
|
||||
post("/platform/curriculum/goEdit", params); // 课件资源管理-获取课程详情信息
|
||||
|
||||
export const setCurriculumJoin = (params) =>
|
||||
post("/platform/curriculum/joinMyCurriculum", params); // 课程管理添加
|
||||
export const getCurriculumView = (params) =>
|
||||
post("/platform/curriculum/goEdit", params); // 课程管理查看
|
||||
export const getPaperList = (params) =>
|
||||
post("/platform/stageexampaperinput/list", params); // 试卷管理-获取课程列表
|
||||
|
||||
export const joinMyPaper = (params) =>
|
||||
post("/platform/stageexampaperinput/joinMyPaper", params); // 试卷管理-添加
|
||||
|
||||
export const getPaperInfo = (params) =>
|
||||
post("/platform/stageexampaperinput/goEdit", params); // 试卷管理-获取试卷详情信息
|
||||
post("/platform/stageexampaperinput/list", params); // 试卷管理列表
|
||||
export const setPaperJoin = (params) =>
|
||||
post("/platform/stageexampaperinput/joinMyPaper", params); // 试卷管理添加
|
||||
export const getPaperView = (params) =>
|
||||
post("/platform/stageexampaperinput/goEdit", params); // 试卷管理查看
|
||||
|
|
|
@ -137,10 +137,10 @@ const fnGetArchivesFileList = async () => {
|
|||
if (year.value && year.value.length > 0) {
|
||||
params.YEAR = year.value;
|
||||
}
|
||||
const respData = await getArchivesFileList(params);
|
||||
if (respData && respData.varList) {
|
||||
data.fileList = respData.varList;
|
||||
data.form.file = respData.varList;
|
||||
const resData = await getArchivesFileList(params);
|
||||
if (resData && resData.varList) {
|
||||
data.fileList = resData.varList;
|
||||
data.form.file = resData.varList;
|
||||
}
|
||||
};
|
||||
await fnGetArchivesFileList();
|
||||
|
@ -148,11 +148,11 @@ await fnGetArchivesFileList();
|
|||
const fnDeleteArchivesFile = async (row) => {
|
||||
if (row) {
|
||||
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
||||
const respData = await deleteArchivesFile({
|
||||
const resData = await deleteArchivesFile({
|
||||
ARCHIVESFILES_ID: row.ARCHIVESFILES_ID,
|
||||
FILE_PATH: row.FILE_PATH,
|
||||
});
|
||||
if (respData && respData.result === "success") {
|
||||
if (resData && resData.result === "success") {
|
||||
await fnGetArchivesFileList();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -220,9 +220,9 @@ const fnDeleteArchivesCapital = async () => {
|
|||
};
|
||||
|
||||
const fnGetArchivesCapitalList = async () => {
|
||||
const respData = await getArchivesCapitalList({ YEAR: year.value });
|
||||
if (respData && respData.varList) {
|
||||
data.dataList = respData.varList;
|
||||
const resData = await getArchivesCapitalList({ YEAR: year.value });
|
||||
if (resData && resData.varList) {
|
||||
data.dataList = resData.varList;
|
||||
}
|
||||
};
|
||||
await fnGetArchivesCapitalList();
|
||||
|
|
|
@ -246,13 +246,13 @@ const fnSubmit = debounce(
|
|||
async () => {
|
||||
await useFormValidate(formRef);
|
||||
const params = Object.assign({}, data.form);
|
||||
let respData;
|
||||
let resData;
|
||||
if (type.value === "add") {
|
||||
respData = await addArchivesCapital(params);
|
||||
resData = await addArchivesCapital(params);
|
||||
} else if (type.value === "edit") {
|
||||
respData = await editArchivesCapital(params);
|
||||
resData = await editArchivesCapital(params);
|
||||
}
|
||||
if (respData && respData.result === "success") {
|
||||
if (resData && resData.result === "success") {
|
||||
emits("getData");
|
||||
fnClose();
|
||||
}
|
||||
|
@ -270,11 +270,11 @@ const fnGetArchivesCapital = async () => {
|
|||
ARCHIVESCAPITAL_ID.value &&
|
||||
ARCHIVESCAPITAL_ID.value.length > 0
|
||||
) {
|
||||
const respData = await getArchivesCapital({
|
||||
const resData = await getArchivesCapital({
|
||||
ARCHIVESCAPITAL_ID: ARCHIVESCAPITAL_ID.value,
|
||||
});
|
||||
if (respData && respData.pd) {
|
||||
data.form = respData.pd;
|
||||
if (resData && resData.pd) {
|
||||
data.form = resData.pd;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -189,9 +189,9 @@ const fnDelete = async () => {
|
|||
};
|
||||
|
||||
const fnGetList = async () => {
|
||||
const respData = await getArchivesEdumanagerList({ YEAR: year.value });
|
||||
if (respData && respData.varList) {
|
||||
data.dataList = respData.varList;
|
||||
const resData = await getArchivesEdumanagerList({ YEAR: year.value });
|
||||
if (resData && resData.varList) {
|
||||
data.dataList = resData.varList;
|
||||
}
|
||||
};
|
||||
await fnGetList();
|
||||
|
|
|
@ -171,13 +171,13 @@ const fnSubmit = debounce(
|
|||
async () => {
|
||||
await useFormValidate(formRef);
|
||||
const params = Object.assign({}, data.form);
|
||||
let respData;
|
||||
let resData;
|
||||
if (type.value === "add") {
|
||||
respData = await addArchivesEdumanager(params);
|
||||
resData = await addArchivesEdumanager(params);
|
||||
} else if (type.value === "edit") {
|
||||
respData = await editArchivesEdumanager(params);
|
||||
resData = await editArchivesEdumanager(params);
|
||||
}
|
||||
if (respData && respData.result === "success") {
|
||||
if (resData && resData.result === "success") {
|
||||
emits("getData");
|
||||
fnClose();
|
||||
}
|
||||
|
@ -195,11 +195,11 @@ const fnGetData = async () => {
|
|||
ARCHIVESEDUMANAGER_ID.value &&
|
||||
ARCHIVESEDUMANAGER_ID.value.length > 0
|
||||
) {
|
||||
const respData = await getArchivesEdumanager({
|
||||
const resData = await getArchivesEdumanager({
|
||||
ARCHIVESEDUMANAGER_ID: ARCHIVESEDUMANAGER_ID.value,
|
||||
});
|
||||
if (respData && respData.pd) {
|
||||
data.form = respData.pd;
|
||||
if (resData && resData.pd) {
|
||||
data.form = resData.pd;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -192,9 +192,9 @@ const fnDelete = async () => {
|
|||
};
|
||||
|
||||
const fnGetList = async () => {
|
||||
const respData = await getArchivesEduplanList({ YEAR: year.value });
|
||||
if (respData && respData.varList) {
|
||||
data.dataList = respData.varList;
|
||||
const resData = await getArchivesEduplanList({ YEAR: year.value });
|
||||
if (resData && resData.varList) {
|
||||
data.dataList = resData.varList;
|
||||
}
|
||||
};
|
||||
await fnGetList();
|
||||
|
|
|
@ -174,13 +174,13 @@ const fnSubmit = debounce(
|
|||
async () => {
|
||||
await useFormValidate(formRef);
|
||||
const params = Object.assign({}, data.form);
|
||||
let respData;
|
||||
let resData;
|
||||
if (type.value === "add") {
|
||||
respData = await addArchivesEduplan(params);
|
||||
resData = await addArchivesEduplan(params);
|
||||
} else if (type.value === "edit") {
|
||||
respData = await editArchivesEduplan(params);
|
||||
resData = await editArchivesEduplan(params);
|
||||
}
|
||||
if (respData && respData.result === "success") {
|
||||
if (resData && resData.result === "success") {
|
||||
emits("getData");
|
||||
fnClose();
|
||||
}
|
||||
|
@ -198,11 +198,11 @@ const fnGetData = async () => {
|
|||
ARCHIVESEDUPLAN_ID.value &&
|
||||
ARCHIVESEDUPLAN_ID.value.length > 0
|
||||
) {
|
||||
const respData = await getArchivesEduplan({
|
||||
const resData = await getArchivesEduplan({
|
||||
ARCHIVESEDUPLAN_ID: ARCHIVESEDUPLAN_ID.value,
|
||||
});
|
||||
if (respData && respData.pd) {
|
||||
data.form = respData.pd;
|
||||
if (resData && resData.pd) {
|
||||
data.form = resData.pd;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -169,9 +169,9 @@ const fnDelete = async () => {
|
|||
};
|
||||
|
||||
const fnGetList = async () => {
|
||||
const respData = await getArchivesPostmanList({ YEAR: year.value });
|
||||
if (respData && respData.varList) {
|
||||
data.dataList = respData.varList;
|
||||
const resData = await getArchivesPostmanList({ YEAR: year.value });
|
||||
if (resData && resData.varList) {
|
||||
data.dataList = resData.varList;
|
||||
}
|
||||
};
|
||||
await fnGetList();
|
||||
|
|
|
@ -146,13 +146,13 @@ const fnSubmit = debounce(
|
|||
async () => {
|
||||
await useFormValidate(formRef);
|
||||
const params = Object.assign({}, data.form);
|
||||
let respData;
|
||||
let resData;
|
||||
if (type.value === "add") {
|
||||
respData = await addArchivesPostman(params);
|
||||
resData = await addArchivesPostman(params);
|
||||
} else if (type.value === "edit") {
|
||||
respData = await editArchivesPostman(params);
|
||||
resData = await editArchivesPostman(params);
|
||||
}
|
||||
if (respData && respData.result === "success") {
|
||||
if (resData && resData.result === "success") {
|
||||
emits("getData");
|
||||
fnClose();
|
||||
}
|
||||
|
@ -170,11 +170,11 @@ const fnGetData = async () => {
|
|||
ARCHIVES_POSTMAN_ID.value &&
|
||||
ARCHIVES_POSTMAN_ID.value.length > 0
|
||||
) {
|
||||
const respData = await getArchivesPostman({
|
||||
const resData = await getArchivesPostman({
|
||||
ARCHIVES_POSTMAN_ID: ARCHIVES_POSTMAN_ID.value,
|
||||
});
|
||||
if (respData && respData.pd) {
|
||||
data.form = respData.pd;
|
||||
if (resData && resData.pd) {
|
||||
data.form = resData.pd;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -184,9 +184,9 @@ const fnDelete = async () => {
|
|||
};
|
||||
|
||||
const fnGetList = async () => {
|
||||
const respData = await getArchivesTeacherList({ YEAR: year.value });
|
||||
if (respData && respData.varList) {
|
||||
data.dataList = respData.varList;
|
||||
const resData = await getArchivesTeacherList({ YEAR: year.value });
|
||||
if (resData && resData.varList) {
|
||||
data.dataList = resData.varList;
|
||||
}
|
||||
};
|
||||
await fnGetList();
|
||||
|
|
|
@ -183,13 +183,13 @@ const fnSubmit = debounce(
|
|||
async () => {
|
||||
await useFormValidate(formRef);
|
||||
const params = Object.assign({}, data.form);
|
||||
let respData;
|
||||
let resData;
|
||||
if (type.value === "add") {
|
||||
respData = await addArchivesTeacher(params);
|
||||
resData = await addArchivesTeacher(params);
|
||||
} else if (type.value === "edit") {
|
||||
respData = await editArchivesTeacher(params);
|
||||
resData = await editArchivesTeacher(params);
|
||||
}
|
||||
if (respData && respData.result === "success") {
|
||||
if (resData && resData.result === "success") {
|
||||
emits("getData");
|
||||
fnClose();
|
||||
}
|
||||
|
@ -207,11 +207,11 @@ const fnGetData = async () => {
|
|||
ARCHIVESTEACHER_ID.value &&
|
||||
ARCHIVESTEACHER_ID.value.length > 0
|
||||
) {
|
||||
const respData = await getArchivesTeacher({
|
||||
const resData = await getArchivesTeacher({
|
||||
ARCHIVESTEACHER_ID: ARCHIVESTEACHER_ID.value,
|
||||
});
|
||||
if (respData && respData.pd) {
|
||||
data.form = respData.pd;
|
||||
if (resData && resData.pd) {
|
||||
data.form = resData.pd;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -129,10 +129,10 @@ const fnGetArchivesFileList = async () => {
|
|||
if (year.value && year.value.length > 0) {
|
||||
params.YEAR = year.value;
|
||||
}
|
||||
const respData = await getArchivesFileList(params);
|
||||
if (respData && respData.varList) {
|
||||
data.fileList = respData.varList;
|
||||
data.form.file = respData.varList;
|
||||
const resData = await getArchivesFileList(params);
|
||||
if (resData && resData.varList) {
|
||||
data.fileList = resData.varList;
|
||||
data.form.file = resData.varList;
|
||||
}
|
||||
};
|
||||
await fnGetArchivesFileList();
|
||||
|
@ -140,11 +140,11 @@ await fnGetArchivesFileList();
|
|||
const fnDeleteArchivesFile = async (row) => {
|
||||
if (row) {
|
||||
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
||||
const respData = await deleteArchivesFile({
|
||||
const resData = await deleteArchivesFile({
|
||||
ARCHIVESFILES_ID: row.ARCHIVESFILES_ID,
|
||||
FILE_PATH: row.FILE_PATH,
|
||||
});
|
||||
if (respData && respData.result === "success") {
|
||||
if (resData && resData.result === "success") {
|
||||
await fnGetArchivesFileList();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -87,11 +87,11 @@ const fnClose = () => {
|
|||
|
||||
const fnGetStudyTaskInfo = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getStudyTaskInfo({
|
||||
const resData = await getStudyTaskInfo({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.pd) {
|
||||
data.taskInfo = respData.pd;
|
||||
if (resData && resData.pd) {
|
||||
data.taskInfo = resData.pd;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -99,11 +99,11 @@ await fnGetStudyTaskInfo();
|
|||
|
||||
const fnGetAllCoursewareByHandout = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getAllCoursewareByHandout({
|
||||
const resData = await getAllCoursewareByHandout({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.varList) {
|
||||
data.coursewareList = respData.varList;
|
||||
if (resData && resData.varList) {
|
||||
data.coursewareList = resData.varList;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -166,11 +166,11 @@ const fnClose = () => {
|
|||
|
||||
const fnGetStudyTaskInfo = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getStudyTaskInfo({
|
||||
const resData = await getStudyTaskInfo({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.pd) {
|
||||
data.taskInfo = respData.pd;
|
||||
if (resData && resData.pd) {
|
||||
data.taskInfo = resData.pd;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -178,18 +178,18 @@ await fnGetStudyTaskInfo();
|
|||
|
||||
const fnGetPaperByTaskId = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getPaperByTaskId({
|
||||
const resData = await getPaperByTaskId({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData.paper) {
|
||||
if (respData.paper) {
|
||||
data.paperInfo = respData.paper;
|
||||
if (resData.paper) {
|
||||
if (resData.paper) {
|
||||
data.paperInfo = resData.paper;
|
||||
}
|
||||
data.paperInfo.selectList = [];
|
||||
data.paperInfo.multiList = [];
|
||||
data.paperInfo.judgeList = [];
|
||||
if (respData.questionList && respData.questionList.length > 0) {
|
||||
respData.questionList.forEach((question) => {
|
||||
if (resData.questionList && resData.questionList.length > 0) {
|
||||
resData.questionList.forEach((question) => {
|
||||
if (question.QUESTIONTYPE === "1") {
|
||||
data.paperInfo.selectList.push(question);
|
||||
} else if (question.QUESTIONTYPE === "2") {
|
||||
|
|
|
@ -148,11 +148,11 @@ const fnClose = () => {
|
|||
|
||||
const fnGetStudyTaskInfo = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getStudyTaskInfo({
|
||||
const resData = await getStudyTaskInfo({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.pd) {
|
||||
data.taskInfo = respData.pd;
|
||||
if (resData && resData.pd) {
|
||||
data.taskInfo = resData.pd;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -160,11 +160,11 @@ await fnGetStudyTaskInfo();
|
|||
|
||||
const fnGetAllCurriculum = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getAllCurriculum({
|
||||
const resData = await getAllCurriculum({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.varList) {
|
||||
data.curriculumList = respData.varList;
|
||||
if (resData && resData.varList) {
|
||||
data.curriculumList = resData.varList;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -172,11 +172,11 @@ await fnGetAllCurriculum();
|
|||
|
||||
const fnGetStudentByTaskId = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getStudentByTaskId({
|
||||
const resData = await getStudentByTaskId({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.varList) {
|
||||
data.studentList = respData.varList;
|
||||
if (resData && resData.varList) {
|
||||
data.studentList = resData.varList;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -253,11 +253,11 @@ const fnClose = () => {
|
|||
|
||||
const fnGetStudyTaskInfo = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getStudyTaskInfo({
|
||||
const resData = await getStudyTaskInfo({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.pd) {
|
||||
data.taskInfo = respData.pd;
|
||||
if (resData && resData.pd) {
|
||||
data.taskInfo = resData.pd;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -265,11 +265,11 @@ await fnGetStudyTaskInfo();
|
|||
|
||||
const fnGetAllCoursewareByHandout = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getAllCourseware({
|
||||
const resData = await getAllCourseware({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.varList) {
|
||||
data.coursewareList = respData.varList;
|
||||
if (resData && resData.varList) {
|
||||
data.coursewareList = resData.varList;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -277,11 +277,11 @@ await fnGetAllCoursewareByHandout();
|
|||
|
||||
const fnGetStudentByTaskId = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getStudentByTaskId({
|
||||
const resData = await getStudentByTaskId({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.varList) {
|
||||
data.studentList = respData.varList;
|
||||
if (resData && resData.varList) {
|
||||
data.studentList = resData.varList;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -157,11 +157,11 @@ const fnClose = () => {
|
|||
|
||||
const fnGetStudyTaskInfo = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getStudyTaskInfo({
|
||||
const resData = await getStudyTaskInfo({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.pd) {
|
||||
data.taskInfo = respData.pd;
|
||||
if (resData && resData.pd) {
|
||||
data.taskInfo = resData.pd;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -169,11 +169,11 @@ await fnGetStudyTaskInfo();
|
|||
|
||||
const fnGetAllCoursewareByHandout = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getAllCourseware({
|
||||
const resData = await getAllCourseware({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.varList) {
|
||||
data.coursewareList = respData.varList;
|
||||
if (resData && resData.varList) {
|
||||
data.coursewareList = resData.varList;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
@ -181,11 +181,11 @@ await fnGetAllCoursewareByHandout();
|
|||
|
||||
const fnGetStudentByTaskId = async () => {
|
||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||
const respData = await getStudentByTaskId({
|
||||
const resData = await getStudentByTaskId({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.varList) {
|
||||
data.studentList = respData.varList;
|
||||
if (resData && resData.varList) {
|
||||
data.studentList = resData.varList;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -200,11 +200,11 @@ const fnDelete = async () => {
|
|||
};
|
||||
|
||||
const fnGetList = async () => {
|
||||
const respData = await getArchivesTrainingScheduleList({
|
||||
const resData = await getArchivesTrainingScheduleList({
|
||||
STUDYTASK_ID: studyTaskId.value,
|
||||
});
|
||||
if (respData && respData.varList) {
|
||||
data.dataList = respData.varList;
|
||||
if (resData && resData.varList) {
|
||||
data.dataList = resData.varList;
|
||||
}
|
||||
};
|
||||
await fnGetList();
|
||||
|
|
|
@ -164,13 +164,13 @@ const fnSubmit = debounce(
|
|||
async () => {
|
||||
await useFormValidate(formRef);
|
||||
const params = Object.assign({}, data.form);
|
||||
let respData;
|
||||
let resData;
|
||||
if (type.value === "add") {
|
||||
respData = await addArchivesTrainingSchedule(params);
|
||||
resData = await addArchivesTrainingSchedule(params);
|
||||
} else if (type.value === "edit") {
|
||||
respData = await editArchivesTrainingSchedule(params);
|
||||
resData = await editArchivesTrainingSchedule(params);
|
||||
}
|
||||
if (respData && respData.result === "success") {
|
||||
if (resData && resData.result === "success") {
|
||||
emits("getData");
|
||||
fnClose();
|
||||
}
|
||||
|
@ -188,11 +188,11 @@ const fnGetData = async () => {
|
|||
TRAININGSCHEDULE_ID.value &&
|
||||
TRAININGSCHEDULE_ID.value.length > 0
|
||||
) {
|
||||
const respData = await getArchivesTrainingSchedule({
|
||||
const resData = await getArchivesTrainingSchedule({
|
||||
TRAININGSCHEDULE_ID: TRAININGSCHEDULE_ID.value,
|
||||
});
|
||||
if (respData && respData.pd) {
|
||||
data.form = respData.pd;
|
||||
if (resData && resData.pd) {
|
||||
data.form = resData.pd;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -165,9 +165,9 @@ const fnClose = () => {
|
|||
};
|
||||
|
||||
const fnGetUserInfo = async () => {
|
||||
const respData = await getUserInfo({ USER_ID: userId.value });
|
||||
if (respData && respData.pd) {
|
||||
data.userInfo = respData.pd;
|
||||
const resData = await getUserInfo({ USER_ID: userId.value });
|
||||
if (resData && resData.pd) {
|
||||
data.userInfo = resData.pd;
|
||||
}
|
||||
};
|
||||
await fnGetUserInfo();
|
||||
|
|
|
@ -498,45 +498,45 @@ const data_count = computed(() => {
|
|||
});
|
||||
|
||||
const fnGetStudyTaskInfo = async () => {
|
||||
const respData = await getStudyTaskInfo({ STUDYTASK_ID });
|
||||
if (respData && respData.pd) {
|
||||
data.studyTaskInfo = respData.pd;
|
||||
const resData = await getStudyTaskInfo({ STUDYTASK_ID });
|
||||
if (resData && resData.pd) {
|
||||
data.studyTaskInfo = resData.pd;
|
||||
}
|
||||
};
|
||||
await fnGetStudyTaskInfo();
|
||||
|
||||
const fnGetAllCourseware = async () => {
|
||||
const respData = await getAllCourseware({ STUDYTASK_ID });
|
||||
if (respData && respData.varList) {
|
||||
data.curriculumList = respData.varList;
|
||||
const resData = await getAllCourseware({ STUDYTASK_ID });
|
||||
if (resData && resData.varList) {
|
||||
data.curriculumList = resData.varList;
|
||||
}
|
||||
};
|
||||
await fnGetAllCourseware();
|
||||
|
||||
const fnGetUserInfo = async () => {
|
||||
const respData = await getUserInfo({ USER_ID });
|
||||
if (respData && respData.pd) {
|
||||
data.userInfo = respData.pd;
|
||||
const resData = await getUserInfo({ USER_ID });
|
||||
if (resData && resData.pd) {
|
||||
data.userInfo = resData.pd;
|
||||
data.checkPerType.push(data.userInfo.PERSONNEL_TYPE);
|
||||
}
|
||||
};
|
||||
await fnGetUserInfo();
|
||||
|
||||
const fnGetPersonnelType = async () => {
|
||||
const respData = await layoutFnGetPersonnelType();
|
||||
if (respData) {
|
||||
data.personalTypeList = respData;
|
||||
const resData = await layoutFnGetPersonnelType();
|
||||
if (resData) {
|
||||
data.personalTypeList = resData;
|
||||
}
|
||||
};
|
||||
await fnGetPersonnelType();
|
||||
|
||||
const fnGetArchivesPaper = async () => {
|
||||
const respData = await getArchivesPaper({ STUDYTASK_ID, USER_ID });
|
||||
if (respData) {
|
||||
data.paper.isExam = respData.isExam;
|
||||
data.paper.info = respData.paper;
|
||||
data.paper.questionList = respData.questionList;
|
||||
respData.questionList.forEach((question) => {
|
||||
const resData = await getArchivesPaper({ STUDYTASK_ID, USER_ID });
|
||||
if (resData) {
|
||||
data.paper.isExam = resData.isExam;
|
||||
data.paper.info = resData.paper;
|
||||
data.paper.questionList = resData.questionList;
|
||||
resData.questionList.forEach((question) => {
|
||||
if (question.QUESTIONTYPE === "1") {
|
||||
data.paper.selectList.push(question);
|
||||
} else if (question.QUESTIONTYPE === "2") {
|
||||
|
@ -550,21 +550,21 @@ const fnGetArchivesPaper = async () => {
|
|||
await fnGetArchivesPaper();
|
||||
|
||||
const fnGetSignByStudyTask = async () => {
|
||||
const respData = await getSignByStudyTask({ STUDYTASK_ID });
|
||||
if (respData && respData.varList) {
|
||||
data.signList = respData.varList;
|
||||
const resData = await getSignByStudyTask({ STUDYTASK_ID });
|
||||
if (resData && resData.varList) {
|
||||
data.signList = resData.varList;
|
||||
}
|
||||
};
|
||||
await fnGetSignByStudyTask();
|
||||
|
||||
const fnGetUserExamScoreByStudyTaskId = async () => {
|
||||
const respData = await getUserExamScoreByStudyTaskId({
|
||||
const resData = await getUserExamScoreByStudyTaskId({
|
||||
STUDYTASK_ID,
|
||||
USER_ID,
|
||||
});
|
||||
if (respData) {
|
||||
data.examScore.USER_SIGN_PATH = respData.USER_SIGN_PATH;
|
||||
data.examScore.userExamScore = respData.userExamScore;
|
||||
if (resData) {
|
||||
data.examScore.USER_SIGN_PATH = resData.USER_SIGN_PATH;
|
||||
data.examScore.userExamScore = resData.userExamScore;
|
||||
if (
|
||||
data.examScore.userExamScore &&
|
||||
Object.keys(data.examScore.userExamScore).length > 0
|
||||
|
|
|
@ -7,7 +7,6 @@
|
|||
:autosize="{
|
||||
minRows: 3,
|
||||
}"
|
||||
placeholder="这里输入意见..."
|
||||
/>
|
||||
</div>
|
||||
<template #footer>
|
||||
|
|
|
@ -0,0 +1,179 @@
|
|||
<template>
|
||||
<el-dialog
|
||||
v-model="visible"
|
||||
:title="type === 'add' ? '新增' : '修改'"
|
||||
:before-close="fnClose"
|
||||
>
|
||||
<el-form ref="formRef" :rules="rules" :model="form" label-width="120px">
|
||||
<el-form-item label="课件名称" prop="COURSEWARENAME">
|
||||
<el-input v-model="form.COURSEWARENAME" />
|
||||
</el-form-item>
|
||||
<el-form-item label="培训板块" prop="trainingSection">
|
||||
<layout-training-section-cascader v-model="form.trainingSection" />
|
||||
</el-form-item>
|
||||
<el-form-item label="培训行业类型" prop="TRAINTYPE">
|
||||
<layout-learning-train-type
|
||||
v-model="form.TRAINTYPE"
|
||||
type="industry"
|
||||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
||||
<layout-learning-train-type v-model="form.POSTTYPE" type="post" />
|
||||
</el-form-item>
|
||||
<el-form-item label="课件学时(分钟)" prop="CLASSHOUR">
|
||||
<el-input-number v-model="form.CLASSHOUR" :min="1" />
|
||||
</el-form-item>
|
||||
<el-form-item label="讲师名称" prop="SPEAKER">
|
||||
<el-input v-model="form.SPEAKER" />
|
||||
</el-form-item>
|
||||
<el-form-item label="课件文件" prop="file">
|
||||
<layout-upload
|
||||
v-model:file-list="form.file"
|
||||
accept=".pdf"
|
||||
:size="500"
|
||||
@preview="fnPreviewPdf"
|
||||
>
|
||||
<template #tip> 只能上传pdf文件 </template>
|
||||
</layout-upload>
|
||||
</el-form-item>
|
||||
<el-form-item label="课件截图" prop="screenshotFile">
|
||||
<layout-upload
|
||||
v-model:file-list="form.screenshotFile"
|
||||
accept=".jpg,.jpeg,.png"
|
||||
list-type="picture-card"
|
||||
>
|
||||
<template #tip> 建议上传尺寸224*160 </template>
|
||||
</layout-upload>
|
||||
</el-form-item>
|
||||
<el-form-item label="课件描述" prop="COURSEWAREINTRODUCE">
|
||||
<el-input
|
||||
v-model="form.COURSEWAREINTRODUCE"
|
||||
type="textarea"
|
||||
:autosize="{
|
||||
minRows: 3,
|
||||
}"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="大纲类型" prop="ONTLINETYPE">
|
||||
<el-select v-model="form.ONTLINETYPE">
|
||||
<el-option
|
||||
v-for="item in outlineTypeList"
|
||||
:key="item.DICTIONARIES_ID"
|
||||
:label="item.NAME"
|
||||
:value="item.DICTIONARIES_ID"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="fnClose">关闭</el-button>
|
||||
<el-button type="primary" @click="fnSubmit">提交</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<layout-pdf
|
||||
:src="data.pdfDialog.src"
|
||||
v-model:visible="data.pdfDialog.visible"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useVModels } from "@vueuse/core";
|
||||
import { reactive, ref } from "vue";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import { ElMessage } from "element-plus";
|
||||
import useFormValidate from "@/assets/js/useFormValidate.js";
|
||||
import LayoutTrainingSectionCascader from "@/components/training_section_cascader/index.vue";
|
||||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||
import LayoutUpload from "@/components/upload/index.vue";
|
||||
import { layoutFnGetOutlineType } from "@/assets/js/data_dictionary.js";
|
||||
import LayoutPdf from "@/components/pdf/index.vue";
|
||||
import {
|
||||
setDataCoursewareAdd,
|
||||
setDataCoursewareEdit,
|
||||
} from "@/request/online_learn_exam.js";
|
||||
|
||||
const props = defineProps({
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false,
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: "",
|
||||
},
|
||||
form: {
|
||||
type: Object,
|
||||
required: true,
|
||||
default: () => ({}),
|
||||
},
|
||||
});
|
||||
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
|
||||
const { visible, form } = useVModels(props, emits);
|
||||
const rules = {
|
||||
COURSEWARENAME: [
|
||||
{ required: true, message: "请输入课件名称", trigger: "blur" },
|
||||
],
|
||||
CLASSHOUR: [{ required: true, message: "请输入课件学时", trigger: "blur" }],
|
||||
SPEAKER: [{ required: true, message: "请输入讲师名称", trigger: "blur" }],
|
||||
file: [{ required: true, message: "请上传课件文件", trigger: "change" }],
|
||||
screenshotFile: [
|
||||
{ required: true, message: "请上传课件截图", trigger: "change" },
|
||||
],
|
||||
COURSEWAREINTRODUCE: [
|
||||
{ required: true, message: "请输入课件描述", trigger: "blur" },
|
||||
],
|
||||
ONTLINETYPE: [
|
||||
{ required: true, message: "请选择大纲类型", trigger: "change" },
|
||||
],
|
||||
};
|
||||
const data = reactive({
|
||||
pdfDialog: {
|
||||
src: "",
|
||||
visible: false,
|
||||
},
|
||||
});
|
||||
const formRef = ref(null);
|
||||
const outlineTypeList = await layoutFnGetOutlineType();
|
||||
const fnPreviewPdf = async (event) => {
|
||||
data.pdfDialog.visible = true;
|
||||
data.pdfDialog.src = event.url;
|
||||
};
|
||||
const fnClose = () => {
|
||||
formRef.value.resetFields();
|
||||
visible.value = false;
|
||||
};
|
||||
const fnSubmit = debounce(
|
||||
1000,
|
||||
async () => {
|
||||
await useFormValidate(formRef);
|
||||
const formData = new FormData();
|
||||
Object.keys(form.value).forEach((key) => {
|
||||
formData.append(key, form.value[key]);
|
||||
});
|
||||
if (form.value.trainingSection.length > 0) {
|
||||
formData.delete("trainingSection");
|
||||
formData.append("trainingSection", form.value.trainingSection.join(";"));
|
||||
}
|
||||
formData.delete("file");
|
||||
formData.delete("screenshotFile");
|
||||
if (form.value.file[0].raw)
|
||||
formData.append("cfile", form.value.file[0].raw);
|
||||
if (form.value.screenshotFile[0].raw)
|
||||
formData.append("ccfile", form.value.screenshotFile[0].raw);
|
||||
formData.append("captureIsType", !!form.value.screenshotFile[0].raw);
|
||||
formData.append("fileIsType", !!form.value.file[0].raw);
|
||||
props.type === "add"
|
||||
? await setDataCoursewareAdd(formData)
|
||||
: await setDataCoursewareEdit(formData);
|
||||
ElMessage.success("提交成功");
|
||||
fnClose();
|
||||
emits("get-data");
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -0,0 +1,9 @@
|
|||
<template>
|
||||
<exercises />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import Exercises from "../video/exercises.vue";
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -2,61 +2,52 @@
|
|||
<el-card>
|
||||
<el-form
|
||||
:model="searchForm"
|
||||
label-width="130px"
|
||||
label-width="110px"
|
||||
@submit.prevent="fnResetPagination"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="课程名称" prop="KEYWORDS">
|
||||
<el-input
|
||||
v-model="searchForm.KEYWORDS"
|
||||
placeholder="请输入课程名称"
|
||||
/>
|
||||
<el-input v-model="searchForm.KEYWORDS" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="教师名称" prop="SPEAKER">
|
||||
<el-input
|
||||
v-model="searchForm.SPEAKER"
|
||||
placeholder="请输入教师名称"
|
||||
/>
|
||||
<el-input v-model="searchForm.SPEAKER" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="培训板块类型" prop="trainingSectionKey">
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.trainingSectionKey"
|
||||
type="post"
|
||||
placeholder="请选择培训板块类型"
|
||||
type="plate"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="培训行业类型" prop="TRAINTYPE">
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.TRAINTYPE"
|
||||
type="post"
|
||||
placeholder="请选择培训行业类型"
|
||||
type="industry"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.POSTTYPE"
|
||||
type="post"
|
||||
placeholder="请选择岗位培训类型"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="课件状态" prop="STATE">
|
||||
<el-select v-model="searchForm.STATE" placeholder="请选择状态">
|
||||
<el-select v-model="searchForm.STATE">
|
||||
<el-option
|
||||
v-for="item in data.courseStates"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
v-for="item in stateList"
|
||||
:key="item.ID"
|
||||
:label="item.NAME"
|
||||
:value="item.ID"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
@ -67,20 +58,6 @@
|
|||
<el-button native-type="reset" @click="fnResetPagination">
|
||||
重置
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="!data.searchFromUnfolded"
|
||||
type="text"
|
||||
@click="data.searchFromUnfolded = true"
|
||||
>
|
||||
展开<el-icon><arrow-down /></el-icon>
|
||||
</el-button>
|
||||
<el-button
|
||||
v-else
|
||||
type="text"
|
||||
@click="data.searchFromUnfolded = false"
|
||||
>
|
||||
合并<el-icon><arrow-up /></el-icon>
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
@ -113,21 +90,16 @@
|
|||
label="培训行业类型"
|
||||
/>
|
||||
<el-table-column prop="SPEAKER" label="讲师名称" />
|
||||
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" />
|
||||
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" width="120" />
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="trainingSectionName"
|
||||
label="培训板块"
|
||||
/>
|
||||
<el-table-column prop="CREATTIME" label="上传时间" />
|
||||
<el-table-column prop="STATE" label="课件状态">
|
||||
<el-table-column prop="CREATTIME" label="上传时间" width="150" />
|
||||
<el-table-column prop="STATE" label="课件状态" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<template v-if="row.STATE === 0">
|
||||
<div>启用</div>
|
||||
</template>
|
||||
<template v-else-if="row.STATE === 1">
|
||||
<div>禁用</div>
|
||||
</template>
|
||||
{{ translationStatus(row.STATE, stateList) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="300">
|
||||
|
@ -136,7 +108,6 @@
|
|||
type="primary"
|
||||
text
|
||||
link
|
||||
v-if="interceptTheSuffix(row.COURSEWAREFILES, '.pdf')"
|
||||
@click="fnPreviewPdf(row.COURSEWAREFILES)"
|
||||
>
|
||||
预览
|
||||
|
@ -169,8 +140,9 @@
|
|||
row.STAGECOUNT === 0 &&
|
||||
row.ISPLATFORM === '0'
|
||||
"
|
||||
@click="fnAddOrEdit(row.DATACOURSEWARE_ID, 'edit')"
|
||||
>
|
||||
修改<!-- todo -->
|
||||
修改
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
|
@ -192,10 +164,10 @@
|
|||
link
|
||||
@click="
|
||||
router.push({
|
||||
path: '/online_learn_exam/courseware/data/question_list',
|
||||
path: '/online_learn_exam/courseware/data/exercises',
|
||||
query: {
|
||||
COURSE_ID: row.DATACOURSEWARE_ID, // 课件ID
|
||||
COURSE_TYPE: '2', // 课件类型(1:视频课件、2:资料课件)
|
||||
COURSEWAREID: row.DATACOURSEWARE_ID,
|
||||
COURSEWARETYPE: '2',
|
||||
},
|
||||
})
|
||||
"
|
||||
|
@ -205,8 +177,12 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<template #button>
|
||||
<el-button v-if="buttonJurisdiction.add" type="primary">
|
||||
新增<!-- todo -->
|
||||
<el-button
|
||||
v-if="buttonJurisdiction.add"
|
||||
type="primary"
|
||||
@click="fnAddOrEdit('', 'add')"
|
||||
>
|
||||
新增
|
||||
</el-button>
|
||||
</template>
|
||||
</layout-table>
|
||||
|
@ -215,77 +191,125 @@
|
|||
:src="data.pdfDialog.src"
|
||||
v-model:visible="data.pdfDialog.visible"
|
||||
/>
|
||||
<add
|
||||
v-model:visible="data.addOrEditDialog.visible"
|
||||
v-model:form="data.addOrEditDialog.form"
|
||||
:type="data.addOrEditDialog.type"
|
||||
@get-data="fnResetPagination"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||
import {
|
||||
getDataCoursewareList,
|
||||
editDataCoursewareState,
|
||||
deleteDataCourseware,
|
||||
getDataCoursewareView,
|
||||
setDataCoursewareDelete,
|
||||
setDataCoursewareState,
|
||||
} from "@/request/online_learn_exam.js";
|
||||
import useListData from "@/assets/js/useListData.js";
|
||||
import { reactive } from "vue";
|
||||
import { interceptTheSuffix, serialNumber } from "@/assets/js/utils.js";
|
||||
import { ArrowDown, ArrowUp } from "@element-plus/icons-vue";
|
||||
import { nextTick, reactive } from "vue";
|
||||
import {
|
||||
getFileName,
|
||||
serialNumber,
|
||||
translationStatus,
|
||||
} from "@/assets/js/utils.js";
|
||||
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import { useRouter } from "vue-router";
|
||||
import LayoutPdf from "@/components/pdf/index.vue";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import { useUserStore } from "@/pinia/user.js";
|
||||
import Add from "./components/add.vue";
|
||||
|
||||
const router = useRouter();
|
||||
const buttonJurisdiction = await useButtonJurisdiction("courseware");
|
||||
|
||||
const userStore = useUserStore();
|
||||
const stateList = [
|
||||
{ ID: 0, NAME: "启用" },
|
||||
{ ID: 1, NAME: "禁用" },
|
||||
];
|
||||
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
|
||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||
useListData(getDataCoursewareList);
|
||||
|
||||
const buttonJurisdiction = await useButtonJurisdiction("courseware");
|
||||
const data = reactive({
|
||||
courseStates: [
|
||||
{ value: "0", label: "启用" },
|
||||
{ value: "1", label: "禁用" },
|
||||
],
|
||||
searchFromUnfolded: false,
|
||||
pdfDialog: {
|
||||
src: "",
|
||||
visible: false,
|
||||
},
|
||||
addOrEditDialog: {
|
||||
visible: false,
|
||||
type: "",
|
||||
form: {
|
||||
COURSEWARENAME: "",
|
||||
trainingSection: [],
|
||||
TRAINTYPE: "",
|
||||
POSTTYPE: "",
|
||||
CLASSHOUR: 1,
|
||||
SPEAKER: "",
|
||||
file: [],
|
||||
screenshotFile: [],
|
||||
COURSEWAREINTRODUCE: "",
|
||||
ONTLINETYPE: "",
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const fnPreviewPdf = (FILEPATH) => {
|
||||
data.pdfDialog.visible = true;
|
||||
data.pdfDialog.src = FILEPATH;
|
||||
};
|
||||
|
||||
const fnEditState = debounce(
|
||||
1000,
|
||||
async (DATACOURSEWARE_ID, STATE) => {
|
||||
const respData = await editDataCoursewareState({
|
||||
const message = STATE === 1 ? "禁用" : "启用";
|
||||
await ElMessageBox.confirm(`确定要${message}吗?`, { type: "warning" });
|
||||
await setDataCoursewareState({
|
||||
DATACOURSEWARE_ID,
|
||||
STATE,
|
||||
});
|
||||
if (respData && respData.result === "success") {
|
||||
ElMessage.success("设置成功");
|
||||
await fnGetData();
|
||||
}
|
||||
ElMessage.success(`${message}成功`);
|
||||
fnResetPagination();
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
|
||||
const fnDelete = debounce(
|
||||
1000,
|
||||
async (DATACOURSEWARE_ID) => {
|
||||
if (DATACOURSEWARE_ID) {
|
||||
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
||||
const respData = await deleteDataCourseware({ DATACOURSEWARE_ID });
|
||||
if (respData && respData.result === "success") {
|
||||
ElMessage.success("删除成功");
|
||||
await fnGetData();
|
||||
}
|
||||
await setDataCoursewareDelete({ DATACOURSEWARE_ID });
|
||||
ElMessage.success("删除成功");
|
||||
fnResetPagination();
|
||||
}
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
const fnAddOrEdit = async (DATACOURSEWARE_ID, type) => {
|
||||
data.addOrEditDialog.visible = true;
|
||||
await nextTick();
|
||||
data.addOrEditDialog.type = type;
|
||||
if (type === "add")
|
||||
data.addOrEditDialog.form.TRAINTYPE = userStore.getUserInfo.CORP_TRAINTYPE;
|
||||
else {
|
||||
const resData = await getDataCoursewareView({ DATACOURSEWARE_ID });
|
||||
data.addOrEditDialog.form = resData.pd;
|
||||
data.addOrEditDialog.form.screenshotFile = [
|
||||
{
|
||||
url: VITE_FILE_URL + resData.pd.COURSEWARECAPTURE,
|
||||
name: getFileName(resData.pd.COURSEWARECAPTURE),
|
||||
},
|
||||
];
|
||||
data.addOrEditDialog.form.file = [
|
||||
{
|
||||
url: VITE_FILE_URL + resData.pd.COURSEWAREFILES,
|
||||
name: getFileName(resData.pd.COURSEWAREFILES),
|
||||
},
|
||||
];
|
||||
data.addOrEditDialog.form.trainingSection = resData.coursewareAllList.map(
|
||||
(item) => item.DICTIONARIES_IDS.split(",")
|
||||
);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
||||
|
|
|
@ -1,235 +0,0 @@
|
|||
<template>
|
||||
<el-dialog
|
||||
v-model="visible"
|
||||
:title="type === 'edit' ? '修改' : '新增'"
|
||||
:before-close="fnClose"
|
||||
>
|
||||
<el-form ref="formRef" :rules="rules" :model="form" label-width="150px">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="试题类型" prop="QUESTIONTYPE">
|
||||
<el-select
|
||||
v-model="form.QUESTIONTYPE"
|
||||
placeholder="请选择"
|
||||
style="width: 100%"
|
||||
@change="changeQuestionType"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in data.questionTypeList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="题干" prop="QUESTIONDRY">
|
||||
<el-input
|
||||
type="textarea"
|
||||
autosize
|
||||
maxlength="255"
|
||||
v-model="form.QUESTIONDRY"
|
||||
placeholder="这里输入题干"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-if="form.QUESTIONTYPE !== '3'" :span="24">
|
||||
<el-form-item label="选项A" prop="OPTIONA">
|
||||
<el-input
|
||||
maxlength="255"
|
||||
v-model="form.OPTIONA"
|
||||
placeholder="这里输入选项A"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-if="form.QUESTIONTYPE !== '3'" :span="24">
|
||||
<el-form-item label="选项B" prop="OPTIONB">
|
||||
<el-input
|
||||
maxlength="255"
|
||||
v-model="form.OPTIONB"
|
||||
placeholder="这里输入选项B"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-if="form.QUESTIONTYPE !== '3'" :span="24">
|
||||
<el-form-item label="选项C" prop="OPTIONC">
|
||||
<el-input
|
||||
maxlength="255"
|
||||
v-model="form.OPTIONC"
|
||||
placeholder="这里输入选项C"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-if="form.QUESTIONTYPE !== '3'" :span="24">
|
||||
<el-form-item label="选项D" prop="OPTIOND">
|
||||
<el-input
|
||||
maxlength="255"
|
||||
v-model="form.OPTIOND"
|
||||
placeholder="这里输入选项D"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="答案" prop="ANSWER">
|
||||
<el-select v-model="form.ANSWER" placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in data.answerList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="fnClose">取消</el-button>
|
||||
<el-button type="primary" @click="fnSubmit"> 确定 </el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useVModels } from "@vueuse/core";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import useFormValidate from "@/assets/js/useFormValidate.js";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { reactive, ref, watchEffect } from "vue";
|
||||
import { addQuestion, editQuestion } from "@/request/online_learn_exam.js";
|
||||
|
||||
const props = defineProps({
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false,
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: "",
|
||||
},
|
||||
form: {
|
||||
type: Object,
|
||||
required: true,
|
||||
default: () => ({}),
|
||||
},
|
||||
});
|
||||
|
||||
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
|
||||
|
||||
const { visible, type, form } = useVModels(props, emits);
|
||||
|
||||
const data = reactive({
|
||||
questionTypeList: [
|
||||
{
|
||||
value: "1",
|
||||
label: "单选题",
|
||||
},
|
||||
{
|
||||
value: "2",
|
||||
label: "多选题",
|
||||
},
|
||||
{
|
||||
value: "3",
|
||||
label: "判断题",
|
||||
},
|
||||
],
|
||||
answerList: [],
|
||||
});
|
||||
|
||||
const rules = {
|
||||
QUESTIONTYPE: [
|
||||
{
|
||||
required: true,
|
||||
message: "试题类型(单选题、多选题、判断题)不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
QUESTIONDRY: [{ required: true, message: "题干不能为空", trigger: "blur" }],
|
||||
OPTIONA: [{ required: true, message: "选项A不能为空", trigger: "blur" }],
|
||||
OPTIONB: [{ required: true, message: "选项B不能为空", trigger: "blur" }],
|
||||
OPTIONC: [{ required: true, message: "选项C不能为空", trigger: "blur" }],
|
||||
OPTIOND: [{ required: true, message: "选项D不能为空", trigger: "blur" }],
|
||||
ANSWER: [{ required: true, message: "答案不能为空", trigger: "blur" }],
|
||||
COURSEWARETYPE: [
|
||||
{
|
||||
required: true,
|
||||
message: "课件类型(1:视频课件、2:资料课件)不能为空",
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
COURSEWAREID: [
|
||||
{ required: true, message: "课件ID不能为空", trigger: "blur" },
|
||||
],
|
||||
};
|
||||
|
||||
const formRef = ref(null);
|
||||
|
||||
const fnClose = () => {
|
||||
formRef.value.resetFields();
|
||||
visible.value = false;
|
||||
};
|
||||
|
||||
const fnSubmit = debounce(
|
||||
1000,
|
||||
async () => {
|
||||
await useFormValidate(formRef);
|
||||
const respData =
|
||||
type.value === "add"
|
||||
? await addQuestion({ ...form.value })
|
||||
: await editQuestion({ ...form.value });
|
||||
if (respData.result === "success") {
|
||||
fnClose();
|
||||
ElMessage.success("保存成功");
|
||||
emits("get-data");
|
||||
}
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
|
||||
const changeAnswerList = () => {
|
||||
data.answerList = [];
|
||||
if (form.value.QUESTIONTYPE === "1") {
|
||||
data.answerList = [
|
||||
{ value: "A", label: "A" },
|
||||
{ value: "B", label: "B" },
|
||||
{ value: "C", label: "C" },
|
||||
{ value: "D", label: "D" },
|
||||
];
|
||||
} else if (form.value.QUESTIONTYPE === "2") {
|
||||
data.answerList = [
|
||||
{ value: "AB", label: "AB" },
|
||||
{ value: "AC", label: "AC" },
|
||||
{ value: "AD", label: "AD" },
|
||||
{ value: "BC", label: "BC" },
|
||||
{ value: "BD", label: "BD" },
|
||||
{ value: "CD", label: "CD" },
|
||||
{ value: "ABC", label: "ABC" },
|
||||
{ value: "ABD", label: "ABD" },
|
||||
{ value: "ACD", label: "ACD" },
|
||||
{ value: "BCD", label: "BCD" },
|
||||
{ value: "ABCD", label: "ABCD" },
|
||||
];
|
||||
} else if (form.value.QUESTIONTYPE === "3") {
|
||||
data.answerList = [
|
||||
{ value: "A", label: "正确" },
|
||||
{ value: "B", label: "错误" },
|
||||
];
|
||||
}
|
||||
};
|
||||
|
||||
const changeQuestionType = () => {
|
||||
form.value.ANSWER = "";
|
||||
changeAnswerList();
|
||||
};
|
||||
|
||||
watchEffect(() => {
|
||||
if (form.value.QUESTIONTYPE) {
|
||||
changeAnswerList();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -0,0 +1,209 @@
|
|||
<template>
|
||||
<el-dialog
|
||||
v-model="visible"
|
||||
:title="type === 'add' ? '新增' : '修改'"
|
||||
:before-close="fnClose"
|
||||
>
|
||||
<el-form ref="formRef" :rules="rules" :model="form" label-width="120px">
|
||||
<el-form-item label="课件名称" prop="COURSEWARENAME">
|
||||
<el-input v-model="form.COURSEWARENAME" />
|
||||
</el-form-item>
|
||||
<el-form-item label="培训板块" prop="trainingSection">
|
||||
<layout-training-section-cascader v-model="form.trainingSection" />
|
||||
</el-form-item>
|
||||
<el-form-item label="培训行业类型" prop="TRAINTYPE">
|
||||
<layout-learning-train-type
|
||||
v-model="form.TRAINTYPE"
|
||||
type="industry"
|
||||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
||||
<layout-learning-train-type v-model="form.POSTTYPE" type="post" />
|
||||
</el-form-item>
|
||||
<el-form-item label="讲师名称" prop="SPEAKER">
|
||||
<el-input v-model="form.SPEAKER" />
|
||||
</el-form-item>
|
||||
<el-form-item label="课件文件" prop="file">
|
||||
<layout-upload
|
||||
v-model:file-list="form.file"
|
||||
accept=".mp4"
|
||||
:size="500"
|
||||
@preview="fnPreviewVideo"
|
||||
>
|
||||
<template #tip>
|
||||
只能上传mp4文件,最大上传500M
|
||||
<el-progress :percentage="progressBar" v-if="progressBarVisible" />
|
||||
</template>
|
||||
</layout-upload>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="课件截图"
|
||||
prop="screenshotFile"
|
||||
v-if="form.screenshotFile.length > 0"
|
||||
>
|
||||
<layout-upload
|
||||
v-model:file-list="form.screenshotFile"
|
||||
accept=".jpg,.jpeg,.png"
|
||||
list-type="picture-card"
|
||||
disabled
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="课件描述" prop="COURSEWAREINTRODUCE">
|
||||
<el-input
|
||||
v-model="form.COURSEWAREINTRODUCE"
|
||||
type="textarea"
|
||||
:autosize="{
|
||||
minRows: 3,
|
||||
}"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="大纲类型" prop="ONTLINETYPE">
|
||||
<el-select v-model="form.ONTLINETYPE">
|
||||
<el-option
|
||||
v-for="item in outlineTypeList"
|
||||
:key="item.DICTIONARIES_ID"
|
||||
:label="item.NAME"
|
||||
:value="item.DICTIONARIES_ID"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="fnClose">关闭</el-button>
|
||||
<el-button type="primary" @click="fnSubmit">提交</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<layout-video
|
||||
:src="data.videoDialog.src"
|
||||
:vid="data.videoDialog.vid"
|
||||
:play-auth="data.videoDialog.playAuth"
|
||||
v-model:visible="data.videoDialog.visible"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useVModels } from "@vueuse/core";
|
||||
import { reactive, ref } from "vue";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import { ElMessage } from "element-plus";
|
||||
import useFormValidate from "@/assets/js/useFormValidate.js";
|
||||
import LayoutTrainingSectionCascader from "@/components/training_section_cascader/index.vue";
|
||||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||
import LayoutUpload from "@/components/upload/index.vue";
|
||||
import { layoutFnGetOutlineType } from "@/assets/js/data_dictionary.js";
|
||||
import useAliYunUpload from "@/assets/js/useAliYunUpload.js";
|
||||
import {
|
||||
setVideoCoursewareAdd,
|
||||
setVideoCoursewareEdit,
|
||||
} from "@/request/online_learn_exam.js";
|
||||
import LayoutVideo from "@/components/video/index.vue";
|
||||
import useAliYunVideoPreview from "@/assets/js/useAliYunVideoPreview.js";
|
||||
|
||||
let uploader;
|
||||
const props = defineProps({
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false,
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: "",
|
||||
},
|
||||
form: {
|
||||
type: Object,
|
||||
required: true,
|
||||
default: () => ({}),
|
||||
},
|
||||
});
|
||||
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
|
||||
const { visible, form } = useVModels(props, emits);
|
||||
const rules = {
|
||||
COURSEWARENAME: [
|
||||
{ required: true, message: "请输入课件名称", trigger: "blur" },
|
||||
],
|
||||
SPEAKER: [{ required: true, message: "请输入讲师名称", trigger: "blur" }],
|
||||
file: [{ required: true, message: "请上传课件文件", trigger: "change" }],
|
||||
COURSEWAREINTRODUCE: [
|
||||
{ required: true, message: "请输入课件描述", trigger: "blur" },
|
||||
],
|
||||
ONTLINETYPE: [
|
||||
{ required: true, message: "请选择大纲类型", trigger: "change" },
|
||||
],
|
||||
};
|
||||
const data = reactive({
|
||||
videoDialog: {
|
||||
src: "",
|
||||
vid: "",
|
||||
playAuth: "",
|
||||
visible: false,
|
||||
},
|
||||
});
|
||||
const formRef = ref(null);
|
||||
const progressBarVisible = ref(false);
|
||||
const progressBar = ref(0);
|
||||
const outlineTypeList = await layoutFnGetOutlineType();
|
||||
const fnPreviewVideo = async () => {
|
||||
const { src, vid, playAuth, visible } = await useAliYunVideoPreview(
|
||||
form.value
|
||||
);
|
||||
data.videoDialog.src = src;
|
||||
data.videoDialog.vid = vid;
|
||||
data.videoDialog.playAuth = playAuth;
|
||||
data.videoDialog.visible = visible;
|
||||
};
|
||||
const fnClose = () => {
|
||||
formRef.value.resetFields();
|
||||
visible.value = false;
|
||||
};
|
||||
const fnSubmit = debounce(
|
||||
1000,
|
||||
async () => {
|
||||
await useFormValidate(formRef);
|
||||
if (form.value.file[0].raw) {
|
||||
uploader = useAliYunUpload({
|
||||
onUploadSucceed: (uploadInfo) => {
|
||||
fnSubmitForm(uploadInfo.videoId);
|
||||
},
|
||||
onUploadstarted: () => {
|
||||
progressBarVisible.value = true;
|
||||
},
|
||||
onUploadFailed: () => {
|
||||
progressBarVisible.value = false;
|
||||
ElMessage.success("上传失败,请重新上传");
|
||||
},
|
||||
onUploadProgress: (uploadInfo, totalSize, progress) => {
|
||||
progressBar.value = Math.ceil(progress * 100);
|
||||
},
|
||||
});
|
||||
fnSubmitVideo();
|
||||
} else {
|
||||
await fnSubmitForm();
|
||||
}
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
const fnSubmitVideo = () => {
|
||||
uploader.addFile(form.value.file[0].raw, null, null, null, '{"Vod":{}}');
|
||||
uploader.startUpload();
|
||||
};
|
||||
const fnSubmitForm = async (videoId = "") => {
|
||||
const params = {
|
||||
...form.value,
|
||||
videoId,
|
||||
isEditVideo: !!form.value.file[0].raw,
|
||||
};
|
||||
props.type === "add"
|
||||
? await setVideoCoursewareAdd(params)
|
||||
: await setVideoCoursewareEdit(params);
|
||||
progressBar.value = 0;
|
||||
progressBarVisible.value = false;
|
||||
ElMessage.success("提交成功");
|
||||
fnClose();
|
||||
emits("get-data");
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -0,0 +1,196 @@
|
|||
<template>
|
||||
<el-dialog
|
||||
v-model="visible"
|
||||
:title="type === 'edit' ? '修改' : '新增'"
|
||||
:before-close="fnClose"
|
||||
>
|
||||
<el-form ref="formRef" :rules="rules" :model="form" label-width="100px">
|
||||
<el-form-item label="试题类型" prop="QUESTIONTYPE">
|
||||
<el-select v-model="form.QUESTIONTYPE" @change="fnChangeQuestionType">
|
||||
<el-option
|
||||
v-for="item in questionTypeOptions"
|
||||
:key="item.ID"
|
||||
:label="item.NAME"
|
||||
:value="item.ID"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="题干" prop="QUESTIONDRY">
|
||||
<el-input
|
||||
type="textarea"
|
||||
:autosize="{ minRows: 3 }"
|
||||
v-model="form.QUESTIONDRY"
|
||||
/>
|
||||
</el-form-item>
|
||||
<template v-if="form.QUESTIONTYPE !== '3'">
|
||||
<el-form-item label="选项A" prop="OPTIONA">
|
||||
<el-input v-model="form.OPTIONA" />
|
||||
</el-form-item>
|
||||
<el-form-item label="选项B" prop="OPTIONB">
|
||||
<el-input v-model="form.OPTIONB" />
|
||||
</el-form-item>
|
||||
<el-form-item label="选项C" prop="OPTIONC">
|
||||
<el-input v-model="form.OPTIONC" />
|
||||
</el-form-item>
|
||||
<el-form-item label="选项D" prop="OPTIOND">
|
||||
<el-input v-model="form.OPTIOND" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
<el-form-item label="答案" prop="ANSWER">
|
||||
<el-select v-model="form.ANSWER">
|
||||
<el-option
|
||||
v-for="item in answerList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="fnClose">取消</el-button>
|
||||
<el-button type="primary" @click="fnSubmit"> 确定 </el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useVModels } from "@vueuse/core";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import useFormValidate from "@/assets/js/useFormValidate.js";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { ref, watchEffect } from "vue";
|
||||
import {
|
||||
setExercisesAdd,
|
||||
setExercisesEdit,
|
||||
} from "@/request/online_learn_exam.js";
|
||||
import { uniq } from "lodash-es";
|
||||
const props = defineProps({
|
||||
visible: {
|
||||
type: Boolean,
|
||||
required: true,
|
||||
default: false,
|
||||
},
|
||||
type: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: "",
|
||||
},
|
||||
form: {
|
||||
type: Object,
|
||||
required: true,
|
||||
default: () => ({}),
|
||||
},
|
||||
coursewareId: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: "",
|
||||
},
|
||||
coursewareType: {
|
||||
type: String,
|
||||
required: true,
|
||||
default: "",
|
||||
},
|
||||
});
|
||||
|
||||
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
|
||||
const { visible, form } = useVModels(props, emits);
|
||||
const questionTypeOptions = [
|
||||
{ ID: "1", NAME: "单选题" },
|
||||
{ ID: "2", NAME: "多选题" },
|
||||
{ ID: "3", NAME: "判断题" },
|
||||
];
|
||||
const answerList = ref([]);
|
||||
const rules = {
|
||||
QUESTIONTYPE: [
|
||||
{ required: true, message: "试题类型不能为空", trigger: "change" },
|
||||
],
|
||||
QUESTIONDRY: [{ required: true, message: "题干不能为空", trigger: "blur" }],
|
||||
OPTIONA: [{ required: true, message: "选项A不能为空", trigger: "blur" }],
|
||||
OPTIONB: [{ required: true, message: "选项B不能为空", trigger: "blur" }],
|
||||
OPTIONC: [{ required: true, message: "选项C不能为空", trigger: "blur" }],
|
||||
OPTIOND: [{ required: true, message: "选项D不能为空", trigger: "blur" }],
|
||||
ANSWER: [{ required: true, message: "答案不能为空", trigger: "change" }],
|
||||
};
|
||||
const formRef = ref(null);
|
||||
const fnSetAnswerList = (questionType) => {
|
||||
answerList.value = [];
|
||||
if (questionType === "1") {
|
||||
answerList.value = [
|
||||
{ value: "A", label: "A" },
|
||||
{ value: "B", label: "B" },
|
||||
{ value: "C", label: "C" },
|
||||
{ value: "D", label: "D" },
|
||||
];
|
||||
} else if (questionType === "2") {
|
||||
answerList.value = [
|
||||
{ value: "AB", label: "AB" },
|
||||
{ value: "AC", label: "AC" },
|
||||
{ value: "AD", label: "AD" },
|
||||
{ value: "BC", label: "BC" },
|
||||
{ value: "BD", label: "BD" },
|
||||
{ value: "CD", label: "CD" },
|
||||
{ value: "ABC", label: "ABC" },
|
||||
{ value: "ABD", label: "ABD" },
|
||||
{ value: "ACD", label: "ACD" },
|
||||
{ value: "BCD", label: "BCD" },
|
||||
{ value: "ABCD", label: "ABCD" },
|
||||
];
|
||||
} else if (questionType === "3") {
|
||||
answerList.value = [
|
||||
{ value: "A", label: "正确" },
|
||||
{ value: "B", label: "错误" },
|
||||
];
|
||||
}
|
||||
};
|
||||
const fnChangeQuestionType = (event) => {
|
||||
form.value.ANSWER = "";
|
||||
form.value.OPTIONA = "";
|
||||
form.value.OPTIONB = "";
|
||||
form.value.OPTIONC = "";
|
||||
form.value.OPTIOND = "";
|
||||
if (event === "3") {
|
||||
form.value.OPTIONA = "正确";
|
||||
form.value.OPTIONB = "错误";
|
||||
}
|
||||
fnSetAnswerList(event);
|
||||
};
|
||||
const fnClose = () => {
|
||||
formRef.value.resetFields();
|
||||
visible.value = false;
|
||||
};
|
||||
const fnSubmit = debounce(
|
||||
1000,
|
||||
async () => {
|
||||
await useFormValidate(formRef);
|
||||
const optionList = [
|
||||
form.value.OPTIONA,
|
||||
form.value.OPTIONB,
|
||||
form.value.OPTIONC,
|
||||
form.value.OPTIOND,
|
||||
];
|
||||
if (uniq(optionList).length !== optionList.length) {
|
||||
ElMessage.error("选项不能重复");
|
||||
return;
|
||||
}
|
||||
props.type === "add"
|
||||
? await setExercisesAdd({
|
||||
...form.value,
|
||||
COURSEWAREID: props.coursewareId,
|
||||
COURSEWARETYPE: props.coursewareType,
|
||||
})
|
||||
: await setExercisesEdit({ ...form.value });
|
||||
fnClose();
|
||||
ElMessage.success("保存成功");
|
||||
emits("get-data");
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
watchEffect(() => {
|
||||
if (form.value.QUESTIONTYPE) {
|
||||
fnSetAnswerList(form.value.QUESTIONTYPE);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -3,21 +3,21 @@
|
|||
<el-card>
|
||||
<el-form
|
||||
:model="searchForm"
|
||||
label-width="130px"
|
||||
@submit.prevent="fnResetPaginationTransfer"
|
||||
label-width="40px"
|
||||
@submit.prevent="fnResetPagination"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="题干" prop="KEYWORDS">
|
||||
<el-input
|
||||
v-model="searchForm.KEYWORDS"
|
||||
placeholder="请输入题干"
|
||||
/>
|
||||
<el-input v-model="searchForm.KEYWORDS" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label-width="10px">
|
||||
<el-button type="primary" native-type="submit">搜索</el-button>
|
||||
<el-button native-type="reset" @click="fnResetPagination">
|
||||
重置
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6"></el-col>
|
||||
|
@ -34,40 +34,29 @@
|
|||
ref="tableRef"
|
||||
row-key="QUESTION_ID"
|
||||
:data="list"
|
||||
@get-data="fnGetDataTransfer"
|
||||
@get-data="fnGetData"
|
||||
v-model:pagination="pagination"
|
||||
>
|
||||
<el-table-column reserve-selection type="selection" width="55" />
|
||||
<el-table-column prop="QUESTIONNUMBER" label="题号" width="60" />
|
||||
<el-table-column
|
||||
prop="QUESTIONTYPE"
|
||||
label="试题类型"
|
||||
show-overflow-tooltip
|
||||
width="80"
|
||||
>
|
||||
<el-table-column label="试题类型" width="80">
|
||||
<template v-slot="{ row }">
|
||||
{{ fnFormatterQuestionType(row) }}
|
||||
{{ translationStatus(row.QUESTIONTYPE, questionTypeOptions) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="QUESTIONDRY"
|
||||
label="题干"
|
||||
align="left"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="ANSWER"
|
||||
label="答案"
|
||||
width="55"
|
||||
>
|
||||
<el-table-column label="答案" width="55">
|
||||
<template v-slot="{ row }">
|
||||
<template v-if="row.QUESTIONTYPE === '3'">
|
||||
<div v-if="row.ANSWER === 'A'">正确</div>
|
||||
<div v-if="row.ANSWER === 'B'">错误</div>
|
||||
<span v-if="row.ANSWER === 'A'">正确</span>
|
||||
<span v-if="row.ANSWER === 'B'">错误</span>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div>{{ row.ANSWER }}</div>
|
||||
<span>{{ row.ANSWER }}</span>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
@ -85,7 +74,7 @@
|
|||
row.COURSEEXAMCOUNT === 0 &&
|
||||
row.STAGEEXAMCOUNT === 0
|
||||
"
|
||||
@click="fnAddOrEdit(row)"
|
||||
@click="fnAddOrEdit(row, 'edit')"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
|
@ -111,7 +100,7 @@
|
|||
<el-button
|
||||
v-if="buttonJurisdiction.add"
|
||||
type="primary"
|
||||
@click="fnAddOrEdit(null)"
|
||||
@click="fnAddOrEdit({}, 'add')"
|
||||
>
|
||||
新增
|
||||
</el-button>
|
||||
|
@ -134,95 +123,69 @@
|
|||
v-model:visible="data.addOrEditDialog.visible"
|
||||
v-model:form="data.addOrEditDialog.form"
|
||||
:type="data.addOrEditDialog.type"
|
||||
@get-data="fnResetPaginationTransfer"
|
||||
:courseware-id="COURSEWAREID"
|
||||
:courseware-type="COURSEWARETYPE"
|
||||
@get-data="fnResetPagination"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {
|
||||
importQuestion,
|
||||
deleteQuestion,
|
||||
deleteQuestionBatch,
|
||||
getQuestionListByCoursewareIdAndType,
|
||||
setExercisesImport,
|
||||
setExercisesDelete,
|
||||
setExercisesDeleteBatch,
|
||||
getExercisesList,
|
||||
} from "@/request/online_learn_exam.js";
|
||||
import useListData from "@/assets/js/useListData.js";
|
||||
import { reactive } from "vue";
|
||||
import { nextTick, reactive } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import LayoutImportFile from "@/components/import_file/index.vue";
|
||||
import Add from "./components/add.vue";
|
||||
import Add from "./components/add_exercises.vue";
|
||||
import { translationStatus } from "@/assets/js/utils.js";
|
||||
import { cloneDeep } from "lodash-es";
|
||||
|
||||
const route = useRoute();
|
||||
const { COURSE_ID, COURSE_TYPE } = route.query;
|
||||
|
||||
const { COURSEWAREID, COURSEWARETYPE } = route.query;
|
||||
const questionTypeOptions = [
|
||||
{ ID: "1", NAME: "单选题" },
|
||||
{ ID: "2", NAME: "多选题" },
|
||||
{ ID: "3", NAME: "判断题" },
|
||||
];
|
||||
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
|
||||
useListData(getQuestionListByCoursewareIdAndType, {
|
||||
otherParams: { COURSEWAREID: COURSE_ID, COURSEWARETYPE: COURSE_TYPE },
|
||||
useListData(getExercisesList, {
|
||||
otherParams: { COURSEWAREID, COURSEWARETYPE },
|
||||
});
|
||||
|
||||
const buttonJurisdiction = await useButtonJurisdiction("courseware");
|
||||
|
||||
const data = reactive({
|
||||
importDialogVisible: false,
|
||||
questionTypeOptions: [
|
||||
{
|
||||
value: "1",
|
||||
label: "单选题",
|
||||
},
|
||||
{
|
||||
value: "2",
|
||||
label: "多选题",
|
||||
},
|
||||
{
|
||||
value: "3",
|
||||
label: "判断题",
|
||||
},
|
||||
],
|
||||
addOrEditDialog: {
|
||||
visible: false,
|
||||
form: {},
|
||||
form: {
|
||||
QUESTIONTYPE: "",
|
||||
QUESTIONDRY: "",
|
||||
OPTIONA: "",
|
||||
OPTIONB: "",
|
||||
OPTIONC: "",
|
||||
OPTIOND: "",
|
||||
ANSWER: "",
|
||||
},
|
||||
type: "add",
|
||||
},
|
||||
});
|
||||
|
||||
const fnGetDataTransfer = async () => {
|
||||
await fnGetData({
|
||||
COURSEWAREID: COURSE_ID,
|
||||
COURSEWARETYPE: COURSE_TYPE,
|
||||
});
|
||||
};
|
||||
|
||||
const fnResetPaginationTransfer = async () => {
|
||||
await fnResetPagination({
|
||||
COURSEWAREID: COURSE_ID,
|
||||
COURSEWARETYPE: COURSE_TYPE,
|
||||
});
|
||||
};
|
||||
|
||||
const fnFormatterQuestionType = (row) => {
|
||||
let label = "";
|
||||
data.questionTypeOptions.forEach((option) => {
|
||||
if (option.value === row.QUESTIONTYPE) {
|
||||
label = option.label;
|
||||
}
|
||||
});
|
||||
return label;
|
||||
};
|
||||
|
||||
const fnDelete = debounce(
|
||||
1000,
|
||||
async (QUESTION_ID) => {
|
||||
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
||||
await deleteQuestion({ QUESTION_ID });
|
||||
await setExercisesDelete({ QUESTION_ID });
|
||||
ElMessage.success("删除成功");
|
||||
fnGetDataTransfer();
|
||||
fnResetPagination();
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
|
||||
const fnBatchDelete = debounce(
|
||||
1000,
|
||||
async () => {
|
||||
|
@ -232,38 +195,29 @@ const fnBatchDelete = debounce(
|
|||
return;
|
||||
}
|
||||
await ElMessageBox.confirm("确定要删除选中的数据吗?", { type: "warning" });
|
||||
const DATA_IDS = selectionData.map((item) => item.RISKUNIT_ID).join(",");
|
||||
await deleteQuestionBatch({ DATA_IDS });
|
||||
const DATA_IDS = selectionData.map((item) => item.QUESTION_ID).join(",");
|
||||
await setExercisesDeleteBatch({ DATA_IDS });
|
||||
ElMessage.success("删除成功");
|
||||
fnResetPaginationTransfer();
|
||||
fnResetPagination();
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
|
||||
const fnImportDialogChangeShow = () => {
|
||||
data.importDialogVisible = !data.importDialogVisible;
|
||||
};
|
||||
|
||||
const fnSubmitImport = async (formData) => {
|
||||
formData.append("COURSEWARETYPE", COURSE_TYPE);
|
||||
formData.append("COURSEWAREID", COURSE_ID);
|
||||
const respData = await importQuestion(formData);
|
||||
ElMessage.success(respData.msg);
|
||||
formData.append("COURSEWARETYPE", COURSEWARETYPE);
|
||||
formData.append("COURSEWAREID", COURSEWAREID);
|
||||
const resData = await setExercisesImport(formData);
|
||||
ElMessage.success(resData.msg);
|
||||
fnImportDialogChangeShow();
|
||||
fnResetPaginationTransfer();
|
||||
fnResetPagination();
|
||||
};
|
||||
|
||||
const fnAddOrEdit = (row) => {
|
||||
data.addOrEditDialog.form = {};
|
||||
if (row) {
|
||||
data.addOrEditDialog.form = JSON.parse(JSON.stringify(row));
|
||||
data.addOrEditDialog.type = "edit";
|
||||
} else {
|
||||
data.addOrEditDialog.form.COURSEWAREID = COURSE_ID;
|
||||
data.addOrEditDialog.form.COURSEWARETYPE = COURSE_TYPE;
|
||||
data.addOrEditDialog.type = "add";
|
||||
}
|
||||
const fnAddOrEdit = async (row, type) => {
|
||||
data.addOrEditDialog.visible = true;
|
||||
await nextTick();
|
||||
data.addOrEditDialog.type = type;
|
||||
if (type === "edit") data.addOrEditDialog.form = cloneDeep(row);
|
||||
};
|
||||
</script>
|
||||
|
|
@ -2,61 +2,52 @@
|
|||
<el-card>
|
||||
<el-form
|
||||
:model="searchForm"
|
||||
label-width="130px"
|
||||
label-width="110px"
|
||||
@submit.prevent="fnResetPagination"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="课程名称" prop="KEYWORDS">
|
||||
<el-input
|
||||
v-model="searchForm.KEYWORDS"
|
||||
placeholder="请输入课程名称"
|
||||
/>
|
||||
<el-input v-model="searchForm.KEYWORDS" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="教师名称" prop="SPEAKER">
|
||||
<el-input
|
||||
v-model="searchForm.SPEAKER"
|
||||
placeholder="请输入教师名称"
|
||||
/>
|
||||
<el-input v-model="searchForm.SPEAKER" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="培训板块类型" prop="trainingSectionKey">
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.trainingSectionKey"
|
||||
type="post"
|
||||
placeholder="请选择培训板块类型"
|
||||
type="plate"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="培训行业类型" prop="TRAINTYPE">
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.TRAINTYPE"
|
||||
type="post"
|
||||
placeholder="请选择培训行业类型"
|
||||
type="industry"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.POSTTYPE"
|
||||
type="post"
|
||||
placeholder="请选择岗位培训类型"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
||||
<el-col :span="6">
|
||||
<el-form-item label="课件状态" prop="STATE">
|
||||
<el-select v-model="searchForm.STATE" placeholder="请选择状态">
|
||||
<el-select v-model="searchForm.STATE">
|
||||
<el-option
|
||||
v-for="item in data.courseStates"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
v-for="item in stateList"
|
||||
:key="item.ID"
|
||||
:label="item.NAME"
|
||||
:value="item.ID"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
@ -67,20 +58,6 @@
|
|||
<el-button native-type="reset" @click="fnResetPagination">
|
||||
重置
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="!data.searchFromUnfolded"
|
||||
type="text"
|
||||
@click="data.searchFromUnfolded = true"
|
||||
>
|
||||
展开<el-icon><arrow-down /></el-icon>
|
||||
</el-button>
|
||||
<el-button
|
||||
v-else
|
||||
type="text"
|
||||
@click="data.searchFromUnfolded = false"
|
||||
>
|
||||
合并<el-icon><arrow-up /></el-icon>
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
@ -113,47 +90,28 @@
|
|||
label="培训行业类型"
|
||||
/>
|
||||
<el-table-column prop="SPEAKER" label="讲师名称" />
|
||||
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" />
|
||||
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" width="120" />
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="trainingSectionName"
|
||||
label="培训板块"
|
||||
/>
|
||||
<el-table-column prop="CREATTIME" label="上传时间" />
|
||||
<el-table-column prop="STATE" label="课件状态">
|
||||
<el-table-column prop="CREATTIME" label="上传时间" width="150" />
|
||||
<el-table-column prop="STATE" label="课件状态" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<template v-if="row.STATE === 0">
|
||||
<div>启用</div>
|
||||
</template>
|
||||
<template v-else-if="row.STATE === 1">
|
||||
<div>禁用</div>
|
||||
</template>
|
||||
{{ translationStatus(row.STATE, stateList) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="CURRICULUM_ID_REMOTE" label="课件来源">
|
||||
<el-table-column prop="CURRICULUM_ID_REMOTE" label="课件来源" width="80">
|
||||
<template v-slot="{ row }">
|
||||
<template v-if="row.CURRICULUM_ID_REMOTE">
|
||||
<div>商城</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div>自传</div>
|
||||
</template>
|
||||
<span v-if="row.CURRICULUM_ID_REMOTE">商城</span>
|
||||
<span v-else>自传</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="NUMEXAMPLE" label="习题数" />
|
||||
<el-table-column prop="NUMEXAMPLE" label="习题数" width="80" />
|
||||
<el-table-column label="操作" width="300">
|
||||
<template v-slot="{ row }">
|
||||
<el-button
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
v-if="
|
||||
(row.VIDEOCOURSEWARE_ID_REMOTE &&
|
||||
row.VIDEOCOURSEWARE_ID_REMOTE.length > 0) ||
|
||||
(row.VIDEOFILES && row.VIDEOFILES.length > 0)
|
||||
"
|
||||
@click="fnPreviewVideo(row)"
|
||||
>
|
||||
<el-button type="primary" text link @click="fnPreviewVideo(row)">
|
||||
预览
|
||||
</el-button>
|
||||
<el-button
|
||||
|
@ -184,8 +142,9 @@
|
|||
row.STAGECOUNT === 0 &&
|
||||
row.ISPLATFORM === 0
|
||||
"
|
||||
@click="fnAddOrEdit(row.VIDEOCOURSEWARE_ID, 'edit')"
|
||||
>
|
||||
修改<!-- todo -->
|
||||
修改
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
|
@ -207,10 +166,10 @@
|
|||
link
|
||||
@click="
|
||||
router.push({
|
||||
path: '/online_learn_exam/courseware/video/question_list',
|
||||
path: '/online_learn_exam/courseware/video/exercises',
|
||||
query: {
|
||||
COURSE_ID: row.VIDEOCOURSEWARE_ID, // 课件ID
|
||||
COURSE_TYPE: '1', // 课件类型(1:视频课件、2:资料课件)
|
||||
COURSEWAREID: row.VIDEOCOURSEWARE_ID,
|
||||
COURSEWARETYPE: '1',
|
||||
},
|
||||
})
|
||||
"
|
||||
|
@ -220,8 +179,12 @@
|
|||
</template>
|
||||
</el-table-column>
|
||||
<template #button>
|
||||
<el-button v-if="buttonJurisdiction.add" type="primary">
|
||||
新增<!-- todo -->
|
||||
<el-button
|
||||
v-if="buttonJurisdiction.add"
|
||||
type="primary"
|
||||
@click="fnAddOrEdit('', 'add')"
|
||||
>
|
||||
新增
|
||||
</el-button>
|
||||
</template>
|
||||
</layout-table>
|
||||
|
@ -232,107 +195,129 @@
|
|||
:play-auth="data.videoDialog.playAuth"
|
||||
v-model:visible="data.videoDialog.visible"
|
||||
/>
|
||||
<add
|
||||
v-model:visible="data.addOrEditDialog.visible"
|
||||
v-model:form="data.addOrEditDialog.form"
|
||||
:type="data.addOrEditDialog.type"
|
||||
@get-data="fnResetPagination"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||
import {
|
||||
getVideoCoursewareList,
|
||||
editVideoCoursewareState,
|
||||
deleteVideoCourseware,
|
||||
setVideoCoursewareState,
|
||||
setVideoCoursewareDelete,
|
||||
getVideoCoursewareView,
|
||||
} from "@/request/online_learn_exam.js";
|
||||
import useListData from "@/assets/js/useListData.js";
|
||||
import { reactive } from "vue";
|
||||
import { serialNumber } from "@/assets/js/utils.js";
|
||||
import { nextTick, reactive } from "vue";
|
||||
import {
|
||||
getFileName,
|
||||
serialNumber,
|
||||
translationStatus,
|
||||
} from "@/assets/js/utils.js";
|
||||
import LayoutVideo from "@/components/video/index.vue";
|
||||
import { getVideoAuth, getVideoSource } from "@/request/api.js";
|
||||
import { ArrowDown, ArrowUp } from "@element-plus/icons-vue";
|
||||
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import { useRouter } from "vue-router";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import Add from "./components/add.vue";
|
||||
import { useUserStore } from "@/pinia/user.js";
|
||||
import useAliYunVideoPreview from "@/assets/js/useAliYunVideoPreview.js";
|
||||
|
||||
const router = useRouter();
|
||||
const buttonJurisdiction = await useButtonJurisdiction("courseware");
|
||||
|
||||
const userStore = useUserStore();
|
||||
const stateList = [
|
||||
{ ID: 0, NAME: "启用" },
|
||||
{ ID: 1, NAME: "禁用" },
|
||||
];
|
||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||
useListData(getVideoCoursewareList);
|
||||
|
||||
const buttonJurisdiction = await useButtonJurisdiction("courseware");
|
||||
const data = reactive({
|
||||
courseStates: [
|
||||
{ value: "0", label: "启用" },
|
||||
{ value: "1", label: "禁用" },
|
||||
],
|
||||
searchFromUnfolded: false,
|
||||
videoDialog: {
|
||||
src: "",
|
||||
vid: "",
|
||||
playAuth: "",
|
||||
visible: false,
|
||||
},
|
||||
addOrEditDialog: {
|
||||
visible: false,
|
||||
type: "",
|
||||
form: {
|
||||
COURSEWARENAME: "",
|
||||
trainingSection: [],
|
||||
TRAINTYPE: "",
|
||||
POSTTYPE: "",
|
||||
SPEAKER: "",
|
||||
file: [],
|
||||
screenshotFile: [],
|
||||
COURSEWAREINTRODUCE: "",
|
||||
ONTLINETYPE: "",
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const fnPreviewVideo = async (row) => {
|
||||
data.videoDialog.src = "";
|
||||
data.videoDialog.vid = "";
|
||||
data.videoDialog.playAuth = "";
|
||||
if (
|
||||
row.VIDEOCOURSEWARE_ID_REMOTE &&
|
||||
row.VIDEOCOURSEWARE_ID_REMOTE.length > 0
|
||||
) {
|
||||
const respData = await getVideoSource({
|
||||
VIDEOCOURSEWARE_ID: row.VIDEOCOURSEWARE_ID_REMOTE,
|
||||
CURRICULUM_ID: row.CURRICULUM_ID_REMOTE,
|
||||
});
|
||||
if (respData && respData.type === "success") {
|
||||
const video = {};
|
||||
respData.videoList?.forEach((item) => {
|
||||
video[item.definition] = item.playURL;
|
||||
});
|
||||
data.videoDialog.src = JSON.stringify(video);
|
||||
data.videoDialog.visible = true;
|
||||
}
|
||||
} else if (row.VIDEOFILES && row.VIDEOFILES.length > 0) {
|
||||
const respData = await getVideoAuth({
|
||||
videoId: row.VIDEOFILES,
|
||||
});
|
||||
if (respData && respData.type === "success") {
|
||||
data.videoDialog.playAuth = respData.playAuth;
|
||||
data.videoDialog.vid = row.VIDEOFILES;
|
||||
data.videoDialog.visible = true;
|
||||
}
|
||||
}
|
||||
const { src, vid, playAuth, visible } = await useAliYunVideoPreview(row);
|
||||
data.videoDialog.src = src;
|
||||
data.videoDialog.vid = vid;
|
||||
data.videoDialog.playAuth = playAuth;
|
||||
data.videoDialog.visible = visible;
|
||||
};
|
||||
|
||||
const fnEditState = debounce(
|
||||
1000,
|
||||
async (VIDEOCOURSEWARE_ID, STATE) => {
|
||||
const respData = await editVideoCoursewareState({
|
||||
const message = STATE === 1 ? "禁用" : "启用";
|
||||
await ElMessageBox.confirm(`确定要${message}吗?`, { type: "warning" });
|
||||
await setVideoCoursewareState({
|
||||
VIDEOCOURSEWARE_ID,
|
||||
STATE,
|
||||
});
|
||||
if (respData && respData.result === "success") {
|
||||
ElMessage.success("设置成功");
|
||||
await fnGetData();
|
||||
}
|
||||
ElMessage.success(`${message}成功`);
|
||||
fnResetPagination();
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
|
||||
const fnDelete = debounce(
|
||||
1000,
|
||||
async (VIDEOCOURSEWARE_ID) => {
|
||||
if (VIDEOCOURSEWARE_ID) {
|
||||
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
||||
const respData = await deleteVideoCourseware({ VIDEOCOURSEWARE_ID });
|
||||
if (respData && respData.result === "success") {
|
||||
ElMessage.success("删除成功");
|
||||
await fnGetData();
|
||||
}
|
||||
await setVideoCoursewareDelete({ VIDEOCOURSEWARE_ID });
|
||||
ElMessage.success("删除成功");
|
||||
fnResetPagination();
|
||||
}
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
const fnAddOrEdit = async (VIDEOCOURSEWARE_ID, type) => {
|
||||
data.addOrEditDialog.visible = true;
|
||||
await nextTick();
|
||||
data.addOrEditDialog.type = type;
|
||||
if (type === "add")
|
||||
data.addOrEditDialog.form.TRAINTYPE = userStore.getUserInfo.CORP_TRAINTYPE;
|
||||
else {
|
||||
const resData = await getVideoCoursewareView({ VIDEOCOURSEWARE_ID });
|
||||
data.addOrEditDialog.form = resData.pd;
|
||||
data.addOrEditDialog.form.screenshotFile = [
|
||||
{
|
||||
url: resData.pd.VIDEOCAPTURE,
|
||||
name: getFileName(resData.pd.VIDEOCAPTURE),
|
||||
},
|
||||
];
|
||||
data.addOrEditDialog.form.file = [
|
||||
{
|
||||
url: resData.pd.VIDEOFILES,
|
||||
name: getFileName(resData.pd.VIDEOFILES),
|
||||
},
|
||||
];
|
||||
data.addOrEditDialog.form.trainingSection = resData.coursewareAllList.map(
|
||||
(item) => item.DICTIONARIES_IDS.split(",")
|
||||
);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
||||
|
|
|
@ -0,0 +1,145 @@
|
|||
<template>
|
||||
<div>
|
||||
<el-card>
|
||||
<el-form
|
||||
:model="searchForm"
|
||||
label-width="80px"
|
||||
@submit.prevent="fnResetPagination"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="课程名称" prop="KEYWORDS">
|
||||
<el-input v-model="searchForm.KEYWORDS" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item
|
||||
label="岗位培训类型"
|
||||
prop="POSTTYPE"
|
||||
label-width="120px"
|
||||
>
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.POSTTYPE"
|
||||
type="post"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label-width="10px">
|
||||
<el-button type="primary" native-type="submit">搜索</el-button>
|
||||
<el-button native-type="reset" @click="fnResetPagination">
|
||||
重置
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</el-card>
|
||||
<layout-card>
|
||||
<layout-table
|
||||
:data="list"
|
||||
@get-data="fnGetData"
|
||||
v-model:pagination="pagination"
|
||||
>
|
||||
<el-table-column label="序号" width="60">
|
||||
<template #default="{ $index }">
|
||||
{{ serialNumber(pagination, $index) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="CURRICULUMNAME"
|
||||
label="课程名称"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column show-overflow-tooltip label="培训行业类型">
|
||||
<template v-slot="{ row }">
|
||||
<span v-if="row.CURRENCY === '1'">通用</span>
|
||||
<span v-else>{{ row.train_type_name }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="post_type_name"
|
||||
label="岗位培训类型"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column prop="CLASSHOUR" label="学时(分钟)" width="100" />
|
||||
<el-table-column prop="videoCount" label="视频课件数" width="100" />
|
||||
<el-table-column prop="dataCount" label="资料课件数" width="100" />
|
||||
<el-table-column label="操作" width="150">
|
||||
<template v-slot="{ row }">
|
||||
<el-button
|
||||
v-if="!row.COURSEPAPERS_ID"
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
@click="
|
||||
router.push({
|
||||
path: '/online_learn_exam/curriculum/view',
|
||||
query: { CURRICULUM_ID: row.CURRICULUM_ID },
|
||||
})
|
||||
"
|
||||
>
|
||||
查看
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="buttonJurisdiction.edit && !row.COURSEPAPERS_ID"
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="buttonJurisdiction.del && !row.COURSEPAPERS_ID"
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
@click="fnDelete(row.CURRICULUM_ID)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<template #button>
|
||||
<el-button v-if="buttonJurisdiction.add" type="primary">
|
||||
新建课程
|
||||
</el-button>
|
||||
<el-button v-if="buttonJurisdiction.add" type="primary">
|
||||
继承
|
||||
</el-button>
|
||||
</template>
|
||||
</layout-table>
|
||||
</layout-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||
import useListData from "@/assets/js/useListData.js";
|
||||
import { serialNumber } from "@/assets/js/utils.js";
|
||||
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
|
||||
import {
|
||||
getCurriculumList,
|
||||
setCurriculumDelete,
|
||||
} from "@/request/online_learn_exam.js";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import { useRouter } from "vue-router";
|
||||
|
||||
const router = useRouter();
|
||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||
useListData(getCurriculumList);
|
||||
const buttonJurisdiction = await useButtonJurisdiction("curriculum");
|
||||
const fnDelete = debounce(
|
||||
1000,
|
||||
async (CURRICULUM_ID) => {
|
||||
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
||||
await setCurriculumDelete({ CURRICULUM_ID });
|
||||
ElMessage.success("删除成功");
|
||||
fnResetPagination();
|
||||
},
|
||||
{ atBegin: true }
|
||||
);
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -0,0 +1,156 @@
|
|||
<template>
|
||||
<layout-card>
|
||||
<el-divider content-position="left">课程信息</el-divider>
|
||||
<el-descriptions :column="1" border>
|
||||
<el-descriptions-item label="课程名称">
|
||||
{{ data.info.CURRICULUMNAME }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="培训行业类型">
|
||||
{{ data.info.CURRENCY === "1" ? "通用" : data.info.train_type_name }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="岗位培训类型">
|
||||
{{ data.info.post_type_name }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="课程图片">
|
||||
<img
|
||||
v-viewer
|
||||
:src="VITE_FILE_URL + data.info.CAPTURE"
|
||||
width="100"
|
||||
height="100"
|
||||
alt=""
|
||||
/>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="课程介绍">
|
||||
{{ data.info.CURRICULUMINTRODUCE }}
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<template v-for="(item, index) in data.chapterList" :key="index">
|
||||
<el-divider content-position="center">{{ item.NAME }}</el-divider>
|
||||
<el-divider content-position="left">视频课件</el-divider>
|
||||
<layout-table :data="item.xzVideoList" :show-pagination="false">
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWARENAME"
|
||||
label="视频课件名称"
|
||||
>
|
||||
<template v-slot="{ row }">
|
||||
<el-button type="primary" text link @click="fnPreviewVideo(row)">
|
||||
{{ row.COURSEWARENAME }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="post_type_name"
|
||||
label="岗位培训类型"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="train_type_name"
|
||||
label="培训行业类型"
|
||||
/>
|
||||
<el-table-column show-overflow-tooltip prop="CLASSHOUR" label="学时" />
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWAREINTRODUCE"
|
||||
label="课件描述"
|
||||
/>
|
||||
<el-table-column show-overflow-tooltip prop="SPEAKER" label="讲师" />
|
||||
</layout-table>
|
||||
<el-divider content-position="left">资料课件</el-divider>
|
||||
<layout-table :data="item.xzDataList" :show-pagination="false">
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWARENAME"
|
||||
label="资料课件名称"
|
||||
>
|
||||
<template v-slot="{ row }">
|
||||
<el-button
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
@click="fnPreviewPdf(row.COURSEWAREFILES)"
|
||||
>
|
||||
{{ row.COURSEWARENAME }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="post_type_name"
|
||||
label="岗位培训类型"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="train_type_name"
|
||||
label="培训行业类型"
|
||||
/>
|
||||
<el-table-column show-overflow-tooltip prop="CLASSHOUR" label="学时" />
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWAREINTRODUCE"
|
||||
label="课件描述"
|
||||
/>
|
||||
<el-table-column show-overflow-tooltip prop="SPEAKER" label="讲师" />
|
||||
</layout-table>
|
||||
</template>
|
||||
<layout-pdf
|
||||
:src="data.pdfDialog.src"
|
||||
v-model:visible="data.pdfDialog.visible"
|
||||
/>
|
||||
<layout-video
|
||||
:src="data.videoDialog.src"
|
||||
:vid="data.videoDialog.vid"
|
||||
:play-auth="data.videoDialog.playAuth"
|
||||
v-model:visible="data.videoDialog.visible"
|
||||
/>
|
||||
</layout-card>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { reactive } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
import LayoutPdf from "@/components/pdf/index.vue";
|
||||
import LayoutVideo from "@/components/video/index.vue";
|
||||
import useAliYunVideoPreview from "@/assets/js/useAliYunVideoPreview.js";
|
||||
import { getCurriculumView } from "@/request/online_learn_exam.js";
|
||||
|
||||
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
|
||||
const route = useRoute();
|
||||
const { CURRICULUM_ID } = route.query;
|
||||
const data = reactive({
|
||||
info: {},
|
||||
chapterList: [],
|
||||
pdfDialog: {
|
||||
src: "",
|
||||
visible: false,
|
||||
},
|
||||
videoDialog: {
|
||||
src: "",
|
||||
vid: "",
|
||||
playAuth: "",
|
||||
visible: false,
|
||||
},
|
||||
});
|
||||
const fnGetData = async () => {
|
||||
const resData = await getCurriculumView({ CURRICULUM_ID });
|
||||
if (resData) {
|
||||
data.info = resData.pd;
|
||||
data.chapterList = resData.chapterList;
|
||||
}
|
||||
};
|
||||
fnGetData();
|
||||
const fnPreviewPdf = (FILEPATH) => {
|
||||
data.pdfDialog.visible = true;
|
||||
data.pdfDialog.src = FILEPATH;
|
||||
};
|
||||
const fnPreviewVideo = async (row) => {
|
||||
const { src, vid, playAuth, visible } = await useAliYunVideoPreview(row);
|
||||
data.videoDialog.src = src;
|
||||
data.videoDialog.vid = vid;
|
||||
data.videoDialog.playAuth = playAuth;
|
||||
data.videoDialog.visible = visible;
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -3,35 +3,35 @@
|
|||
<el-card>
|
||||
<el-form
|
||||
:model="searchForm"
|
||||
label-width="130px"
|
||||
label-width="90px"
|
||||
@submit.prevent="fnResetPagination"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="课程名称" prop="KEYWORDS">
|
||||
<el-input
|
||||
v-model="searchForm.KEYWORDS"
|
||||
placeholder="请输入课程名称"
|
||||
/>
|
||||
<el-input v-model="searchForm.KEYWORDS" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
||||
<el-form-item
|
||||
label="岗位培训类型"
|
||||
prop="POSTTYPE"
|
||||
label-width="120"
|
||||
>
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.POSTTYPE"
|
||||
type="post"
|
||||
placeholder="请选择岗位培训类型"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="课件状态" prop="STATE">
|
||||
<el-select v-model="searchForm.STATE" placeholder="请选择状态">
|
||||
<el-select v-model="searchForm.STATE">
|
||||
<el-option
|
||||
v-for="item in data.courseStates"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
v-for="item in stateList"
|
||||
:key="item.ID"
|
||||
:label="item.NAME"
|
||||
:value="item.ID"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
@ -68,27 +68,22 @@
|
|||
label="岗位培训类型"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="train_type_name"
|
||||
label="培训行业类型"
|
||||
>
|
||||
<el-table-column show-overflow-tooltip label="培训行业类型">
|
||||
<template v-slot="{ row }">
|
||||
<div v-if="row.CURRENCY === '1'">通用</div>
|
||||
<div v-else>{{ row.train_type_name }}</div>
|
||||
<span v-if="row.CURRENCY === '1'">通用</span>
|
||||
<span v-else>{{ row.train_type_name }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="teacherName" label="讲师名称" />
|
||||
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" />
|
||||
<el-table-column prop="CREATTIME" label="上传时间" />
|
||||
<el-table-column prop="STATE" label="课件状态">
|
||||
<el-table-column
|
||||
prop="CLASSHOUR"
|
||||
label="课件学时(分钟)"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column prop="CREATTIME" label="上传时间" width="140" />
|
||||
<el-table-column label="课件状态" width="100">
|
||||
<template v-slot="{ row }">
|
||||
<template v-if="row.STATE === 0">
|
||||
<div>启用</div>
|
||||
</template>
|
||||
<template v-else-if="row.STATE === 1">
|
||||
<div>禁用</div>
|
||||
</template>
|
||||
{{ translationStatus(row.STATE, stateList) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="200">
|
||||
|
@ -119,8 +114,8 @@
|
|||
router.push({
|
||||
path: '/platform_resource_library/courseware/data/view',
|
||||
query: {
|
||||
COURSE_ID: row.DATACOURSEWARE_ID, // 课件ID
|
||||
COURSE_TYPE: '2', // 课件类型(1:视频课件、2:资料课件)
|
||||
COURSEWAREID: row.DATACOURSEWARE_ID,
|
||||
COURSEWARETYPE: '2',
|
||||
},
|
||||
})
|
||||
"
|
||||
|
@ -142,11 +137,15 @@
|
|||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||
import {
|
||||
getDataCoursewareList,
|
||||
joinMyDataCourseware,
|
||||
setDataCoursewareJoin,
|
||||
} from "@/request/platform_resource_library.js";
|
||||
import useListData from "@/assets/js/useListData.js";
|
||||
import { reactive } from "vue";
|
||||
import { interceptTheSuffix, serialNumber } from "@/assets/js/utils.js";
|
||||
import {
|
||||
interceptTheSuffix,
|
||||
serialNumber,
|
||||
translationStatus,
|
||||
} from "@/assets/js/utils.js";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import { useRouter } from "vue-router";
|
||||
|
@ -155,12 +154,11 @@ import LayoutPdf from "@/components/pdf/index.vue";
|
|||
const router = useRouter();
|
||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||
useListData(getDataCoursewareList);
|
||||
|
||||
const stateList = [
|
||||
{ ID: 0, NAME: "启用" },
|
||||
{ ID: 1, NAME: "禁用" },
|
||||
];
|
||||
const data = reactive({
|
||||
courseStates: [
|
||||
{ value: "0", label: "启用" },
|
||||
{ value: "1", label: "禁用" },
|
||||
],
|
||||
pdfDialog: {
|
||||
src: "",
|
||||
visible: false,
|
||||
|
@ -168,7 +166,7 @@ const data = reactive({
|
|||
});
|
||||
const fnAdd = debounce(1000, async (DATACOURSEWARE_ID) => {
|
||||
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
||||
await joinMyDataCourseware({ COURSEWARE_ID: DATACOURSEWARE_ID });
|
||||
await setDataCoursewareJoin({ COURSEWARE_ID: DATACOURSEWARE_ID });
|
||||
ElMessage.success("添加成功");
|
||||
fnResetPagination();
|
||||
});
|
|
@ -0,0 +1,9 @@
|
|||
<template>
|
||||
<view-info />
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import ViewInfo from "../video/view.vue";
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -3,35 +3,35 @@
|
|||
<el-card>
|
||||
<el-form
|
||||
:model="searchForm"
|
||||
label-width="130px"
|
||||
label-width="80px"
|
||||
@submit.prevent="fnResetPagination"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="课程名称" prop="KEYWORDS">
|
||||
<el-input
|
||||
v-model="searchForm.KEYWORDS"
|
||||
placeholder="请输入课程名称"
|
||||
/>
|
||||
<el-input v-model="searchForm.KEYWORDS" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
||||
<el-form-item
|
||||
label="岗位培训类型"
|
||||
prop="POSTTYPE"
|
||||
label-width="120"
|
||||
>
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.POSTTYPE"
|
||||
type="post"
|
||||
placeholder="请选择岗位培训类型"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="课件状态" prop="STATE">
|
||||
<el-select v-model="searchForm.STATE" placeholder="请选择状态">
|
||||
<el-select v-model="searchForm.STATE">
|
||||
<el-option
|
||||
v-for="item in data.courseStates"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
v-for="item in stateList"
|
||||
:key="item.ID"
|
||||
:label="item.NAME"
|
||||
:value="item.ID"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
@ -68,53 +68,34 @@
|
|||
label="岗位培训类型"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="train_type_name"
|
||||
label="培训行业类型"
|
||||
>
|
||||
<el-table-column show-overflow-tooltip label="培训行业类型">
|
||||
<template v-slot="{ row }">
|
||||
<div v-if="row.CURRENCY === '1'">通用</div>
|
||||
<div v-else>{{ row.train_type_name }}</div>
|
||||
<span v-if="row.CURRENCY === '1'">通用</span>
|
||||
<span v-else>{{ row.train_type_name }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="teacherName" label="讲师名称" />
|
||||
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" />
|
||||
<el-table-column prop="CREATTIME" label="上传时间" />
|
||||
<el-table-column prop="STATE" label="课件状态">
|
||||
<el-table-column
|
||||
prop="CLASSHOUR"
|
||||
label="课件学时(分钟)"
|
||||
width="120"
|
||||
/>
|
||||
<el-table-column prop="CREATTIME" label="上传时间" width="140" />
|
||||
<el-table-column label="课件状态" width="100">
|
||||
<template v-slot="{ row }">
|
||||
<template v-if="row.STATE === 0">
|
||||
<div>启用</div>
|
||||
</template>
|
||||
<template v-else-if="row.STATE === 1">
|
||||
<div>禁用</div>
|
||||
</template>
|
||||
{{ translationStatus(row.STATE, stateList) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="CURRICULUM_ID_REMOTE" label="课件来源">
|
||||
<el-table-column label="课件来源" width="100">
|
||||
<template v-slot="{ row }">
|
||||
<template v-if="row.CURRICULUM_ID_REMOTE">
|
||||
<div>商城</div>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div>自传</div>
|
||||
</template>
|
||||
<span v-if="row.CURRICULUM_ID_REMOTE">商城</span>
|
||||
<span v-else>自传</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="NUMEXAMPLE" label="习题数" />
|
||||
<el-table-column prop="NUMEXAMPLE" label="习题数" width="100" />
|
||||
<el-table-column label="操作" width="200">
|
||||
<template v-slot="{ row }">
|
||||
<el-button
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
v-if="
|
||||
(row.VIDEOCOURSEWARE_ID_REMOTE &&
|
||||
row.VIDEOCOURSEWARE_ID_REMOTE.length > 0) ||
|
||||
(row.VIDEOFILES && row.VIDEOFILES.length > 0)
|
||||
"
|
||||
@click="fnPreviewVideo(row)"
|
||||
>
|
||||
<el-button type="primary" text link @click="fnPreviewVideo(row)">
|
||||
预览
|
||||
</el-button>
|
||||
<el-button
|
||||
|
@ -134,8 +115,8 @@
|
|||
router.push({
|
||||
path: '/platform_resource_library/courseware/video/view',
|
||||
query: {
|
||||
COURSE_ID: row.VIDEOCOURSEWARE_ID, // 课件ID
|
||||
COURSE_TYPE: '1', // 课件类型(1:视频课件、2:资料课件)
|
||||
COURSEWAREID: row.VIDEOCOURSEWARE_ID,
|
||||
COURSEWARETYPE: '1',
|
||||
},
|
||||
})
|
||||
"
|
||||
|
@ -159,26 +140,26 @@
|
|||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||
import {
|
||||
getVideoCoursewareList,
|
||||
joinMyVideoCourseware,
|
||||
setVideoCoursewareJoin,
|
||||
} from "@/request/platform_resource_library.js";
|
||||
import useListData from "@/assets/js/useListData.js";
|
||||
import { reactive } from "vue";
|
||||
import { serialNumber } from "@/assets/js/utils.js";
|
||||
import { serialNumber, translationStatus } from "@/assets/js/utils.js";
|
||||
import { debounce } from "throttle-debounce";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import { useRouter } from "vue-router";
|
||||
import LayoutVideo from "@/components/video/index.vue";
|
||||
import { getVideoAuth, getVideoSource } from "@/request/api.js";
|
||||
import useAliYunVideoPreview from "@/assets/js/useAliYunVideoPreview.js";
|
||||
|
||||
const router = useRouter();
|
||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||
useListData(getVideoCoursewareList);
|
||||
|
||||
const stateList = [
|
||||
{ ID: 0, NAME: "启用" },
|
||||
{ ID: 1, NAME: "禁用" },
|
||||
];
|
||||
const data = reactive({
|
||||
courseStates: [
|
||||
{ value: "0", label: "启用" },
|
||||
{ value: "1", label: "禁用" },
|
||||
],
|
||||
videoDialog: {
|
||||
src: "",
|
||||
vid: "",
|
||||
|
@ -186,44 +167,18 @@ const data = reactive({
|
|||
visible: false,
|
||||
},
|
||||
});
|
||||
|
||||
const fnAdd = debounce(1000, async (VIDEOCOURSEWARE_ID) => {
|
||||
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
||||
await joinMyVideoCourseware({ COURSEWARE_ID: VIDEOCOURSEWARE_ID });
|
||||
await setVideoCoursewareJoin({ COURSEWARE_ID: VIDEOCOURSEWARE_ID });
|
||||
ElMessage.success("添加成功");
|
||||
fnResetPagination();
|
||||
});
|
||||
|
||||
const fnPreviewVideo = async (row) => {
|
||||
data.videoDialog.src = "";
|
||||
data.videoDialog.vid = "";
|
||||
data.videoDialog.playAuth = "";
|
||||
if (
|
||||
row.VIDEOCOURSEWARE_ID_REMOTE &&
|
||||
row.VIDEOCOURSEWARE_ID_REMOTE.length > 0
|
||||
) {
|
||||
const respData = await getVideoSource({
|
||||
VIDEOCOURSEWARE_ID: row.VIDEOCOURSEWARE_ID_REMOTE,
|
||||
CURRICULUM_ID: row.CURRICULUM_ID_REMOTE,
|
||||
});
|
||||
if (respData && respData.type === "success") {
|
||||
const video = {};
|
||||
respData.videoList?.forEach((item) => {
|
||||
video[item.definition] = item.playURL;
|
||||
});
|
||||
data.videoDialog.src = JSON.stringify(video);
|
||||
data.videoDialog.visible = true;
|
||||
}
|
||||
} else if (row.VIDEOFILES && row.VIDEOFILES.length > 0) {
|
||||
const respData = await getVideoAuth({
|
||||
videoId: row.VIDEOFILES,
|
||||
});
|
||||
if (respData && respData.type === "success") {
|
||||
data.videoDialog.playAuth = respData.playAuth;
|
||||
data.videoDialog.vid = row.VIDEOFILES;
|
||||
data.videoDialog.visible = true;
|
||||
}
|
||||
}
|
||||
const { src, vid, playAuth, visible } = await useAliYunVideoPreview(row);
|
||||
data.videoDialog.src = src;
|
||||
data.videoDialog.vid = vid;
|
||||
data.videoDialog.playAuth = playAuth;
|
||||
data.videoDialog.visible = visible;
|
||||
};
|
||||
</script>
|
||||
|
|
@ -3,8 +3,8 @@
|
|||
<el-card>
|
||||
<el-form
|
||||
:model="searchForm"
|
||||
label-width="130px"
|
||||
@submit.prevent="fnResetPaginationTransfer"
|
||||
label-width="60px"
|
||||
@submit.prevent="fnResetPagination"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
|
@ -15,6 +15,9 @@
|
|||
<el-col :span="6">
|
||||
<el-form-item label-width="10px">
|
||||
<el-button type="primary" native-type="submit">搜索</el-button>
|
||||
<el-button native-type="reset" @click="fnResetPagination">
|
||||
重置
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
@ -23,39 +26,28 @@
|
|||
<layout-card>
|
||||
<layout-table
|
||||
:data="list"
|
||||
@get-data="fnGetDataTransfer"
|
||||
@get-data="fnGetData"
|
||||
v-model:pagination="pagination"
|
||||
>
|
||||
<el-table-column prop="QUESTIONNUMBER" label="题号" width="60" />
|
||||
<el-table-column
|
||||
prop="QUESTIONTYPE"
|
||||
label="试题类型"
|
||||
show-overflow-tooltip
|
||||
width="80"
|
||||
>
|
||||
<el-table-column label="试题类型" width="80">
|
||||
<template v-slot="{ row }">
|
||||
{{ fnFormatterQuestionType(row) }}
|
||||
{{ translationStatus(row.QUESTIONTYPE, questionTypeOptions) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="QUESTIONDRY"
|
||||
label="题干"
|
||||
align="left"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="ANSWER"
|
||||
label="答案"
|
||||
width="55"
|
||||
>
|
||||
<el-table-column label="答案" width="55">
|
||||
<template v-slot="{ row }">
|
||||
<template v-if="row.QUESTIONTYPE === '3'">
|
||||
<div v-if="row.ANSWER === 'A'">正确</div>
|
||||
<div v-if="row.ANSWER === 'B'">错误</div>
|
||||
<span v-if="row.ANSWER === 'A'">正确</span>
|
||||
<span v-if="row.ANSWER === 'B'">错误</span>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div>{{ row.ANSWER }}</div>
|
||||
<span>{{ row.ANSWER }}</span>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
@ -67,57 +59,20 @@
|
|||
<script setup>
|
||||
import { getQuestionListByCoursewareIdAndType } from "@/request/platform_resource_library.js";
|
||||
import useListData from "@/assets/js/useListData.js";
|
||||
import { reactive } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
import { translationStatus } from "@/assets/js/utils.js";
|
||||
|
||||
const route = useRoute();
|
||||
const { COURSE_ID, COURSE_TYPE } = route.query;
|
||||
|
||||
const { COURSEWAREID, COURSEWARETYPE } = route.query;
|
||||
const questionTypeOptions = [
|
||||
{ ID: "1", NAME: "单选题" },
|
||||
{ ID: "2", NAME: "多选题" },
|
||||
{ ID: "3", NAME: "判断题" },
|
||||
];
|
||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||
useListData(getQuestionListByCoursewareIdAndType, {
|
||||
otherParams: { COURSEWAREID: COURSE_ID, COURSEWARETYPE: COURSE_TYPE },
|
||||
otherParams: { COURSEWAREID, COURSEWARETYPE },
|
||||
});
|
||||
|
||||
const data = reactive({
|
||||
questionTypeOptions: [
|
||||
{
|
||||
value: "1",
|
||||
label: "单选题",
|
||||
},
|
||||
{
|
||||
value: "2",
|
||||
label: "多选题",
|
||||
},
|
||||
{
|
||||
value: "3",
|
||||
label: "判断题",
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const fnGetDataTransfer = async () => {
|
||||
await fnGetData({
|
||||
COURSEWAREID: COURSE_ID,
|
||||
COURSEWARETYPE: COURSE_TYPE,
|
||||
});
|
||||
};
|
||||
|
||||
const fnResetPaginationTransfer = async () => {
|
||||
await fnResetPagination({
|
||||
COURSEWAREID: COURSE_ID,
|
||||
COURSEWARETYPE: COURSE_TYPE,
|
||||
});
|
||||
};
|
||||
|
||||
const fnFormatterQuestionType = (row) => {
|
||||
let label = "";
|
||||
data.questionTypeOptions.forEach((option) => {
|
||||
if (option.value === row.QUESTIONTYPE) {
|
||||
label = option.label;
|
||||
}
|
||||
});
|
||||
return label;
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss"></style>
|
|
@ -3,24 +3,24 @@
|
|||
<el-card>
|
||||
<el-form
|
||||
:model="searchForm"
|
||||
label-width="130px"
|
||||
label-width="80px"
|
||||
@submit.prevent="fnResetPagination"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="课程名称" prop="KEYWORDS">
|
||||
<el-input
|
||||
v-model="searchForm.KEYWORDS"
|
||||
placeholder="请输入课程名称"
|
||||
/>
|
||||
<el-input v-model="searchForm.KEYWORDS" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
||||
<el-form-item
|
||||
label="岗位培训类型"
|
||||
prop="POSTTYPE"
|
||||
label-width="120px"
|
||||
>
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.POSTTYPE"
|
||||
type="post"
|
||||
placeholder="请选择岗位培训类型"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
@ -51,14 +51,10 @@
|
|||
label="课程名称"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="train_type_name"
|
||||
label="培训行业类型"
|
||||
>
|
||||
<el-table-column show-overflow-tooltip label="培训行业类型">
|
||||
<template v-slot="{ row }">
|
||||
<div v-if="row.CURRENCY === '1'">通用</div>
|
||||
<div v-else>{{ row.train_type_name }}</div>
|
||||
<span v-if="row.CURRENCY === '1'">通用</span>
|
||||
<span v-else>{{ row.train_type_name }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
|
@ -66,9 +62,9 @@
|
|||
label="岗位培训类型"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column prop="CLASSHOUR" label="学时(分钟)" />
|
||||
<el-table-column prop="videoCount" label="视频课件数" />
|
||||
<el-table-column prop="dataCount" label="资料课件数" />
|
||||
<el-table-column prop="CLASSHOUR" label="学时(分钟)" width="100" />
|
||||
<el-table-column prop="videoCount" label="视频课件数" width="100" />
|
||||
<el-table-column prop="dataCount" label="资料课件数" width="100" />
|
||||
<el-table-column label="操作" width="130">
|
||||
<template v-slot="{ row }">
|
||||
<el-button
|
||||
|
@ -89,7 +85,7 @@
|
|||
router.push({
|
||||
path: '/platform_resource_library/curriculum/view',
|
||||
query: {
|
||||
CURRICULUM_ID: row.CURRICULUM_ID, // 课程ID
|
||||
CURRICULUM_ID: row.CURRICULUM_ID,
|
||||
},
|
||||
})
|
||||
"
|
||||
|
@ -107,7 +103,7 @@
|
|||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||
import {
|
||||
getCurriculumList,
|
||||
joinMyCurriculum,
|
||||
setCurriculumJoin,
|
||||
} from "@/request/platform_resource_library.js";
|
||||
import useListData from "@/assets/js/useListData.js";
|
||||
import { serialNumber } from "@/assets/js/utils.js";
|
||||
|
@ -121,7 +117,7 @@ const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
|||
|
||||
const fnAdd = debounce(1000, async (CURRICULUM_ID) => {
|
||||
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
||||
await joinMyCurriculum({ CURRICULUM_ID });
|
||||
await setCurriculumJoin({ CURRICULUM_ID });
|
||||
ElMessage.success("添加成功");
|
||||
fnResetPagination();
|
||||
});
|
|
@ -1,130 +1,107 @@
|
|||
<template>
|
||||
<div>
|
||||
<layout-card>
|
||||
<el-divider content-position="left">课程信息</el-divider>
|
||||
<el-descriptions :column="1" border>
|
||||
<el-descriptions-item label="课程名称">
|
||||
{{ data.curriculumInfo.CURRICULUMNAME }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="培训行业类型">
|
||||
{{
|
||||
data.curriculumInfo.CURRENCY === "1"
|
||||
? "通用"
|
||||
: data.curriculumInfo.train_type_name
|
||||
}}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="岗位培训类型">
|
||||
{{ data.curriculumInfo.post_type_name }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="课程图片">
|
||||
<img
|
||||
:src="FILE_URL + data.curriculumInfo.CAPTURE"
|
||||
width="100"
|
||||
height="100"
|
||||
/>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="课程介绍">
|
||||
{{ data.curriculumInfo.CURRICULUMINTRODUCE }}
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<template v-for="(chapter, index) in data.chapterList" :key="index">
|
||||
<el-divider content-position="left">{{ data.NAME }}</el-divider>
|
||||
<el-divider content-position="left">视频课件</el-divider>
|
||||
<layout-table :data="chapter.xzVideoList" :showPagination="false">
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWARENAME"
|
||||
label="视频课件名称"
|
||||
>
|
||||
<template v-slot="{ row }">
|
||||
<template
|
||||
v-if="
|
||||
(row.VIDEOCOURSEWARE_ID_REMOTE &&
|
||||
row.VIDEOCOURSEWARE_ID_REMOTE.length > 0) ||
|
||||
(row.VIDEOFILES && row.VIDEOFILES.length > 0)
|
||||
"
|
||||
>
|
||||
<a @click="fnPreviewVideo(row)">
|
||||
{{ row.COURSEWARENAME }}
|
||||
</a>
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ row.COURSEWARENAME }}
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="post_type_name"
|
||||
label="岗位培训类型"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="train_type_name"
|
||||
label="培训行业类型"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="CLASSHOUR"
|
||||
label="学时"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWAREINTRODUCE"
|
||||
label="课件描述"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="teacherName"
|
||||
label="讲师"
|
||||
/>
|
||||
</layout-table>
|
||||
<el-divider content-position="left">资料课件</el-divider>
|
||||
<layout-table :data="chapter.xzDataList" :showPagination="false">
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWARENAME"
|
||||
label="资料课件名称"
|
||||
>
|
||||
<template v-slot="{ row }">
|
||||
<template v-if="interceptTheSuffix(row.COURSEWAREFILES, '.pdf')">
|
||||
<a @click="fnPreviewPdf(row.COURSEWAREFILES)">
|
||||
{{ row.COURSEWARENAME }}
|
||||
</a>
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ row.COURSEWARENAME }}
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="post_type_name"
|
||||
label="岗位培训类型"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="train_type_name"
|
||||
label="培训行业类型"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="CLASSHOUR"
|
||||
label="学时"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWAREINTRODUCE"
|
||||
label="课件描述"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="teacherName"
|
||||
label="讲师"
|
||||
/>
|
||||
</layout-table>
|
||||
</template>
|
||||
</layout-card>
|
||||
<layout-card>
|
||||
<el-divider content-position="left">课程信息</el-divider>
|
||||
<el-descriptions :column="1" border>
|
||||
<el-descriptions-item label="课程名称">
|
||||
{{ data.info.CURRICULUMNAME }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="培训行业类型">
|
||||
{{ data.info.CURRENCY === "1" ? "通用" : data.info.train_type_name }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="岗位培训类型">
|
||||
{{ data.info.post_type_name }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="课程图片">
|
||||
<img
|
||||
v-viewer
|
||||
:src="VITE_FILE_URL + data.info.CAPTURE"
|
||||
width="100"
|
||||
height="100"
|
||||
alt=""
|
||||
/>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="课程介绍">
|
||||
{{ data.info.CURRICULUMINTRODUCE }}
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<template v-for="(item, index) in data.chapterList" :key="index">
|
||||
<el-divider content-position="center">{{ item.NAME }}</el-divider>
|
||||
<el-divider content-position="left">视频课件</el-divider>
|
||||
<layout-table :data="item.xzVideoList" :show-pagination="false">
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWARENAME"
|
||||
label="视频课件名称"
|
||||
>
|
||||
<template v-slot="{ row }">
|
||||
<el-button type="primary" text link @click="fnPreviewVideo(row)">
|
||||
{{ row.COURSEWARENAME }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="post_type_name"
|
||||
label="岗位培训类型"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="train_type_name"
|
||||
label="培训行业类型"
|
||||
/>
|
||||
<el-table-column show-overflow-tooltip prop="CLASSHOUR" label="学时" />
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWAREINTRODUCE"
|
||||
label="课件描述"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="teacherName"
|
||||
label="讲师"
|
||||
/>
|
||||
</layout-table>
|
||||
<el-divider content-position="left">资料课件</el-divider>
|
||||
<layout-table :data="item.xzDataList" :show-pagination="false">
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWARENAME"
|
||||
label="资料课件名称"
|
||||
>
|
||||
<template v-slot="{ row }">
|
||||
<el-button
|
||||
type="primary"
|
||||
text
|
||||
link
|
||||
@click="fnPreviewPdf(row.COURSEWAREFILES)"
|
||||
>
|
||||
{{ row.COURSEWARENAME }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="post_type_name"
|
||||
label="岗位培训类型"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="train_type_name"
|
||||
label="培训行业类型"
|
||||
/>
|
||||
<el-table-column show-overflow-tooltip prop="CLASSHOUR" label="学时" />
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="COURSEWAREINTRODUCE"
|
||||
label="课件描述"
|
||||
/>
|
||||
<el-table-column
|
||||
show-overflow-tooltip
|
||||
prop="teacherName"
|
||||
label="讲师"
|
||||
/>
|
||||
</layout-table>
|
||||
</template>
|
||||
<layout-pdf
|
||||
:src="data.pdfDialog.src"
|
||||
v-model:visible="data.pdfDialog.visible"
|
||||
|
@ -135,25 +112,22 @@
|
|||
:play-auth="data.videoDialog.playAuth"
|
||||
v-model:visible="data.videoDialog.visible"
|
||||
/>
|
||||
</div>
|
||||
</layout-card>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { reactive } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
import { getCurriculumInfo } from "@/request/platform_resource_library.js";
|
||||
import { getCurriculumView } from "@/request/platform_resource_library.js";
|
||||
import LayoutPdf from "@/components/pdf/index.vue";
|
||||
import LayoutVideo from "@/components/video/index.vue";
|
||||
import { getVideoAuth, getVideoSource } from "@/request/api.js";
|
||||
import { interceptTheSuffix } from "@/assets/js/utils.js";
|
||||
|
||||
const FILE_URL = import.meta.env.VITE_FILE_URL;
|
||||
import useAliYunVideoPreview from "@/assets/js/useAliYunVideoPreview.js";
|
||||
|
||||
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
|
||||
const route = useRoute();
|
||||
const { CURRICULUM_ID } = route.query;
|
||||
|
||||
const data = reactive({
|
||||
curriculumInfo: {},
|
||||
info: {},
|
||||
chapterList: [],
|
||||
pdfDialog: {
|
||||
src: "",
|
||||
|
@ -166,51 +140,24 @@ const data = reactive({
|
|||
visible: false,
|
||||
},
|
||||
});
|
||||
|
||||
const fnGetCurriculumInfo = async () => {
|
||||
const respData = await getCurriculumInfo({ CURRICULUM_ID });
|
||||
if (respData) {
|
||||
data.curriculumInfo = respData.pd;
|
||||
data.chapterList = respData.chapterList;
|
||||
const fnGetData = async () => {
|
||||
const resData = await getCurriculumView({ CURRICULUM_ID });
|
||||
if (resData) {
|
||||
data.info = resData.pd;
|
||||
data.chapterList = resData.chapterList;
|
||||
}
|
||||
};
|
||||
await fnGetCurriculumInfo();
|
||||
|
||||
fnGetData();
|
||||
const fnPreviewPdf = (FILEPATH) => {
|
||||
data.pdfDialog.visible = true;
|
||||
data.pdfDialog.src = FILEPATH;
|
||||
};
|
||||
|
||||
const fnPreviewVideo = async (row) => {
|
||||
data.videoDialog.src = "";
|
||||
data.videoDialog.vid = "";
|
||||
data.videoDialog.playAuth = "";
|
||||
if (
|
||||
row.VIDEOCOURSEWARE_ID_REMOTE &&
|
||||
row.VIDEOCOURSEWARE_ID_REMOTE.length > 0
|
||||
) {
|
||||
const respData = await getVideoSource({
|
||||
VIDEOCOURSEWARE_ID: row.VIDEOCOURSEWARE_ID_REMOTE,
|
||||
CURRICULUM_ID: row.CURRICULUM_ID_REMOTE,
|
||||
});
|
||||
if (respData && respData.type === "success") {
|
||||
const video = {};
|
||||
respData.videoList?.forEach((item) => {
|
||||
video[item.definition] = item.playURL;
|
||||
});
|
||||
data.videoDialog.src = JSON.stringify(video);
|
||||
data.videoDialog.visible = true;
|
||||
}
|
||||
} else if (row.VIDEOFILES && row.VIDEOFILES.length > 0) {
|
||||
const respData = await getVideoAuth({
|
||||
videoId: row.VIDEOFILES,
|
||||
});
|
||||
if (respData && respData.type === "success") {
|
||||
data.videoDialog.playAuth = respData.playAuth;
|
||||
data.videoDialog.vid = row.VIDEOFILES;
|
||||
data.videoDialog.visible = true;
|
||||
}
|
||||
}
|
||||
const { src, vid, playAuth, visible } = await useAliYunVideoPreview(row);
|
||||
data.videoDialog.src = src;
|
||||
data.videoDialog.vid = vid;
|
||||
data.videoDialog.playAuth = playAuth;
|
||||
data.videoDialog.visible = visible;
|
||||
};
|
||||
</script>
|
||||
|
||||
|
|
|
@ -3,24 +3,24 @@
|
|||
<el-card>
|
||||
<el-form
|
||||
:model="searchForm"
|
||||
label-width="130px"
|
||||
label-width="80px"
|
||||
@submit.prevent="fnResetPagination"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="试卷名称" prop="KEYWORDS">
|
||||
<el-input
|
||||
v-model="searchForm.KEYWORDS"
|
||||
placeholder="请输入试卷名称"
|
||||
/>
|
||||
<el-input v-model="searchForm.KEYWORDS" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
||||
<el-form-item
|
||||
label="岗位培训类型"
|
||||
prop="POSTTYPE"
|
||||
label-width="120px"
|
||||
>
|
||||
<layout-learning-train-type
|
||||
v-model="searchForm.POSTTYPE"
|
||||
type="post"
|
||||
placeholder="请选择岗位培训类型"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
@ -61,7 +61,7 @@
|
|||
label="岗位培训类型"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column label="试题数">
|
||||
<el-table-column label="试题数" width="100">
|
||||
<template v-slot="{ row }">
|
||||
{{
|
||||
Number(row.DUOXUANTICOUNT) +
|
||||
|
@ -70,12 +70,12 @@
|
|||
}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="EXAMSCORE" label="总分数" />
|
||||
<el-table-column prop="PASSSCORE" label="及格分数" />
|
||||
<el-table-column prop="STATE" label="试卷状态">
|
||||
<el-table-column prop="EXAMSCORE" label="总分数" width="100" />
|
||||
<el-table-column prop="PASSSCORE" label="及格分数" width="100" />
|
||||
<el-table-column label="试卷状态" width="100">
|
||||
<template v-slot="{ row }">
|
||||
<template v-if="row.STATE === 0">启用</template>
|
||||
<template v-if="row.STATE === 1">禁用</template>
|
||||
<span v-if="row.STATE === 0">启用</span>
|
||||
<span v-if="row.STATE === 1">禁用</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="130">
|
||||
|
@ -97,7 +97,7 @@
|
|||
router.push({
|
||||
path: '/platform_resource_library/paper/view',
|
||||
query: {
|
||||
STAGEEXAMPAPERINPUT_ID: row.STAGEEXAMPAPERINPUT_ID, // 课程ID
|
||||
STAGEEXAMPAPERINPUT_ID: row.STAGEEXAMPAPERINPUT_ID,
|
||||
},
|
||||
})
|
||||
"
|
||||
|
@ -114,7 +114,7 @@
|
|||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||
import {
|
||||
getPaperList,
|
||||
joinMyPaper,
|
||||
setPaperJoin,
|
||||
} from "@/request/platform_resource_library.js";
|
||||
import useListData from "@/assets/js/useListData.js";
|
||||
import { serialNumber } from "@/assets/js/utils.js";
|
||||
|
@ -125,10 +125,9 @@ import { useRouter } from "vue-router";
|
|||
const router = useRouter();
|
||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||
useListData(getPaperList);
|
||||
|
||||
const fnAdd = debounce(1000, async (STAGEEXAMPAPERINPUT_ID) => {
|
||||
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
||||
await joinMyPaper({ STAGEEXAMPAPERINPUT_ID });
|
||||
await setPaperJoin({ STAGEEXAMPAPERINPUT_ID });
|
||||
ElMessage.success("添加成功");
|
||||
fnResetPagination();
|
||||
});
|
|
@ -1,56 +1,56 @@
|
|||
<template>
|
||||
<layout-card>
|
||||
<el-descriptions :column="2" border>
|
||||
<el-descriptions-item label="试卷名称">
|
||||
{{ data.paperInfo.EXAMNAME }}
|
||||
<el-descriptions-item label="试卷名称" :span="2">
|
||||
{{ data.info.EXAMNAME }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="试卷总分">
|
||||
{{ data.paperInfo.EXAMSCORE }}
|
||||
{{ data.info.EXAMSCORE }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="合格分数">
|
||||
{{ data.paperInfo.PASSSCORE }}
|
||||
{{ data.info.PASSSCORE }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="岗位培训类型">
|
||||
{{ data.paperInfo.post_type_name }}
|
||||
{{ data.info.post_type_name }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="行业培训类型">
|
||||
{{ data.paperInfo.train_type_name }}
|
||||
{{ data.info.train_type_name }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="多选题数">
|
||||
{{ data.paperInfo.DUOXUANTICOUNT }}
|
||||
{{ data.info.DUOXUANTICOUNT }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="多选分数">
|
||||
{{ data.paperInfo.DUOXUANTINUMBER }}
|
||||
{{ data.info.DUOXUANTINUMBER }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="单选题数">
|
||||
{{ data.paperInfo.DANYUANTICOUNT }}
|
||||
{{ data.info.DANYUANTICOUNT }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="单选分数">
|
||||
{{ data.paperInfo.DANXUANTINUMBER }}
|
||||
{{ data.info.DANXUANTINUMBER }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="判断题数">
|
||||
{{ data.paperInfo.PANDUITICOUNT }}
|
||||
{{ data.info.PANDUITICOUNT }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="判断分数">
|
||||
{{ data.paperInfo.PANDUITINUMBER }}
|
||||
{{ data.info.PANDUITINUMBER }}
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
|
||||
<div v-for="(row, index) in data.questionList" :key="row.QUESTION_ID">
|
||||
<div
|
||||
v-for="(row, index) in [
|
||||
...data.questionList,
|
||||
...data.questionList,
|
||||
...data.questionList,
|
||||
]"
|
||||
:key="row.QUESTION_ID"
|
||||
class="item ptb-20"
|
||||
>
|
||||
<div class="mt-20">
|
||||
{{ index + 1 }}.
|
||||
<span v-if="row.QUESTIONTYPE === '1'" class="question-type">
|
||||
(单选题)
|
||||
</span>
|
||||
<span v-if="row.QUESTIONTYPE === '2'" class="question-type">
|
||||
(多选题)
|
||||
</span>
|
||||
<span v-if="row.QUESTIONTYPE === '3'" class="question-type">
|
||||
(判断题)
|
||||
</span>
|
||||
<span v-if="row.QUESTIONTYPE === '1'"> (单选题) </span>
|
||||
<span v-if="row.QUESTIONTYPE === '2'"> (多选题) </span>
|
||||
<span v-if="row.QUESTIONTYPE === '3'"> (判断题) </span>
|
||||
{{ row.QUESTIONDRY }}
|
||||
</div>
|
||||
|
||||
<div class="mt-10 ml-30">
|
||||
<el-radio-group
|
||||
v-if="row.QUESTIONTYPE === '1'"
|
||||
|
@ -89,29 +89,26 @@
|
|||
<script setup>
|
||||
import { reactive } from "vue";
|
||||
import { useRoute } from "vue-router";
|
||||
import { getPaperInfo } from "@/request/platform_resource_library.js";
|
||||
import { getPaperView } from "@/request/platform_resource_library.js";
|
||||
|
||||
const route = useRoute();
|
||||
const { STAGEEXAMPAPERINPUT_ID } = route.query;
|
||||
|
||||
const data = reactive({
|
||||
paperInfo: {},
|
||||
info: {},
|
||||
questionList: [],
|
||||
});
|
||||
|
||||
const fnGetPaperInfo = async () => {
|
||||
const respData = await getPaperInfo({ STAGEEXAMPAPERINPUT_ID });
|
||||
if (respData) {
|
||||
data.paperInfo = respData.pd;
|
||||
data.questionList = respData.inputQue;
|
||||
const fnGetData = async () => {
|
||||
const resData = await getPaperView({ STAGEEXAMPAPERINPUT_ID });
|
||||
if (resData) {
|
||||
data.info = resData.pd;
|
||||
data.questionList = resData.inputQue;
|
||||
}
|
||||
};
|
||||
await fnGetPaperInfo();
|
||||
fnGetData();
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.question-type {
|
||||
font-size: 12px;
|
||||
color: gray;
|
||||
.item {
|
||||
border-bottom: 1px dashed #ebeef5;
|
||||
}
|
||||
</style>
|
||||
|
|
Loading…
Reference in New Issue