forked from integrated_whb/integrated_whb_vue
init
parent
daa59776e3
commit
4bd0189616
|
@ -31,5 +31,6 @@ module.exports = {
|
||||||
BMapGL: "readonly",
|
BMapGL: "readonly",
|
||||||
JSEncrypt: "readonly",
|
JSEncrypt: "readonly",
|
||||||
Aliplayer: "readonly",
|
Aliplayer: "readonly",
|
||||||
|
AliyunUpload: "readonly",
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -17,5 +17,8 @@
|
||||||
<script type="module" src="/src/main.js"></script>
|
<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" />
|
<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 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>
|
</body>
|
||||||
</html>
|
</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: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "",
|
path: "",
|
||||||
component: "platform_resource_library/courseware/video",
|
component: "platform_resource_library/courseware/video/index",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/platform_resource_library/courseware/video/view",
|
path: "/platform_resource_library/courseware/video/view",
|
||||||
|
@ -782,7 +782,7 @@ export default [
|
||||||
title: "课件习题",
|
title: "课件习题",
|
||||||
activeMenu: "/platform_resource_library/courseware/video",
|
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: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "",
|
path: "",
|
||||||
component: "platform_resource_library/courseware/data",
|
component: "platform_resource_library/courseware/data/index",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/platform_resource_library/courseware/data/view",
|
path: "/platform_resource_library/courseware/data/view",
|
||||||
|
@ -801,45 +801,45 @@ export default [
|
||||||
title: "课件习题",
|
title: "课件习题",
|
||||||
activeMenu: "/platform_resource_library/courseware/data",
|
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 },
|
meta: { title: "课程管理", isSubMenu: false },
|
||||||
component: "children",
|
component: "children",
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "",
|
path: "",
|
||||||
component: "platform_resource_library/curriculum/list",
|
component: "platform_resource_library/curriculum/index",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/platform_resource_library/curriculum/view",
|
path: "/platform_resource_library/curriculum/view",
|
||||||
meta: {
|
meta: {
|
||||||
title: "查看详情",
|
title: "查看",
|
||||||
activeMenu: "/platform_resource_library/curriculum/list",
|
activeMenu: "/platform_resource_library/curriculum",
|
||||||
},
|
},
|
||||||
component: "platform_resource_library/curriculum/view",
|
component: "platform_resource_library/curriculum/view",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/platform_resource_library/paper/list",
|
path: "/platform_resource_library/paper",
|
||||||
meta: { title: "试卷管理", isSubMenu: false },
|
meta: { title: "试卷管理", isSubMenu: false },
|
||||||
component: "children",
|
component: "children",
|
||||||
children: [
|
children: [
|
||||||
{
|
{
|
||||||
path: "",
|
path: "",
|
||||||
component: "platform_resource_library/paper/list",
|
component: "platform_resource_library/paper/index",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/platform_resource_library/paper/view",
|
path: "/platform_resource_library/paper/view",
|
||||||
meta: {
|
meta: {
|
||||||
title: "查看试卷",
|
title: "查看",
|
||||||
activeMenu: "/platform_resource_library/paper/list",
|
activeMenu: "/platform_resource_library/paper",
|
||||||
},
|
},
|
||||||
component: "platform_resource_library/paper/view",
|
component: "platform_resource_library/paper/view",
|
||||||
},
|
},
|
||||||
|
@ -869,13 +869,12 @@ export default [
|
||||||
component: "online_learn_exam/courseware/video/index",
|
component: "online_learn_exam/courseware/video/index",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/online_learn_exam/courseware/video/question_list",
|
path: "/online_learn_exam/courseware/video/exercises",
|
||||||
meta: {
|
meta: {
|
||||||
title: "课件习题",
|
title: "课件习题",
|
||||||
activeMenu: "/online_learn_exam/courseware/video",
|
activeMenu: "/online_learn_exam/courseware/video",
|
||||||
},
|
},
|
||||||
component:
|
component: "online_learn_exam/courseware/video/exercises",
|
||||||
"online_learn_exam/courseware/question/question_list",
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
@ -889,18 +888,36 @@ export default [
|
||||||
component: "online_learn_exam/courseware/data/index",
|
component: "online_learn_exam/courseware/data/index",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/online_learn_exam/courseware/data/question_list",
|
path: "/online_learn_exam/courseware/data/exercises",
|
||||||
meta: {
|
meta: {
|
||||||
title: "课件习题",
|
title: "课件习题",
|
||||||
activeMenu: "/online_learn_exam/courseware/data",
|
activeMenu: "/online_learn_exam/courseware/video",
|
||||||
},
|
},
|
||||||
component:
|
component: "online_learn_exam/courseware/data/exercises",
|
||||||
"online_learn_exam/courseware/question/question_list",
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
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));
|
return ref(JSON.parse(resData.zTreeNodes));
|
||||||
};
|
};
|
||||||
|
// 大纲类型
|
||||||
|
export const layoutFnGetOutlineType = async () => {
|
||||||
|
const resData = await getLevels({
|
||||||
|
DICTIONARIES_ID: "3c0d9b5e74834adfacb76139e5d731e5",
|
||||||
|
});
|
||||||
|
return ref(resData.list);
|
||||||
|
};
|
||||||
// 管控措施分类1
|
// 管控措施分类1
|
||||||
export const layoutFnGetControlMeasures1 = async () => {
|
export const layoutFnGetControlMeasures1 = async () => {
|
||||||
const resData = await getLevelsByParentId({
|
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;
|
data.checkList = resData.checkList;
|
||||||
for (let i = 0; i < resData.hImgs.length; i++) {
|
for (let i = 0; i < resData.hImgs.length; i++) {
|
||||||
if (getFileSuffix(resData.hImgs[i].FILEPATH) === "mp4") {
|
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 {
|
} else {
|
||||||
data.hImgs.push(resData.hImgs[i]);
|
data.hImgs.push(resData.hImgs[i]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
<vue-pdf
|
<vue-pdf
|
||||||
v-for="page in numOfPages"
|
v-for="page in numOfPages"
|
||||||
:key="page"
|
:key="page"
|
||||||
:src="VITE_FILE_URL + src"
|
:src="fnSrc(props.src)"
|
||||||
:page="page"
|
:page="page"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
<vue-pdf
|
<vue-pdf
|
||||||
v-for="page in numOfPages"
|
v-for="page in numOfPages"
|
||||||
:key="page"
|
:key="page"
|
||||||
:src="VITE_FILE_URL + src"
|
:src="fnSrc(props.src)"
|
||||||
:page="page"
|
:page="page"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -45,16 +45,27 @@ const props = defineProps({
|
||||||
},
|
},
|
||||||
model: {
|
model: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false,
|
validator: (value) => {
|
||||||
default: "dialog", // 模式: dialog=弹窗, normal=直接显示
|
if (["dialog", "normal"].includes(value)) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
throw new Error("model必须是dialog或normal");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
default: "dialog",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const emits = defineEmits(["update:visible"]);
|
const emits = defineEmits(["update:visible"]);
|
||||||
const visible = useVModel(props, "visible", emits);
|
const visible = useVModel(props, "visible", emits);
|
||||||
const numOfPages = ref(0);
|
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(() => {
|
watchEffect(() => {
|
||||||
if (props.visible || props.src) {
|
if (props.visible || props.src) {
|
||||||
const loadingTask = createLoadingTask(VITE_FILE_URL + props.src);
|
const loadingTask = createLoadingTask(fnSrc(props.src));
|
||||||
loadingTask.promise
|
loadingTask.promise
|
||||||
.then((pdf) => {
|
.then((pdf) => {
|
||||||
numOfPages.value = pdf.numPages;
|
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 setUploadImg = (params) => upload("/imgfiles/add", params); // 上传附件
|
||||||
export const setDeleteImg = (params) => post("/imgfiles/delete", params); // 删除附件
|
export const setDeleteImg = (params) => post("/imgfiles/delete", params); // 删除附件
|
||||||
export const getViewImg = (params) => post("/imgfiles/listImgs", params); // 查看图片
|
export const getViewImg = (params) => post("/imgfiles/listImgs", params); // 查看图片
|
||||||
|
|
||||||
export const getVideoSource = (params) =>
|
export const getVideoSource = (params) =>
|
||||||
post("/videoRes/getVideoPlayAuth", params); // 获取视频 目前404
|
post("/videoRes/getVideoPlayAuth", params); // 获取视频
|
||||||
|
|
||||||
export const getVideoAuth = (params) =>
|
export const getVideoAuth = (params) =>
|
||||||
post("/videocourseware/getVideoPlayAuth", 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) => {
|
.then((res) => {
|
||||||
|
if (
|
||||||
|
res.config.url === "/app/audioOrVideo/createUploadVideo" ||
|
||||||
|
res.config.url === "/app/audioOrVideo/refreshUploadVideo"
|
||||||
|
) {
|
||||||
|
res.data.result = "success";
|
||||||
|
}
|
||||||
if (res.data.result === "success") {
|
if (res.data.result === "success") {
|
||||||
resolve(res.data);
|
resolve(res.data);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -1,33 +1,38 @@
|
||||||
import { post, upload } from "@/request/axios.js";
|
import { post, upload } from "@/request/axios.js";
|
||||||
|
|
||||||
export const getVideoCoursewareList = (params) =>
|
export const getVideoCoursewareList = (params) =>
|
||||||
post("/videocourseware/list", params); // 视频课件维护-获取课件列表
|
post("/videocourseware/list", params); // 视频课件维护列表
|
||||||
|
export const getVideoCoursewareView = (params) =>
|
||||||
export const editVideoCoursewareState = (params) =>
|
post("/videocourseware/goEdit", params); // 视频课件维护查看
|
||||||
post("/videocourseware/editState", params); // 视频课件维护-启用/禁用
|
export const setVideoCoursewareState = (params) =>
|
||||||
|
post("/videocourseware/editState", params); // 视频课件维护启用禁用
|
||||||
export const deleteVideoCourseware = (params) =>
|
export const setVideoCoursewareDelete = (params) =>
|
||||||
post("/videocourseware/delete", 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) =>
|
export const getDataCoursewareList = (params) =>
|
||||||
post("/datacourseware/list", params); // 视频课件维护-获取课件列表
|
post("/datacourseware/list", params); // 资料课件维护列表
|
||||||
|
export const getDataCoursewareView = (params) =>
|
||||||
export const editDataCoursewareState = (params) =>
|
post("/datacourseware/goEdit", params); // 资料课件维护查看
|
||||||
post("/datacourseware/editState", params); // 视频课件维护-启用/禁用
|
export const setDataCoursewareState = (params) =>
|
||||||
|
post("/datacourseware/editState", params); // 资料课件维护启用禁用
|
||||||
export const deleteDataCourseware = (params) =>
|
export const setDataCoursewareDelete = (params) =>
|
||||||
post("/datacourseware/delete", params); // 视频课件维护-删除
|
post("/datacourseware/delete", params); // 资料课件维护删除
|
||||||
|
export const setDataCoursewareAdd = (params) =>
|
||||||
export const getQuestionListByCoursewareIdAndType = (params) =>
|
upload("/datacourseware/add", params); // 资料课件维护添加
|
||||||
post("/question/list", params); // 课件管理-视频/资料课件维护-获取课件习题列表
|
export const setDataCoursewareEdit = (params) =>
|
||||||
|
upload("/datacourseware/edit", params); // 资料课件维护修改
|
||||||
export const deleteQuestion = (params) => post("/question/delete", params); // 课件管理-视频/资料课件维护-删除课件习题
|
export const getExercisesList = (params) => post("/question/list", params); // 课件习题列表
|
||||||
|
export const setExercisesDelete = (params) => post("/question/delete", params); // 删除课件习题
|
||||||
export const deleteQuestionBatch = (params) =>
|
export const setExercisesDeleteBatch = (params) =>
|
||||||
post("/question/deleteAll", params); // 课件管理-视频/资料课件维护-批量删除课件习题
|
post("/question/deleteAll", params); // 批量删除课件习题
|
||||||
|
export const setExercisesImport = (params) =>
|
||||||
export const importQuestion = (params) => upload("/question/readExcel", params); // 课件管理-视频/资料课件维护-导入课件习题
|
upload("/question/readExcel", params); // 导入课件习题
|
||||||
|
export const setExercisesAdd = (params) => post("/question/add", params); // 新增课件习题
|
||||||
export const addQuestion = (params) => upload("/question/add", params); // 课件管理-视频/资料课件维护-新增课件习题
|
export const setExercisesEdit = (params) => post("/question/edit", params); // 修改课件习题
|
||||||
|
export const getCurriculumList = (params) => post("/curriculum/list", params); // 课程管理列表
|
||||||
export const editQuestion = (params) => upload("/question/edit", 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";
|
import { post } from "@/request/axios.js";
|
||||||
|
|
||||||
export const getVideoCoursewareList = (params) =>
|
export const getVideoCoursewareList = (params) =>
|
||||||
post("/platform/videocourseware/list", params); // 课件资源管理-视频课件列表
|
post("/platform/videocourseware/list", params); // 课件资源管理视频课件列表
|
||||||
|
|
||||||
export const getDataCoursewareList = (params) =>
|
export const getDataCoursewareList = (params) =>
|
||||||
post("/platform/datacourseware/list", params); // 课件资源管理-资料课件列表
|
post("/platform/datacourseware/list", params); // 课件资源管理资料课件列表
|
||||||
|
export const setVideoCoursewareJoin = (params) =>
|
||||||
export const joinMyVideoCourseware = (params) =>
|
post("/platform/videocourseware/joinMyCourseware", params); // 课件资源管理视频课件添加
|
||||||
post("/platform/videocourseware/joinMyCourseware", params); // 课件资源管理-视频课件-添加
|
export const setDataCoursewareJoin = (params) =>
|
||||||
|
post("/platform/datacourseware/joinMyCourseware", params); // 课件资源管理资料课件添加
|
||||||
export const joinMyDataCourseware = (params) =>
|
|
||||||
post("/platform/datacourseware/joinMyCourseware", params); // 课件资源管理-资料课件-添加
|
|
||||||
|
|
||||||
export const getQuestionListByCoursewareIdAndType = (params) =>
|
export const getQuestionListByCoursewareIdAndType = (params) =>
|
||||||
post("/platform/question/list", params); // 课件资源管理-获取课件习题
|
post("/platform/question/list", params); // 课件资源管理课件习题列表
|
||||||
|
|
||||||
export const getCurriculumList = (params) =>
|
export const getCurriculumList = (params) =>
|
||||||
post("/platform/curriculum/list", params); // 课程管理-获取课程列表
|
post("/platform/curriculum/list", params); // 课程管理-获取课程列表
|
||||||
|
export const setCurriculumJoin = (params) =>
|
||||||
export const joinMyCurriculum = (params) =>
|
post("/platform/curriculum/joinMyCurriculum", params); // 课程管理添加
|
||||||
post("/platform/curriculum/joinMyCurriculum", params); // 课件资源管理-资料课件-添加
|
export const getCurriculumView = (params) =>
|
||||||
|
post("/platform/curriculum/goEdit", params); // 课程管理查看
|
||||||
export const getCurriculumInfo = (params) =>
|
|
||||||
post("/platform/curriculum/goEdit", params); // 课件资源管理-获取课程详情信息
|
|
||||||
|
|
||||||
export const getPaperList = (params) =>
|
export const getPaperList = (params) =>
|
||||||
post("/platform/stageexampaperinput/list", params); // 试卷管理-获取课程列表
|
post("/platform/stageexampaperinput/list", params); // 试卷管理列表
|
||||||
|
export const setPaperJoin = (params) =>
|
||||||
export const joinMyPaper = (params) =>
|
post("/platform/stageexampaperinput/joinMyPaper", params); // 试卷管理添加
|
||||||
post("/platform/stageexampaperinput/joinMyPaper", params); // 试卷管理-添加
|
export const getPaperView = (params) =>
|
||||||
|
post("/platform/stageexampaperinput/goEdit", params); // 试卷管理查看
|
||||||
export const getPaperInfo = (params) =>
|
|
||||||
post("/platform/stageexampaperinput/goEdit", params); // 试卷管理-获取试卷详情信息
|
|
||||||
|
|
|
@ -137,10 +137,10 @@ const fnGetArchivesFileList = async () => {
|
||||||
if (year.value && year.value.length > 0) {
|
if (year.value && year.value.length > 0) {
|
||||||
params.YEAR = year.value;
|
params.YEAR = year.value;
|
||||||
}
|
}
|
||||||
const respData = await getArchivesFileList(params);
|
const resData = await getArchivesFileList(params);
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.fileList = respData.varList;
|
data.fileList = resData.varList;
|
||||||
data.form.file = respData.varList;
|
data.form.file = resData.varList;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetArchivesFileList();
|
await fnGetArchivesFileList();
|
||||||
|
@ -148,11 +148,11 @@ await fnGetArchivesFileList();
|
||||||
const fnDeleteArchivesFile = async (row) => {
|
const fnDeleteArchivesFile = async (row) => {
|
||||||
if (row) {
|
if (row) {
|
||||||
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
||||||
const respData = await deleteArchivesFile({
|
const resData = await deleteArchivesFile({
|
||||||
ARCHIVESFILES_ID: row.ARCHIVESFILES_ID,
|
ARCHIVESFILES_ID: row.ARCHIVESFILES_ID,
|
||||||
FILE_PATH: row.FILE_PATH,
|
FILE_PATH: row.FILE_PATH,
|
||||||
});
|
});
|
||||||
if (respData && respData.result === "success") {
|
if (resData && resData.result === "success") {
|
||||||
await fnGetArchivesFileList();
|
await fnGetArchivesFileList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -220,9 +220,9 @@ const fnDeleteArchivesCapital = async () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const fnGetArchivesCapitalList = async () => {
|
const fnGetArchivesCapitalList = async () => {
|
||||||
const respData = await getArchivesCapitalList({ YEAR: year.value });
|
const resData = await getArchivesCapitalList({ YEAR: year.value });
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.dataList = respData.varList;
|
data.dataList = resData.varList;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetArchivesCapitalList();
|
await fnGetArchivesCapitalList();
|
||||||
|
|
|
@ -246,13 +246,13 @@ const fnSubmit = debounce(
|
||||||
async () => {
|
async () => {
|
||||||
await useFormValidate(formRef);
|
await useFormValidate(formRef);
|
||||||
const params = Object.assign({}, data.form);
|
const params = Object.assign({}, data.form);
|
||||||
let respData;
|
let resData;
|
||||||
if (type.value === "add") {
|
if (type.value === "add") {
|
||||||
respData = await addArchivesCapital(params);
|
resData = await addArchivesCapital(params);
|
||||||
} else if (type.value === "edit") {
|
} 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");
|
emits("getData");
|
||||||
fnClose();
|
fnClose();
|
||||||
}
|
}
|
||||||
|
@ -270,11 +270,11 @@ const fnGetArchivesCapital = async () => {
|
||||||
ARCHIVESCAPITAL_ID.value &&
|
ARCHIVESCAPITAL_ID.value &&
|
||||||
ARCHIVESCAPITAL_ID.value.length > 0
|
ARCHIVESCAPITAL_ID.value.length > 0
|
||||||
) {
|
) {
|
||||||
const respData = await getArchivesCapital({
|
const resData = await getArchivesCapital({
|
||||||
ARCHIVESCAPITAL_ID: ARCHIVESCAPITAL_ID.value,
|
ARCHIVESCAPITAL_ID: ARCHIVESCAPITAL_ID.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.form = respData.pd;
|
data.form = resData.pd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -189,9 +189,9 @@ const fnDelete = async () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const fnGetList = async () => {
|
const fnGetList = async () => {
|
||||||
const respData = await getArchivesEdumanagerList({ YEAR: year.value });
|
const resData = await getArchivesEdumanagerList({ YEAR: year.value });
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.dataList = respData.varList;
|
data.dataList = resData.varList;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetList();
|
await fnGetList();
|
||||||
|
|
|
@ -171,13 +171,13 @@ const fnSubmit = debounce(
|
||||||
async () => {
|
async () => {
|
||||||
await useFormValidate(formRef);
|
await useFormValidate(formRef);
|
||||||
const params = Object.assign({}, data.form);
|
const params = Object.assign({}, data.form);
|
||||||
let respData;
|
let resData;
|
||||||
if (type.value === "add") {
|
if (type.value === "add") {
|
||||||
respData = await addArchivesEdumanager(params);
|
resData = await addArchivesEdumanager(params);
|
||||||
} else if (type.value === "edit") {
|
} 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");
|
emits("getData");
|
||||||
fnClose();
|
fnClose();
|
||||||
}
|
}
|
||||||
|
@ -195,11 +195,11 @@ const fnGetData = async () => {
|
||||||
ARCHIVESEDUMANAGER_ID.value &&
|
ARCHIVESEDUMANAGER_ID.value &&
|
||||||
ARCHIVESEDUMANAGER_ID.value.length > 0
|
ARCHIVESEDUMANAGER_ID.value.length > 0
|
||||||
) {
|
) {
|
||||||
const respData = await getArchivesEdumanager({
|
const resData = await getArchivesEdumanager({
|
||||||
ARCHIVESEDUMANAGER_ID: ARCHIVESEDUMANAGER_ID.value,
|
ARCHIVESEDUMANAGER_ID: ARCHIVESEDUMANAGER_ID.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.form = respData.pd;
|
data.form = resData.pd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -192,9 +192,9 @@ const fnDelete = async () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const fnGetList = async () => {
|
const fnGetList = async () => {
|
||||||
const respData = await getArchivesEduplanList({ YEAR: year.value });
|
const resData = await getArchivesEduplanList({ YEAR: year.value });
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.dataList = respData.varList;
|
data.dataList = resData.varList;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetList();
|
await fnGetList();
|
||||||
|
|
|
@ -174,13 +174,13 @@ const fnSubmit = debounce(
|
||||||
async () => {
|
async () => {
|
||||||
await useFormValidate(formRef);
|
await useFormValidate(formRef);
|
||||||
const params = Object.assign({}, data.form);
|
const params = Object.assign({}, data.form);
|
||||||
let respData;
|
let resData;
|
||||||
if (type.value === "add") {
|
if (type.value === "add") {
|
||||||
respData = await addArchivesEduplan(params);
|
resData = await addArchivesEduplan(params);
|
||||||
} else if (type.value === "edit") {
|
} 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");
|
emits("getData");
|
||||||
fnClose();
|
fnClose();
|
||||||
}
|
}
|
||||||
|
@ -198,11 +198,11 @@ const fnGetData = async () => {
|
||||||
ARCHIVESEDUPLAN_ID.value &&
|
ARCHIVESEDUPLAN_ID.value &&
|
||||||
ARCHIVESEDUPLAN_ID.value.length > 0
|
ARCHIVESEDUPLAN_ID.value.length > 0
|
||||||
) {
|
) {
|
||||||
const respData = await getArchivesEduplan({
|
const resData = await getArchivesEduplan({
|
||||||
ARCHIVESEDUPLAN_ID: ARCHIVESEDUPLAN_ID.value,
|
ARCHIVESEDUPLAN_ID: ARCHIVESEDUPLAN_ID.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.form = respData.pd;
|
data.form = resData.pd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -169,9 +169,9 @@ const fnDelete = async () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const fnGetList = async () => {
|
const fnGetList = async () => {
|
||||||
const respData = await getArchivesPostmanList({ YEAR: year.value });
|
const resData = await getArchivesPostmanList({ YEAR: year.value });
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.dataList = respData.varList;
|
data.dataList = resData.varList;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetList();
|
await fnGetList();
|
||||||
|
|
|
@ -146,13 +146,13 @@ const fnSubmit = debounce(
|
||||||
async () => {
|
async () => {
|
||||||
await useFormValidate(formRef);
|
await useFormValidate(formRef);
|
||||||
const params = Object.assign({}, data.form);
|
const params = Object.assign({}, data.form);
|
||||||
let respData;
|
let resData;
|
||||||
if (type.value === "add") {
|
if (type.value === "add") {
|
||||||
respData = await addArchivesPostman(params);
|
resData = await addArchivesPostman(params);
|
||||||
} else if (type.value === "edit") {
|
} 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");
|
emits("getData");
|
||||||
fnClose();
|
fnClose();
|
||||||
}
|
}
|
||||||
|
@ -170,11 +170,11 @@ const fnGetData = async () => {
|
||||||
ARCHIVES_POSTMAN_ID.value &&
|
ARCHIVES_POSTMAN_ID.value &&
|
||||||
ARCHIVES_POSTMAN_ID.value.length > 0
|
ARCHIVES_POSTMAN_ID.value.length > 0
|
||||||
) {
|
) {
|
||||||
const respData = await getArchivesPostman({
|
const resData = await getArchivesPostman({
|
||||||
ARCHIVES_POSTMAN_ID: ARCHIVES_POSTMAN_ID.value,
|
ARCHIVES_POSTMAN_ID: ARCHIVES_POSTMAN_ID.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.form = respData.pd;
|
data.form = resData.pd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -184,9 +184,9 @@ const fnDelete = async () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const fnGetList = async () => {
|
const fnGetList = async () => {
|
||||||
const respData = await getArchivesTeacherList({ YEAR: year.value });
|
const resData = await getArchivesTeacherList({ YEAR: year.value });
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.dataList = respData.varList;
|
data.dataList = resData.varList;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetList();
|
await fnGetList();
|
||||||
|
|
|
@ -183,13 +183,13 @@ const fnSubmit = debounce(
|
||||||
async () => {
|
async () => {
|
||||||
await useFormValidate(formRef);
|
await useFormValidate(formRef);
|
||||||
const params = Object.assign({}, data.form);
|
const params = Object.assign({}, data.form);
|
||||||
let respData;
|
let resData;
|
||||||
if (type.value === "add") {
|
if (type.value === "add") {
|
||||||
respData = await addArchivesTeacher(params);
|
resData = await addArchivesTeacher(params);
|
||||||
} else if (type.value === "edit") {
|
} 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");
|
emits("getData");
|
||||||
fnClose();
|
fnClose();
|
||||||
}
|
}
|
||||||
|
@ -207,11 +207,11 @@ const fnGetData = async () => {
|
||||||
ARCHIVESTEACHER_ID.value &&
|
ARCHIVESTEACHER_ID.value &&
|
||||||
ARCHIVESTEACHER_ID.value.length > 0
|
ARCHIVESTEACHER_ID.value.length > 0
|
||||||
) {
|
) {
|
||||||
const respData = await getArchivesTeacher({
|
const resData = await getArchivesTeacher({
|
||||||
ARCHIVESTEACHER_ID: ARCHIVESTEACHER_ID.value,
|
ARCHIVESTEACHER_ID: ARCHIVESTEACHER_ID.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.form = respData.pd;
|
data.form = resData.pd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -129,10 +129,10 @@ const fnGetArchivesFileList = async () => {
|
||||||
if (year.value && year.value.length > 0) {
|
if (year.value && year.value.length > 0) {
|
||||||
params.YEAR = year.value;
|
params.YEAR = year.value;
|
||||||
}
|
}
|
||||||
const respData = await getArchivesFileList(params);
|
const resData = await getArchivesFileList(params);
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.fileList = respData.varList;
|
data.fileList = resData.varList;
|
||||||
data.form.file = respData.varList;
|
data.form.file = resData.varList;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetArchivesFileList();
|
await fnGetArchivesFileList();
|
||||||
|
@ -140,11 +140,11 @@ await fnGetArchivesFileList();
|
||||||
const fnDeleteArchivesFile = async (row) => {
|
const fnDeleteArchivesFile = async (row) => {
|
||||||
if (row) {
|
if (row) {
|
||||||
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
||||||
const respData = await deleteArchivesFile({
|
const resData = await deleteArchivesFile({
|
||||||
ARCHIVESFILES_ID: row.ARCHIVESFILES_ID,
|
ARCHIVESFILES_ID: row.ARCHIVESFILES_ID,
|
||||||
FILE_PATH: row.FILE_PATH,
|
FILE_PATH: row.FILE_PATH,
|
||||||
});
|
});
|
||||||
if (respData && respData.result === "success") {
|
if (resData && resData.result === "success") {
|
||||||
await fnGetArchivesFileList();
|
await fnGetArchivesFileList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,11 +87,11 @@ const fnClose = () => {
|
||||||
|
|
||||||
const fnGetStudyTaskInfo = async () => {
|
const fnGetStudyTaskInfo = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getStudyTaskInfo({
|
const resData = await getStudyTaskInfo({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.taskInfo = respData.pd;
|
data.taskInfo = resData.pd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -99,11 +99,11 @@ await fnGetStudyTaskInfo();
|
||||||
|
|
||||||
const fnGetAllCoursewareByHandout = async () => {
|
const fnGetAllCoursewareByHandout = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getAllCoursewareByHandout({
|
const resData = await getAllCoursewareByHandout({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.coursewareList = respData.varList;
|
data.coursewareList = resData.varList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -166,11 +166,11 @@ const fnClose = () => {
|
||||||
|
|
||||||
const fnGetStudyTaskInfo = async () => {
|
const fnGetStudyTaskInfo = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getStudyTaskInfo({
|
const resData = await getStudyTaskInfo({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.taskInfo = respData.pd;
|
data.taskInfo = resData.pd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -178,18 +178,18 @@ await fnGetStudyTaskInfo();
|
||||||
|
|
||||||
const fnGetPaperByTaskId = async () => {
|
const fnGetPaperByTaskId = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getPaperByTaskId({
|
const resData = await getPaperByTaskId({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData.paper) {
|
if (resData.paper) {
|
||||||
if (respData.paper) {
|
if (resData.paper) {
|
||||||
data.paperInfo = respData.paper;
|
data.paperInfo = resData.paper;
|
||||||
}
|
}
|
||||||
data.paperInfo.selectList = [];
|
data.paperInfo.selectList = [];
|
||||||
data.paperInfo.multiList = [];
|
data.paperInfo.multiList = [];
|
||||||
data.paperInfo.judgeList = [];
|
data.paperInfo.judgeList = [];
|
||||||
if (respData.questionList && respData.questionList.length > 0) {
|
if (resData.questionList && resData.questionList.length > 0) {
|
||||||
respData.questionList.forEach((question) => {
|
resData.questionList.forEach((question) => {
|
||||||
if (question.QUESTIONTYPE === "1") {
|
if (question.QUESTIONTYPE === "1") {
|
||||||
data.paperInfo.selectList.push(question);
|
data.paperInfo.selectList.push(question);
|
||||||
} else if (question.QUESTIONTYPE === "2") {
|
} else if (question.QUESTIONTYPE === "2") {
|
||||||
|
|
|
@ -148,11 +148,11 @@ const fnClose = () => {
|
||||||
|
|
||||||
const fnGetStudyTaskInfo = async () => {
|
const fnGetStudyTaskInfo = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getStudyTaskInfo({
|
const resData = await getStudyTaskInfo({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.taskInfo = respData.pd;
|
data.taskInfo = resData.pd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -160,11 +160,11 @@ await fnGetStudyTaskInfo();
|
||||||
|
|
||||||
const fnGetAllCurriculum = async () => {
|
const fnGetAllCurriculum = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getAllCurriculum({
|
const resData = await getAllCurriculum({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.curriculumList = respData.varList;
|
data.curriculumList = resData.varList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -172,11 +172,11 @@ await fnGetAllCurriculum();
|
||||||
|
|
||||||
const fnGetStudentByTaskId = async () => {
|
const fnGetStudentByTaskId = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getStudentByTaskId({
|
const resData = await getStudentByTaskId({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.studentList = respData.varList;
|
data.studentList = resData.varList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -253,11 +253,11 @@ const fnClose = () => {
|
||||||
|
|
||||||
const fnGetStudyTaskInfo = async () => {
|
const fnGetStudyTaskInfo = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getStudyTaskInfo({
|
const resData = await getStudyTaskInfo({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.taskInfo = respData.pd;
|
data.taskInfo = resData.pd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -265,11 +265,11 @@ await fnGetStudyTaskInfo();
|
||||||
|
|
||||||
const fnGetAllCoursewareByHandout = async () => {
|
const fnGetAllCoursewareByHandout = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getAllCourseware({
|
const resData = await getAllCourseware({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.coursewareList = respData.varList;
|
data.coursewareList = resData.varList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -277,11 +277,11 @@ await fnGetAllCoursewareByHandout();
|
||||||
|
|
||||||
const fnGetStudentByTaskId = async () => {
|
const fnGetStudentByTaskId = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getStudentByTaskId({
|
const resData = await getStudentByTaskId({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.studentList = respData.varList;
|
data.studentList = resData.varList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -157,11 +157,11 @@ const fnClose = () => {
|
||||||
|
|
||||||
const fnGetStudyTaskInfo = async () => {
|
const fnGetStudyTaskInfo = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getStudyTaskInfo({
|
const resData = await getStudyTaskInfo({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.taskInfo = respData.pd;
|
data.taskInfo = resData.pd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -169,11 +169,11 @@ await fnGetStudyTaskInfo();
|
||||||
|
|
||||||
const fnGetAllCoursewareByHandout = async () => {
|
const fnGetAllCoursewareByHandout = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getAllCourseware({
|
const resData = await getAllCourseware({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.coursewareList = respData.varList;
|
data.coursewareList = resData.varList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -181,11 +181,11 @@ await fnGetAllCoursewareByHandout();
|
||||||
|
|
||||||
const fnGetStudentByTaskId = async () => {
|
const fnGetStudentByTaskId = async () => {
|
||||||
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
if (studyTaskId && studyTaskId.value && studyTaskId.value.length > 0) {
|
||||||
const respData = await getStudentByTaskId({
|
const resData = await getStudentByTaskId({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.studentList = respData.varList;
|
data.studentList = resData.varList;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -200,11 +200,11 @@ const fnDelete = async () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const fnGetList = async () => {
|
const fnGetList = async () => {
|
||||||
const respData = await getArchivesTrainingScheduleList({
|
const resData = await getArchivesTrainingScheduleList({
|
||||||
STUDYTASK_ID: studyTaskId.value,
|
STUDYTASK_ID: studyTaskId.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.dataList = respData.varList;
|
data.dataList = resData.varList;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetList();
|
await fnGetList();
|
||||||
|
|
|
@ -164,13 +164,13 @@ const fnSubmit = debounce(
|
||||||
async () => {
|
async () => {
|
||||||
await useFormValidate(formRef);
|
await useFormValidate(formRef);
|
||||||
const params = Object.assign({}, data.form);
|
const params = Object.assign({}, data.form);
|
||||||
let respData;
|
let resData;
|
||||||
if (type.value === "add") {
|
if (type.value === "add") {
|
||||||
respData = await addArchivesTrainingSchedule(params);
|
resData = await addArchivesTrainingSchedule(params);
|
||||||
} else if (type.value === "edit") {
|
} 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");
|
emits("getData");
|
||||||
fnClose();
|
fnClose();
|
||||||
}
|
}
|
||||||
|
@ -188,11 +188,11 @@ const fnGetData = async () => {
|
||||||
TRAININGSCHEDULE_ID.value &&
|
TRAININGSCHEDULE_ID.value &&
|
||||||
TRAININGSCHEDULE_ID.value.length > 0
|
TRAININGSCHEDULE_ID.value.length > 0
|
||||||
) {
|
) {
|
||||||
const respData = await getArchivesTrainingSchedule({
|
const resData = await getArchivesTrainingSchedule({
|
||||||
TRAININGSCHEDULE_ID: TRAININGSCHEDULE_ID.value,
|
TRAININGSCHEDULE_ID: TRAININGSCHEDULE_ID.value,
|
||||||
});
|
});
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.form = respData.pd;
|
data.form = resData.pd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -165,9 +165,9 @@ const fnClose = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const fnGetUserInfo = async () => {
|
const fnGetUserInfo = async () => {
|
||||||
const respData = await getUserInfo({ USER_ID: userId.value });
|
const resData = await getUserInfo({ USER_ID: userId.value });
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.userInfo = respData.pd;
|
data.userInfo = resData.pd;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetUserInfo();
|
await fnGetUserInfo();
|
||||||
|
|
|
@ -498,45 +498,45 @@ const data_count = computed(() => {
|
||||||
});
|
});
|
||||||
|
|
||||||
const fnGetStudyTaskInfo = async () => {
|
const fnGetStudyTaskInfo = async () => {
|
||||||
const respData = await getStudyTaskInfo({ STUDYTASK_ID });
|
const resData = await getStudyTaskInfo({ STUDYTASK_ID });
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.studyTaskInfo = respData.pd;
|
data.studyTaskInfo = resData.pd;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetStudyTaskInfo();
|
await fnGetStudyTaskInfo();
|
||||||
|
|
||||||
const fnGetAllCourseware = async () => {
|
const fnGetAllCourseware = async () => {
|
||||||
const respData = await getAllCourseware({ STUDYTASK_ID });
|
const resData = await getAllCourseware({ STUDYTASK_ID });
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.curriculumList = respData.varList;
|
data.curriculumList = resData.varList;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetAllCourseware();
|
await fnGetAllCourseware();
|
||||||
|
|
||||||
const fnGetUserInfo = async () => {
|
const fnGetUserInfo = async () => {
|
||||||
const respData = await getUserInfo({ USER_ID });
|
const resData = await getUserInfo({ USER_ID });
|
||||||
if (respData && respData.pd) {
|
if (resData && resData.pd) {
|
||||||
data.userInfo = respData.pd;
|
data.userInfo = resData.pd;
|
||||||
data.checkPerType.push(data.userInfo.PERSONNEL_TYPE);
|
data.checkPerType.push(data.userInfo.PERSONNEL_TYPE);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetUserInfo();
|
await fnGetUserInfo();
|
||||||
|
|
||||||
const fnGetPersonnelType = async () => {
|
const fnGetPersonnelType = async () => {
|
||||||
const respData = await layoutFnGetPersonnelType();
|
const resData = await layoutFnGetPersonnelType();
|
||||||
if (respData) {
|
if (resData) {
|
||||||
data.personalTypeList = respData;
|
data.personalTypeList = resData;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetPersonnelType();
|
await fnGetPersonnelType();
|
||||||
|
|
||||||
const fnGetArchivesPaper = async () => {
|
const fnGetArchivesPaper = async () => {
|
||||||
const respData = await getArchivesPaper({ STUDYTASK_ID, USER_ID });
|
const resData = await getArchivesPaper({ STUDYTASK_ID, USER_ID });
|
||||||
if (respData) {
|
if (resData) {
|
||||||
data.paper.isExam = respData.isExam;
|
data.paper.isExam = resData.isExam;
|
||||||
data.paper.info = respData.paper;
|
data.paper.info = resData.paper;
|
||||||
data.paper.questionList = respData.questionList;
|
data.paper.questionList = resData.questionList;
|
||||||
respData.questionList.forEach((question) => {
|
resData.questionList.forEach((question) => {
|
||||||
if (question.QUESTIONTYPE === "1") {
|
if (question.QUESTIONTYPE === "1") {
|
||||||
data.paper.selectList.push(question);
|
data.paper.selectList.push(question);
|
||||||
} else if (question.QUESTIONTYPE === "2") {
|
} else if (question.QUESTIONTYPE === "2") {
|
||||||
|
@ -550,21 +550,21 @@ const fnGetArchivesPaper = async () => {
|
||||||
await fnGetArchivesPaper();
|
await fnGetArchivesPaper();
|
||||||
|
|
||||||
const fnGetSignByStudyTask = async () => {
|
const fnGetSignByStudyTask = async () => {
|
||||||
const respData = await getSignByStudyTask({ STUDYTASK_ID });
|
const resData = await getSignByStudyTask({ STUDYTASK_ID });
|
||||||
if (respData && respData.varList) {
|
if (resData && resData.varList) {
|
||||||
data.signList = respData.varList;
|
data.signList = resData.varList;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetSignByStudyTask();
|
await fnGetSignByStudyTask();
|
||||||
|
|
||||||
const fnGetUserExamScoreByStudyTaskId = async () => {
|
const fnGetUserExamScoreByStudyTaskId = async () => {
|
||||||
const respData = await getUserExamScoreByStudyTaskId({
|
const resData = await getUserExamScoreByStudyTaskId({
|
||||||
STUDYTASK_ID,
|
STUDYTASK_ID,
|
||||||
USER_ID,
|
USER_ID,
|
||||||
});
|
});
|
||||||
if (respData) {
|
if (resData) {
|
||||||
data.examScore.USER_SIGN_PATH = respData.USER_SIGN_PATH;
|
data.examScore.USER_SIGN_PATH = resData.USER_SIGN_PATH;
|
||||||
data.examScore.userExamScore = respData.userExamScore;
|
data.examScore.userExamScore = resData.userExamScore;
|
||||||
if (
|
if (
|
||||||
data.examScore.userExamScore &&
|
data.examScore.userExamScore &&
|
||||||
Object.keys(data.examScore.userExamScore).length > 0
|
Object.keys(data.examScore.userExamScore).length > 0
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
:autosize="{
|
:autosize="{
|
||||||
minRows: 3,
|
minRows: 3,
|
||||||
}"
|
}"
|
||||||
placeholder="这里输入意见..."
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<template #footer>
|
<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-card>
|
||||||
<el-form
|
<el-form
|
||||||
:model="searchForm"
|
:model="searchForm"
|
||||||
label-width="130px"
|
label-width="110px"
|
||||||
@submit.prevent="fnResetPagination"
|
@submit.prevent="fnResetPagination"
|
||||||
>
|
>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="课程名称" prop="KEYWORDS">
|
<el-form-item label="课程名称" prop="KEYWORDS">
|
||||||
<el-input
|
<el-input v-model="searchForm.KEYWORDS" />
|
||||||
v-model="searchForm.KEYWORDS"
|
|
||||||
placeholder="请输入课程名称"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="教师名称" prop="SPEAKER">
|
<el-form-item label="教师名称" prop="SPEAKER">
|
||||||
<el-input
|
<el-input v-model="searchForm.SPEAKER" />
|
||||||
v-model="searchForm.SPEAKER"
|
|
||||||
placeholder="请输入教师名称"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="培训板块类型" prop="trainingSectionKey">
|
<el-form-item label="培训板块类型" prop="trainingSectionKey">
|
||||||
<layout-learning-train-type
|
<layout-learning-train-type
|
||||||
v-model="searchForm.trainingSectionKey"
|
v-model="searchForm.trainingSectionKey"
|
||||||
type="post"
|
type="plate"
|
||||||
placeholder="请选择培训板块类型"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="培训行业类型" prop="TRAINTYPE">
|
<el-form-item label="培训行业类型" prop="TRAINTYPE">
|
||||||
<layout-learning-train-type
|
<layout-learning-train-type
|
||||||
v-model="searchForm.TRAINTYPE"
|
v-model="searchForm.TRAINTYPE"
|
||||||
type="post"
|
type="industry"
|
||||||
placeholder="请选择培训行业类型"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
||||||
<layout-learning-train-type
|
<layout-learning-train-type
|
||||||
v-model="searchForm.POSTTYPE"
|
v-model="searchForm.POSTTYPE"
|
||||||
type="post"
|
type="post"
|
||||||
placeholder="请选择岗位培训类型"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="课件状态" prop="STATE">
|
<el-form-item label="课件状态" prop="STATE">
|
||||||
<el-select v-model="searchForm.STATE" placeholder="请选择状态">
|
<el-select v-model="searchForm.STATE">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in data.courseStates"
|
v-for="item in stateList"
|
||||||
:key="item.value"
|
:key="item.ID"
|
||||||
:label="item.label"
|
:label="item.NAME"
|
||||||
:value="item.value"
|
:value="item.ID"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
@ -67,20 +58,6 @@
|
||||||
<el-button native-type="reset" @click="fnResetPagination">
|
<el-button native-type="reset" @click="fnResetPagination">
|
||||||
重置
|
重置
|
||||||
</el-button>
|
</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-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
@ -113,21 +90,16 @@
|
||||||
label="培训行业类型"
|
label="培训行业类型"
|
||||||
/>
|
/>
|
||||||
<el-table-column prop="SPEAKER" label="讲师名称" />
|
<el-table-column prop="SPEAKER" label="讲师名称" />
|
||||||
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" />
|
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" width="120" />
|
||||||
<el-table-column
|
<el-table-column
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
prop="trainingSectionName"
|
prop="trainingSectionName"
|
||||||
label="培训板块"
|
label="培训板块"
|
||||||
/>
|
/>
|
||||||
<el-table-column prop="CREATTIME" label="上传时间" />
|
<el-table-column prop="CREATTIME" label="上传时间" width="150" />
|
||||||
<el-table-column prop="STATE" label="课件状态">
|
<el-table-column prop="STATE" label="课件状态" width="80">
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<template v-if="row.STATE === 0">
|
{{ translationStatus(row.STATE, stateList) }}
|
||||||
<div>启用</div>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="row.STATE === 1">
|
|
||||||
<div>禁用</div>
|
|
||||||
</template>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="300">
|
<el-table-column label="操作" width="300">
|
||||||
|
@ -136,7 +108,6 @@
|
||||||
type="primary"
|
type="primary"
|
||||||
text
|
text
|
||||||
link
|
link
|
||||||
v-if="interceptTheSuffix(row.COURSEWAREFILES, '.pdf')"
|
|
||||||
@click="fnPreviewPdf(row.COURSEWAREFILES)"
|
@click="fnPreviewPdf(row.COURSEWAREFILES)"
|
||||||
>
|
>
|
||||||
预览
|
预览
|
||||||
|
@ -169,8 +140,9 @@
|
||||||
row.STAGECOUNT === 0 &&
|
row.STAGECOUNT === 0 &&
|
||||||
row.ISPLATFORM === '0'
|
row.ISPLATFORM === '0'
|
||||||
"
|
"
|
||||||
|
@click="fnAddOrEdit(row.DATACOURSEWARE_ID, 'edit')"
|
||||||
>
|
>
|
||||||
修改<!-- todo -->
|
修改
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
|
@ -192,10 +164,10 @@
|
||||||
link
|
link
|
||||||
@click="
|
@click="
|
||||||
router.push({
|
router.push({
|
||||||
path: '/online_learn_exam/courseware/data/question_list',
|
path: '/online_learn_exam/courseware/data/exercises',
|
||||||
query: {
|
query: {
|
||||||
COURSE_ID: row.DATACOURSEWARE_ID, // 课件ID
|
COURSEWAREID: row.DATACOURSEWARE_ID,
|
||||||
COURSE_TYPE: '2', // 课件类型(1:视频课件、2:资料课件)
|
COURSEWARETYPE: '2',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
"
|
"
|
||||||
|
@ -205,8 +177,12 @@
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<template #button>
|
<template #button>
|
||||||
<el-button v-if="buttonJurisdiction.add" type="primary">
|
<el-button
|
||||||
新增<!-- todo -->
|
v-if="buttonJurisdiction.add"
|
||||||
|
type="primary"
|
||||||
|
@click="fnAddOrEdit('', 'add')"
|
||||||
|
>
|
||||||
|
新增
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</layout-table>
|
</layout-table>
|
||||||
|
@ -215,77 +191,125 @@
|
||||||
:src="data.pdfDialog.src"
|
:src="data.pdfDialog.src"
|
||||||
v-model:visible="data.pdfDialog.visible"
|
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>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||||
import {
|
import {
|
||||||
getDataCoursewareList,
|
getDataCoursewareList,
|
||||||
editDataCoursewareState,
|
getDataCoursewareView,
|
||||||
deleteDataCourseware,
|
setDataCoursewareDelete,
|
||||||
|
setDataCoursewareState,
|
||||||
} from "@/request/online_learn_exam.js";
|
} from "@/request/online_learn_exam.js";
|
||||||
import useListData from "@/assets/js/useListData.js";
|
import useListData from "@/assets/js/useListData.js";
|
||||||
import { reactive } from "vue";
|
import { nextTick, reactive } from "vue";
|
||||||
import { interceptTheSuffix, serialNumber } from "@/assets/js/utils.js";
|
import {
|
||||||
import { ArrowDown, ArrowUp } from "@element-plus/icons-vue";
|
getFileName,
|
||||||
|
serialNumber,
|
||||||
|
translationStatus,
|
||||||
|
} from "@/assets/js/utils.js";
|
||||||
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
|
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import LayoutPdf from "@/components/pdf/index.vue";
|
import LayoutPdf from "@/components/pdf/index.vue";
|
||||||
import { debounce } from "throttle-debounce";
|
import { debounce } from "throttle-debounce";
|
||||||
|
import { useUserStore } from "@/pinia/user.js";
|
||||||
|
import Add from "./components/add.vue";
|
||||||
|
|
||||||
const router = useRouter();
|
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 } =
|
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||||
useListData(getDataCoursewareList);
|
useListData(getDataCoursewareList);
|
||||||
|
const buttonJurisdiction = await useButtonJurisdiction("courseware");
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
courseStates: [
|
|
||||||
{ value: "0", label: "启用" },
|
|
||||||
{ value: "1", label: "禁用" },
|
|
||||||
],
|
|
||||||
searchFromUnfolded: false,
|
|
||||||
pdfDialog: {
|
pdfDialog: {
|
||||||
src: "",
|
src: "",
|
||||||
visible: false,
|
visible: false,
|
||||||
},
|
},
|
||||||
|
addOrEditDialog: {
|
||||||
|
visible: false,
|
||||||
|
type: "",
|
||||||
|
form: {
|
||||||
|
COURSEWARENAME: "",
|
||||||
|
trainingSection: [],
|
||||||
|
TRAINTYPE: "",
|
||||||
|
POSTTYPE: "",
|
||||||
|
CLASSHOUR: 1,
|
||||||
|
SPEAKER: "",
|
||||||
|
file: [],
|
||||||
|
screenshotFile: [],
|
||||||
|
COURSEWAREINTRODUCE: "",
|
||||||
|
ONTLINETYPE: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const fnPreviewPdf = (FILEPATH) => {
|
const fnPreviewPdf = (FILEPATH) => {
|
||||||
data.pdfDialog.visible = true;
|
data.pdfDialog.visible = true;
|
||||||
data.pdfDialog.src = FILEPATH;
|
data.pdfDialog.src = FILEPATH;
|
||||||
};
|
};
|
||||||
|
|
||||||
const fnEditState = debounce(
|
const fnEditState = debounce(
|
||||||
1000,
|
1000,
|
||||||
async (DATACOURSEWARE_ID, STATE) => {
|
async (DATACOURSEWARE_ID, STATE) => {
|
||||||
const respData = await editDataCoursewareState({
|
const message = STATE === 1 ? "禁用" : "启用";
|
||||||
|
await ElMessageBox.confirm(`确定要${message}吗?`, { type: "warning" });
|
||||||
|
await setDataCoursewareState({
|
||||||
DATACOURSEWARE_ID,
|
DATACOURSEWARE_ID,
|
||||||
STATE,
|
STATE,
|
||||||
});
|
});
|
||||||
if (respData && respData.result === "success") {
|
ElMessage.success(`${message}成功`);
|
||||||
ElMessage.success("设置成功");
|
fnResetPagination();
|
||||||
await fnGetData();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{ atBegin: true }
|
{ atBegin: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
const fnDelete = debounce(
|
const fnDelete = debounce(
|
||||||
1000,
|
1000,
|
||||||
async (DATACOURSEWARE_ID) => {
|
async (DATACOURSEWARE_ID) => {
|
||||||
if (DATACOURSEWARE_ID) {
|
if (DATACOURSEWARE_ID) {
|
||||||
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
||||||
const respData = await deleteDataCourseware({ DATACOURSEWARE_ID });
|
await setDataCoursewareDelete({ DATACOURSEWARE_ID });
|
||||||
if (respData && respData.result === "success") {
|
ElMessage.success("删除成功");
|
||||||
ElMessage.success("删除成功");
|
fnResetPagination();
|
||||||
await fnGetData();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ atBegin: true }
|
{ 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>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss"></style>
|
<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-card>
|
||||||
<el-form
|
<el-form
|
||||||
:model="searchForm"
|
:model="searchForm"
|
||||||
label-width="130px"
|
label-width="40px"
|
||||||
@submit.prevent="fnResetPaginationTransfer"
|
@submit.prevent="fnResetPagination"
|
||||||
>
|
>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="题干" prop="KEYWORDS">
|
<el-form-item label="题干" prop="KEYWORDS">
|
||||||
<el-input
|
<el-input v-model="searchForm.KEYWORDS" />
|
||||||
v-model="searchForm.KEYWORDS"
|
|
||||||
placeholder="请输入题干"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label-width="10px">
|
<el-form-item label-width="10px">
|
||||||
<el-button type="primary" native-type="submit">搜索</el-button>
|
<el-button type="primary" native-type="submit">搜索</el-button>
|
||||||
|
<el-button native-type="reset" @click="fnResetPagination">
|
||||||
|
重置
|
||||||
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6"></el-col>
|
<el-col :span="6"></el-col>
|
||||||
|
@ -34,40 +34,29 @@
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
row-key="QUESTION_ID"
|
row-key="QUESTION_ID"
|
||||||
:data="list"
|
:data="list"
|
||||||
@get-data="fnGetDataTransfer"
|
@get-data="fnGetData"
|
||||||
v-model:pagination="pagination"
|
v-model:pagination="pagination"
|
||||||
>
|
>
|
||||||
<el-table-column reserve-selection type="selection" width="55" />
|
<el-table-column reserve-selection type="selection" width="55" />
|
||||||
<el-table-column prop="QUESTIONNUMBER" label="题号" width="60" />
|
<el-table-column prop="QUESTIONNUMBER" label="题号" width="60" />
|
||||||
<el-table-column
|
<el-table-column label="试题类型" width="80">
|
||||||
prop="QUESTIONTYPE"
|
|
||||||
label="试题类型"
|
|
||||||
show-overflow-tooltip
|
|
||||||
width="80"
|
|
||||||
>
|
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
{{ fnFormatterQuestionType(row) }}
|
{{ translationStatus(row.QUESTIONTYPE, questionTypeOptions) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
prop="QUESTIONDRY"
|
prop="QUESTIONDRY"
|
||||||
label="题干"
|
label="题干"
|
||||||
align="left"
|
|
||||||
/>
|
/>
|
||||||
<el-table-column
|
<el-table-column label="答案" width="55">
|
||||||
show-overflow-tooltip
|
|
||||||
prop="ANSWER"
|
|
||||||
label="答案"
|
|
||||||
width="55"
|
|
||||||
>
|
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<template v-if="row.QUESTIONTYPE === '3'">
|
<template v-if="row.QUESTIONTYPE === '3'">
|
||||||
<div v-if="row.ANSWER === 'A'">正确</div>
|
<span v-if="row.ANSWER === 'A'">正确</span>
|
||||||
<div v-if="row.ANSWER === 'B'">错误</div>
|
<span v-if="row.ANSWER === 'B'">错误</span>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div>{{ row.ANSWER }}</div>
|
<span>{{ row.ANSWER }}</span>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
@ -85,7 +74,7 @@
|
||||||
row.COURSEEXAMCOUNT === 0 &&
|
row.COURSEEXAMCOUNT === 0 &&
|
||||||
row.STAGEEXAMCOUNT === 0
|
row.STAGEEXAMCOUNT === 0
|
||||||
"
|
"
|
||||||
@click="fnAddOrEdit(row)"
|
@click="fnAddOrEdit(row, 'edit')"
|
||||||
>
|
>
|
||||||
修改
|
修改
|
||||||
</el-button>
|
</el-button>
|
||||||
|
@ -111,7 +100,7 @@
|
||||||
<el-button
|
<el-button
|
||||||
v-if="buttonJurisdiction.add"
|
v-if="buttonJurisdiction.add"
|
||||||
type="primary"
|
type="primary"
|
||||||
@click="fnAddOrEdit(null)"
|
@click="fnAddOrEdit({}, 'add')"
|
||||||
>
|
>
|
||||||
新增
|
新增
|
||||||
</el-button>
|
</el-button>
|
||||||
|
@ -134,95 +123,69 @@
|
||||||
v-model:visible="data.addOrEditDialog.visible"
|
v-model:visible="data.addOrEditDialog.visible"
|
||||||
v-model:form="data.addOrEditDialog.form"
|
v-model:form="data.addOrEditDialog.form"
|
||||||
:type="data.addOrEditDialog.type"
|
:type="data.addOrEditDialog.type"
|
||||||
@get-data="fnResetPaginationTransfer"
|
:courseware-id="COURSEWAREID"
|
||||||
|
:courseware-type="COURSEWARETYPE"
|
||||||
|
@get-data="fnResetPagination"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import {
|
import {
|
||||||
importQuestion,
|
setExercisesImport,
|
||||||
deleteQuestion,
|
setExercisesDelete,
|
||||||
deleteQuestionBatch,
|
setExercisesDeleteBatch,
|
||||||
getQuestionListByCoursewareIdAndType,
|
getExercisesList,
|
||||||
} from "@/request/online_learn_exam.js";
|
} from "@/request/online_learn_exam.js";
|
||||||
import useListData from "@/assets/js/useListData.js";
|
import useListData from "@/assets/js/useListData.js";
|
||||||
import { reactive } from "vue";
|
import { nextTick, reactive } from "vue";
|
||||||
import { useRoute } from "vue-router";
|
import { useRoute } from "vue-router";
|
||||||
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
|
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
|
||||||
import { debounce } from "throttle-debounce";
|
import { debounce } from "throttle-debounce";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import LayoutImportFile from "@/components/import_file/index.vue";
|
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 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 } =
|
const { list, pagination, searchForm, fnGetData, fnResetPagination, tableRef } =
|
||||||
useListData(getQuestionListByCoursewareIdAndType, {
|
useListData(getExercisesList, {
|
||||||
otherParams: { COURSEWAREID: COURSE_ID, COURSEWARETYPE: COURSE_TYPE },
|
otherParams: { COURSEWAREID, COURSEWARETYPE },
|
||||||
});
|
});
|
||||||
|
|
||||||
const buttonJurisdiction = await useButtonJurisdiction("courseware");
|
const buttonJurisdiction = await useButtonJurisdiction("courseware");
|
||||||
|
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
importDialogVisible: false,
|
importDialogVisible: false,
|
||||||
questionTypeOptions: [
|
|
||||||
{
|
|
||||||
value: "1",
|
|
||||||
label: "单选题",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "2",
|
|
||||||
label: "多选题",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "3",
|
|
||||||
label: "判断题",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
addOrEditDialog: {
|
addOrEditDialog: {
|
||||||
visible: false,
|
visible: false,
|
||||||
form: {},
|
form: {
|
||||||
|
QUESTIONTYPE: "",
|
||||||
|
QUESTIONDRY: "",
|
||||||
|
OPTIONA: "",
|
||||||
|
OPTIONB: "",
|
||||||
|
OPTIONC: "",
|
||||||
|
OPTIOND: "",
|
||||||
|
ANSWER: "",
|
||||||
|
},
|
||||||
type: "add",
|
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(
|
const fnDelete = debounce(
|
||||||
1000,
|
1000,
|
||||||
async (QUESTION_ID) => {
|
async (QUESTION_ID) => {
|
||||||
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
||||||
await deleteQuestion({ QUESTION_ID });
|
await setExercisesDelete({ QUESTION_ID });
|
||||||
ElMessage.success("删除成功");
|
ElMessage.success("删除成功");
|
||||||
fnGetDataTransfer();
|
fnResetPagination();
|
||||||
},
|
},
|
||||||
{ atBegin: true }
|
{ atBegin: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
const fnBatchDelete = debounce(
|
const fnBatchDelete = debounce(
|
||||||
1000,
|
1000,
|
||||||
async () => {
|
async () => {
|
||||||
|
@ -232,38 +195,29 @@ const fnBatchDelete = debounce(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await ElMessageBox.confirm("确定要删除选中的数据吗?", { type: "warning" });
|
await ElMessageBox.confirm("确定要删除选中的数据吗?", { type: "warning" });
|
||||||
const DATA_IDS = selectionData.map((item) => item.RISKUNIT_ID).join(",");
|
const DATA_IDS = selectionData.map((item) => item.QUESTION_ID).join(",");
|
||||||
await deleteQuestionBatch({ DATA_IDS });
|
await setExercisesDeleteBatch({ DATA_IDS });
|
||||||
ElMessage.success("删除成功");
|
ElMessage.success("删除成功");
|
||||||
fnResetPaginationTransfer();
|
fnResetPagination();
|
||||||
},
|
},
|
||||||
{ atBegin: true }
|
{ atBegin: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
const fnImportDialogChangeShow = () => {
|
const fnImportDialogChangeShow = () => {
|
||||||
data.importDialogVisible = !data.importDialogVisible;
|
data.importDialogVisible = !data.importDialogVisible;
|
||||||
};
|
};
|
||||||
|
|
||||||
const fnSubmitImport = async (formData) => {
|
const fnSubmitImport = async (formData) => {
|
||||||
formData.append("COURSEWARETYPE", COURSE_TYPE);
|
formData.append("COURSEWARETYPE", COURSEWARETYPE);
|
||||||
formData.append("COURSEWAREID", COURSE_ID);
|
formData.append("COURSEWAREID", COURSEWAREID);
|
||||||
const respData = await importQuestion(formData);
|
const resData = await setExercisesImport(formData);
|
||||||
ElMessage.success(respData.msg);
|
ElMessage.success(resData.msg);
|
||||||
fnImportDialogChangeShow();
|
fnImportDialogChangeShow();
|
||||||
fnResetPaginationTransfer();
|
fnResetPagination();
|
||||||
};
|
};
|
||||||
|
const fnAddOrEdit = async (row, type) => {
|
||||||
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";
|
|
||||||
}
|
|
||||||
data.addOrEditDialog.visible = true;
|
data.addOrEditDialog.visible = true;
|
||||||
|
await nextTick();
|
||||||
|
data.addOrEditDialog.type = type;
|
||||||
|
if (type === "edit") data.addOrEditDialog.form = cloneDeep(row);
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -2,61 +2,52 @@
|
||||||
<el-card>
|
<el-card>
|
||||||
<el-form
|
<el-form
|
||||||
:model="searchForm"
|
:model="searchForm"
|
||||||
label-width="130px"
|
label-width="110px"
|
||||||
@submit.prevent="fnResetPagination"
|
@submit.prevent="fnResetPagination"
|
||||||
>
|
>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="课程名称" prop="KEYWORDS">
|
<el-form-item label="课程名称" prop="KEYWORDS">
|
||||||
<el-input
|
<el-input v-model="searchForm.KEYWORDS" />
|
||||||
v-model="searchForm.KEYWORDS"
|
|
||||||
placeholder="请输入课程名称"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="教师名称" prop="SPEAKER">
|
<el-form-item label="教师名称" prop="SPEAKER">
|
||||||
<el-input
|
<el-input v-model="searchForm.SPEAKER" />
|
||||||
v-model="searchForm.SPEAKER"
|
|
||||||
placeholder="请输入教师名称"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="培训板块类型" prop="trainingSectionKey">
|
<el-form-item label="培训板块类型" prop="trainingSectionKey">
|
||||||
<layout-learning-train-type
|
<layout-learning-train-type
|
||||||
v-model="searchForm.trainingSectionKey"
|
v-model="searchForm.trainingSectionKey"
|
||||||
type="post"
|
type="plate"
|
||||||
placeholder="请选择培训板块类型"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="培训行业类型" prop="TRAINTYPE">
|
<el-form-item label="培训行业类型" prop="TRAINTYPE">
|
||||||
<layout-learning-train-type
|
<layout-learning-train-type
|
||||||
v-model="searchForm.TRAINTYPE"
|
v-model="searchForm.TRAINTYPE"
|
||||||
type="post"
|
type="industry"
|
||||||
placeholder="请选择培训行业类型"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
||||||
<layout-learning-train-type
|
<layout-learning-train-type
|
||||||
v-model="searchForm.POSTTYPE"
|
v-model="searchForm.POSTTYPE"
|
||||||
type="post"
|
type="post"
|
||||||
placeholder="请选择岗位培训类型"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col v-show="data.searchFromUnfolded" :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="课件状态" prop="STATE">
|
<el-form-item label="课件状态" prop="STATE">
|
||||||
<el-select v-model="searchForm.STATE" placeholder="请选择状态">
|
<el-select v-model="searchForm.STATE">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in data.courseStates"
|
v-for="item in stateList"
|
||||||
:key="item.value"
|
:key="item.ID"
|
||||||
:label="item.label"
|
:label="item.NAME"
|
||||||
:value="item.value"
|
:value="item.ID"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
@ -67,20 +58,6 @@
|
||||||
<el-button native-type="reset" @click="fnResetPagination">
|
<el-button native-type="reset" @click="fnResetPagination">
|
||||||
重置
|
重置
|
||||||
</el-button>
|
</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-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
@ -113,47 +90,28 @@
|
||||||
label="培训行业类型"
|
label="培训行业类型"
|
||||||
/>
|
/>
|
||||||
<el-table-column prop="SPEAKER" label="讲师名称" />
|
<el-table-column prop="SPEAKER" label="讲师名称" />
|
||||||
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" />
|
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" width="120" />
|
||||||
<el-table-column
|
<el-table-column
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
prop="trainingSectionName"
|
prop="trainingSectionName"
|
||||||
label="培训板块"
|
label="培训板块"
|
||||||
/>
|
/>
|
||||||
<el-table-column prop="CREATTIME" label="上传时间" />
|
<el-table-column prop="CREATTIME" label="上传时间" width="150" />
|
||||||
<el-table-column prop="STATE" label="课件状态">
|
<el-table-column prop="STATE" label="课件状态" width="80">
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<template v-if="row.STATE === 0">
|
{{ translationStatus(row.STATE, stateList) }}
|
||||||
<div>启用</div>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="row.STATE === 1">
|
|
||||||
<div>禁用</div>
|
|
||||||
</template>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</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-slot="{ row }">
|
||||||
<template v-if="row.CURRICULUM_ID_REMOTE">
|
<span v-if="row.CURRICULUM_ID_REMOTE">商城</span>
|
||||||
<div>商城</div>
|
<span v-else>自传</span>
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<div>自传</div>
|
|
||||||
</template>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="NUMEXAMPLE" label="习题数" />
|
<el-table-column prop="NUMEXAMPLE" label="习题数" width="80" />
|
||||||
<el-table-column label="操作" width="300">
|
<el-table-column label="操作" width="300">
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<el-button
|
<el-button type="primary" text link @click="fnPreviewVideo(row)">
|
||||||
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>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
|
@ -184,8 +142,9 @@
|
||||||
row.STAGECOUNT === 0 &&
|
row.STAGECOUNT === 0 &&
|
||||||
row.ISPLATFORM === 0
|
row.ISPLATFORM === 0
|
||||||
"
|
"
|
||||||
|
@click="fnAddOrEdit(row.VIDEOCOURSEWARE_ID, 'edit')"
|
||||||
>
|
>
|
||||||
修改<!-- todo -->
|
修改
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
|
@ -207,10 +166,10 @@
|
||||||
link
|
link
|
||||||
@click="
|
@click="
|
||||||
router.push({
|
router.push({
|
||||||
path: '/online_learn_exam/courseware/video/question_list',
|
path: '/online_learn_exam/courseware/video/exercises',
|
||||||
query: {
|
query: {
|
||||||
COURSE_ID: row.VIDEOCOURSEWARE_ID, // 课件ID
|
COURSEWAREID: row.VIDEOCOURSEWARE_ID,
|
||||||
COURSE_TYPE: '1', // 课件类型(1:视频课件、2:资料课件)
|
COURSEWARETYPE: '1',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
"
|
"
|
||||||
|
@ -220,8 +179,12 @@
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<template #button>
|
<template #button>
|
||||||
<el-button v-if="buttonJurisdiction.add" type="primary">
|
<el-button
|
||||||
新增<!-- todo -->
|
v-if="buttonJurisdiction.add"
|
||||||
|
type="primary"
|
||||||
|
@click="fnAddOrEdit('', 'add')"
|
||||||
|
>
|
||||||
|
新增
|
||||||
</el-button>
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</layout-table>
|
</layout-table>
|
||||||
|
@ -232,107 +195,129 @@
|
||||||
:play-auth="data.videoDialog.playAuth"
|
:play-auth="data.videoDialog.playAuth"
|
||||||
v-model:visible="data.videoDialog.visible"
|
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>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||||
import {
|
import {
|
||||||
getVideoCoursewareList,
|
getVideoCoursewareList,
|
||||||
editVideoCoursewareState,
|
setVideoCoursewareState,
|
||||||
deleteVideoCourseware,
|
setVideoCoursewareDelete,
|
||||||
|
getVideoCoursewareView,
|
||||||
} from "@/request/online_learn_exam.js";
|
} from "@/request/online_learn_exam.js";
|
||||||
import useListData from "@/assets/js/useListData.js";
|
import useListData from "@/assets/js/useListData.js";
|
||||||
import { reactive } from "vue";
|
import { nextTick, reactive } from "vue";
|
||||||
import { serialNumber } from "@/assets/js/utils.js";
|
import {
|
||||||
|
getFileName,
|
||||||
|
serialNumber,
|
||||||
|
translationStatus,
|
||||||
|
} from "@/assets/js/utils.js";
|
||||||
import LayoutVideo from "@/components/video/index.vue";
|
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 useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { debounce } from "throttle-debounce";
|
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 router = useRouter();
|
||||||
const buttonJurisdiction = await useButtonJurisdiction("courseware");
|
const userStore = useUserStore();
|
||||||
|
const stateList = [
|
||||||
|
{ ID: 0, NAME: "启用" },
|
||||||
|
{ ID: 1, NAME: "禁用" },
|
||||||
|
];
|
||||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||||
useListData(getVideoCoursewareList);
|
useListData(getVideoCoursewareList);
|
||||||
|
const buttonJurisdiction = await useButtonJurisdiction("courseware");
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
courseStates: [
|
|
||||||
{ value: "0", label: "启用" },
|
|
||||||
{ value: "1", label: "禁用" },
|
|
||||||
],
|
|
||||||
searchFromUnfolded: false,
|
|
||||||
videoDialog: {
|
videoDialog: {
|
||||||
src: "",
|
src: "",
|
||||||
vid: "",
|
vid: "",
|
||||||
playAuth: "",
|
playAuth: "",
|
||||||
visible: false,
|
visible: false,
|
||||||
},
|
},
|
||||||
|
addOrEditDialog: {
|
||||||
|
visible: false,
|
||||||
|
type: "",
|
||||||
|
form: {
|
||||||
|
COURSEWARENAME: "",
|
||||||
|
trainingSection: [],
|
||||||
|
TRAINTYPE: "",
|
||||||
|
POSTTYPE: "",
|
||||||
|
SPEAKER: "",
|
||||||
|
file: [],
|
||||||
|
screenshotFile: [],
|
||||||
|
COURSEWAREINTRODUCE: "",
|
||||||
|
ONTLINETYPE: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const fnPreviewVideo = async (row) => {
|
const fnPreviewVideo = async (row) => {
|
||||||
data.videoDialog.src = "";
|
const { src, vid, playAuth, visible } = await useAliYunVideoPreview(row);
|
||||||
data.videoDialog.vid = "";
|
data.videoDialog.src = src;
|
||||||
data.videoDialog.playAuth = "";
|
data.videoDialog.vid = vid;
|
||||||
if (
|
data.videoDialog.playAuth = playAuth;
|
||||||
row.VIDEOCOURSEWARE_ID_REMOTE &&
|
data.videoDialog.visible = visible;
|
||||||
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 fnEditState = debounce(
|
const fnEditState = debounce(
|
||||||
1000,
|
1000,
|
||||||
async (VIDEOCOURSEWARE_ID, STATE) => {
|
async (VIDEOCOURSEWARE_ID, STATE) => {
|
||||||
const respData = await editVideoCoursewareState({
|
const message = STATE === 1 ? "禁用" : "启用";
|
||||||
|
await ElMessageBox.confirm(`确定要${message}吗?`, { type: "warning" });
|
||||||
|
await setVideoCoursewareState({
|
||||||
VIDEOCOURSEWARE_ID,
|
VIDEOCOURSEWARE_ID,
|
||||||
STATE,
|
STATE,
|
||||||
});
|
});
|
||||||
if (respData && respData.result === "success") {
|
ElMessage.success(`${message}成功`);
|
||||||
ElMessage.success("设置成功");
|
fnResetPagination();
|
||||||
await fnGetData();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{ atBegin: true }
|
{ atBegin: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
const fnDelete = debounce(
|
const fnDelete = debounce(
|
||||||
1000,
|
1000,
|
||||||
async (VIDEOCOURSEWARE_ID) => {
|
async (VIDEOCOURSEWARE_ID) => {
|
||||||
if (VIDEOCOURSEWARE_ID) {
|
if (VIDEOCOURSEWARE_ID) {
|
||||||
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
|
||||||
const respData = await deleteVideoCourseware({ VIDEOCOURSEWARE_ID });
|
await setVideoCoursewareDelete({ VIDEOCOURSEWARE_ID });
|
||||||
if (respData && respData.result === "success") {
|
ElMessage.success("删除成功");
|
||||||
ElMessage.success("删除成功");
|
fnResetPagination();
|
||||||
await fnGetData();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{ atBegin: true }
|
{ 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>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss"></style>
|
<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-card>
|
||||||
<el-form
|
<el-form
|
||||||
:model="searchForm"
|
:model="searchForm"
|
||||||
label-width="130px"
|
label-width="90px"
|
||||||
@submit.prevent="fnResetPagination"
|
@submit.prevent="fnResetPagination"
|
||||||
>
|
>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="课程名称" prop="KEYWORDS">
|
<el-form-item label="课程名称" prop="KEYWORDS">
|
||||||
<el-input
|
<el-input v-model="searchForm.KEYWORDS" />
|
||||||
v-model="searchForm.KEYWORDS"
|
|
||||||
placeholder="请输入课程名称"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
<el-form-item
|
||||||
|
label="岗位培训类型"
|
||||||
|
prop="POSTTYPE"
|
||||||
|
label-width="120"
|
||||||
|
>
|
||||||
<layout-learning-train-type
|
<layout-learning-train-type
|
||||||
v-model="searchForm.POSTTYPE"
|
v-model="searchForm.POSTTYPE"
|
||||||
type="post"
|
type="post"
|
||||||
placeholder="请选择岗位培训类型"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="课件状态" prop="STATE">
|
<el-form-item label="课件状态" prop="STATE">
|
||||||
<el-select v-model="searchForm.STATE" placeholder="请选择状态">
|
<el-select v-model="searchForm.STATE">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in data.courseStates"
|
v-for="item in stateList"
|
||||||
:key="item.value"
|
:key="item.ID"
|
||||||
:label="item.label"
|
:label="item.NAME"
|
||||||
:value="item.value"
|
:value="item.ID"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
@ -68,27 +68,22 @@
|
||||||
label="岗位培训类型"
|
label="岗位培训类型"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
/>
|
||||||
<el-table-column
|
<el-table-column show-overflow-tooltip label="培训行业类型">
|
||||||
show-overflow-tooltip
|
|
||||||
prop="train_type_name"
|
|
||||||
label="培训行业类型"
|
|
||||||
>
|
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<div v-if="row.CURRENCY === '1'">通用</div>
|
<span v-if="row.CURRENCY === '1'">通用</span>
|
||||||
<div v-else>{{ row.train_type_name }}</div>
|
<span v-else>{{ row.train_type_name }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="teacherName" label="讲师名称" />
|
<el-table-column prop="teacherName" label="讲师名称" />
|
||||||
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" />
|
<el-table-column
|
||||||
<el-table-column prop="CREATTIME" label="上传时间" />
|
prop="CLASSHOUR"
|
||||||
<el-table-column prop="STATE" label="课件状态">
|
label="课件学时(分钟)"
|
||||||
|
width="120"
|
||||||
|
/>
|
||||||
|
<el-table-column prop="CREATTIME" label="上传时间" width="140" />
|
||||||
|
<el-table-column label="课件状态" width="100">
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<template v-if="row.STATE === 0">
|
{{ translationStatus(row.STATE, stateList) }}
|
||||||
<div>启用</div>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="row.STATE === 1">
|
|
||||||
<div>禁用</div>
|
|
||||||
</template>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="200">
|
<el-table-column label="操作" width="200">
|
||||||
|
@ -119,8 +114,8 @@
|
||||||
router.push({
|
router.push({
|
||||||
path: '/platform_resource_library/courseware/data/view',
|
path: '/platform_resource_library/courseware/data/view',
|
||||||
query: {
|
query: {
|
||||||
COURSE_ID: row.DATACOURSEWARE_ID, // 课件ID
|
COURSEWAREID: row.DATACOURSEWARE_ID,
|
||||||
COURSE_TYPE: '2', // 课件类型(1:视频课件、2:资料课件)
|
COURSEWARETYPE: '2',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
"
|
"
|
||||||
|
@ -142,11 +137,15 @@
|
||||||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||||
import {
|
import {
|
||||||
getDataCoursewareList,
|
getDataCoursewareList,
|
||||||
joinMyDataCourseware,
|
setDataCoursewareJoin,
|
||||||
} from "@/request/platform_resource_library.js";
|
} from "@/request/platform_resource_library.js";
|
||||||
import useListData from "@/assets/js/useListData.js";
|
import useListData from "@/assets/js/useListData.js";
|
||||||
import { reactive } from "vue";
|
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 { debounce } from "throttle-debounce";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
|
@ -155,12 +154,11 @@ import LayoutPdf from "@/components/pdf/index.vue";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||||
useListData(getDataCoursewareList);
|
useListData(getDataCoursewareList);
|
||||||
|
const stateList = [
|
||||||
|
{ ID: 0, NAME: "启用" },
|
||||||
|
{ ID: 1, NAME: "禁用" },
|
||||||
|
];
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
courseStates: [
|
|
||||||
{ value: "0", label: "启用" },
|
|
||||||
{ value: "1", label: "禁用" },
|
|
||||||
],
|
|
||||||
pdfDialog: {
|
pdfDialog: {
|
||||||
src: "",
|
src: "",
|
||||||
visible: false,
|
visible: false,
|
||||||
|
@ -168,7 +166,7 @@ const data = reactive({
|
||||||
});
|
});
|
||||||
const fnAdd = debounce(1000, async (DATACOURSEWARE_ID) => {
|
const fnAdd = debounce(1000, async (DATACOURSEWARE_ID) => {
|
||||||
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
||||||
await joinMyDataCourseware({ COURSEWARE_ID: DATACOURSEWARE_ID });
|
await setDataCoursewareJoin({ COURSEWARE_ID: DATACOURSEWARE_ID });
|
||||||
ElMessage.success("添加成功");
|
ElMessage.success("添加成功");
|
||||||
fnResetPagination();
|
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-card>
|
||||||
<el-form
|
<el-form
|
||||||
:model="searchForm"
|
:model="searchForm"
|
||||||
label-width="130px"
|
label-width="80px"
|
||||||
@submit.prevent="fnResetPagination"
|
@submit.prevent="fnResetPagination"
|
||||||
>
|
>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="课程名称" prop="KEYWORDS">
|
<el-form-item label="课程名称" prop="KEYWORDS">
|
||||||
<el-input
|
<el-input v-model="searchForm.KEYWORDS" />
|
||||||
v-model="searchForm.KEYWORDS"
|
|
||||||
placeholder="请输入课程名称"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
<el-form-item
|
||||||
|
label="岗位培训类型"
|
||||||
|
prop="POSTTYPE"
|
||||||
|
label-width="120"
|
||||||
|
>
|
||||||
<layout-learning-train-type
|
<layout-learning-train-type
|
||||||
v-model="searchForm.POSTTYPE"
|
v-model="searchForm.POSTTYPE"
|
||||||
type="post"
|
type="post"
|
||||||
placeholder="请选择岗位培训类型"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="课件状态" prop="STATE">
|
<el-form-item label="课件状态" prop="STATE">
|
||||||
<el-select v-model="searchForm.STATE" placeholder="请选择状态">
|
<el-select v-model="searchForm.STATE">
|
||||||
<el-option
|
<el-option
|
||||||
v-for="item in data.courseStates"
|
v-for="item in stateList"
|
||||||
:key="item.value"
|
:key="item.ID"
|
||||||
:label="item.label"
|
:label="item.NAME"
|
||||||
:value="item.value"
|
:value="item.ID"
|
||||||
/>
|
/>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
@ -68,53 +68,34 @@
|
||||||
label="岗位培训类型"
|
label="岗位培训类型"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
/>
|
||||||
<el-table-column
|
<el-table-column show-overflow-tooltip label="培训行业类型">
|
||||||
show-overflow-tooltip
|
|
||||||
prop="train_type_name"
|
|
||||||
label="培训行业类型"
|
|
||||||
>
|
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<div v-if="row.CURRENCY === '1'">通用</div>
|
<span v-if="row.CURRENCY === '1'">通用</span>
|
||||||
<div v-else>{{ row.train_type_name }}</div>
|
<span v-else>{{ row.train_type_name }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="teacherName" label="讲师名称" />
|
<el-table-column prop="teacherName" label="讲师名称" />
|
||||||
<el-table-column prop="CLASSHOUR" label="课件学时(分钟)" />
|
<el-table-column
|
||||||
<el-table-column prop="CREATTIME" label="上传时间" />
|
prop="CLASSHOUR"
|
||||||
<el-table-column prop="STATE" label="课件状态">
|
label="课件学时(分钟)"
|
||||||
|
width="120"
|
||||||
|
/>
|
||||||
|
<el-table-column prop="CREATTIME" label="上传时间" width="140" />
|
||||||
|
<el-table-column label="课件状态" width="100">
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<template v-if="row.STATE === 0">
|
{{ translationStatus(row.STATE, stateList) }}
|
||||||
<div>启用</div>
|
|
||||||
</template>
|
|
||||||
<template v-else-if="row.STATE === 1">
|
|
||||||
<div>禁用</div>
|
|
||||||
</template>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="CURRICULUM_ID_REMOTE" label="课件来源">
|
<el-table-column label="课件来源" width="100">
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<template v-if="row.CURRICULUM_ID_REMOTE">
|
<span v-if="row.CURRICULUM_ID_REMOTE">商城</span>
|
||||||
<div>商城</div>
|
<span v-else>自传</span>
|
||||||
</template>
|
|
||||||
<template v-else>
|
|
||||||
<div>自传</div>
|
|
||||||
</template>
|
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="NUMEXAMPLE" label="习题数" />
|
<el-table-column prop="NUMEXAMPLE" label="习题数" width="100" />
|
||||||
<el-table-column label="操作" width="200">
|
<el-table-column label="操作" width="200">
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<el-button
|
<el-button type="primary" text link @click="fnPreviewVideo(row)">
|
||||||
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>
|
</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
|
@ -134,8 +115,8 @@
|
||||||
router.push({
|
router.push({
|
||||||
path: '/platform_resource_library/courseware/video/view',
|
path: '/platform_resource_library/courseware/video/view',
|
||||||
query: {
|
query: {
|
||||||
COURSE_ID: row.VIDEOCOURSEWARE_ID, // 课件ID
|
COURSEWAREID: row.VIDEOCOURSEWARE_ID,
|
||||||
COURSE_TYPE: '1', // 课件类型(1:视频课件、2:资料课件)
|
COURSEWARETYPE: '1',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
"
|
"
|
||||||
|
@ -159,26 +140,26 @@
|
||||||
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
import LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||||
import {
|
import {
|
||||||
getVideoCoursewareList,
|
getVideoCoursewareList,
|
||||||
joinMyVideoCourseware,
|
setVideoCoursewareJoin,
|
||||||
} from "@/request/platform_resource_library.js";
|
} from "@/request/platform_resource_library.js";
|
||||||
import useListData from "@/assets/js/useListData.js";
|
import useListData from "@/assets/js/useListData.js";
|
||||||
import { reactive } from "vue";
|
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 { debounce } from "throttle-debounce";
|
||||||
import { ElMessage, ElMessageBox } from "element-plus";
|
import { ElMessage, ElMessageBox } from "element-plus";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import LayoutVideo from "@/components/video/index.vue";
|
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 router = useRouter();
|
||||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||||
useListData(getVideoCoursewareList);
|
useListData(getVideoCoursewareList);
|
||||||
|
|
||||||
|
const stateList = [
|
||||||
|
{ ID: 0, NAME: "启用" },
|
||||||
|
{ ID: 1, NAME: "禁用" },
|
||||||
|
];
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
courseStates: [
|
|
||||||
{ value: "0", label: "启用" },
|
|
||||||
{ value: "1", label: "禁用" },
|
|
||||||
],
|
|
||||||
videoDialog: {
|
videoDialog: {
|
||||||
src: "",
|
src: "",
|
||||||
vid: "",
|
vid: "",
|
||||||
|
@ -186,44 +167,18 @@ const data = reactive({
|
||||||
visible: false,
|
visible: false,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const fnAdd = debounce(1000, async (VIDEOCOURSEWARE_ID) => {
|
const fnAdd = debounce(1000, async (VIDEOCOURSEWARE_ID) => {
|
||||||
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
||||||
await joinMyVideoCourseware({ COURSEWARE_ID: VIDEOCOURSEWARE_ID });
|
await setVideoCoursewareJoin({ COURSEWARE_ID: VIDEOCOURSEWARE_ID });
|
||||||
ElMessage.success("添加成功");
|
ElMessage.success("添加成功");
|
||||||
fnResetPagination();
|
fnResetPagination();
|
||||||
});
|
});
|
||||||
|
|
||||||
const fnPreviewVideo = async (row) => {
|
const fnPreviewVideo = async (row) => {
|
||||||
data.videoDialog.src = "";
|
const { src, vid, playAuth, visible } = await useAliYunVideoPreview(row);
|
||||||
data.videoDialog.vid = "";
|
data.videoDialog.src = src;
|
||||||
data.videoDialog.playAuth = "";
|
data.videoDialog.vid = vid;
|
||||||
if (
|
data.videoDialog.playAuth = playAuth;
|
||||||
row.VIDEOCOURSEWARE_ID_REMOTE &&
|
data.videoDialog.visible = visible;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
<el-card>
|
<el-card>
|
||||||
<el-form
|
<el-form
|
||||||
:model="searchForm"
|
:model="searchForm"
|
||||||
label-width="130px"
|
label-width="60px"
|
||||||
@submit.prevent="fnResetPaginationTransfer"
|
@submit.prevent="fnResetPagination"
|
||||||
>
|
>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
|
@ -15,6 +15,9 @@
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label-width="10px">
|
<el-form-item label-width="10px">
|
||||||
<el-button type="primary" native-type="submit">搜索</el-button>
|
<el-button type="primary" native-type="submit">搜索</el-button>
|
||||||
|
<el-button native-type="reset" @click="fnResetPagination">
|
||||||
|
重置
|
||||||
|
</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
@ -23,39 +26,28 @@
|
||||||
<layout-card>
|
<layout-card>
|
||||||
<layout-table
|
<layout-table
|
||||||
:data="list"
|
:data="list"
|
||||||
@get-data="fnGetDataTransfer"
|
@get-data="fnGetData"
|
||||||
v-model:pagination="pagination"
|
v-model:pagination="pagination"
|
||||||
>
|
>
|
||||||
<el-table-column prop="QUESTIONNUMBER" label="题号" width="60" />
|
<el-table-column prop="QUESTIONNUMBER" label="题号" width="60" />
|
||||||
<el-table-column
|
<el-table-column label="试题类型" width="80">
|
||||||
prop="QUESTIONTYPE"
|
|
||||||
label="试题类型"
|
|
||||||
show-overflow-tooltip
|
|
||||||
width="80"
|
|
||||||
>
|
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
{{ fnFormatterQuestionType(row) }}
|
{{ translationStatus(row.QUESTIONTYPE, questionTypeOptions) }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
prop="QUESTIONDRY"
|
prop="QUESTIONDRY"
|
||||||
label="题干"
|
label="题干"
|
||||||
align="left"
|
|
||||||
/>
|
/>
|
||||||
<el-table-column
|
<el-table-column label="答案" width="55">
|
||||||
show-overflow-tooltip
|
|
||||||
prop="ANSWER"
|
|
||||||
label="答案"
|
|
||||||
width="55"
|
|
||||||
>
|
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<template v-if="row.QUESTIONTYPE === '3'">
|
<template v-if="row.QUESTIONTYPE === '3'">
|
||||||
<div v-if="row.ANSWER === 'A'">正确</div>
|
<span v-if="row.ANSWER === 'A'">正确</span>
|
||||||
<div v-if="row.ANSWER === 'B'">错误</div>
|
<span v-if="row.ANSWER === 'B'">错误</span>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<div>{{ row.ANSWER }}</div>
|
<span>{{ row.ANSWER }}</span>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
@ -67,57 +59,20 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { getQuestionListByCoursewareIdAndType } from "@/request/platform_resource_library.js";
|
import { getQuestionListByCoursewareIdAndType } from "@/request/platform_resource_library.js";
|
||||||
import useListData from "@/assets/js/useListData.js";
|
import useListData from "@/assets/js/useListData.js";
|
||||||
import { reactive } from "vue";
|
|
||||||
import { useRoute } from "vue-router";
|
import { useRoute } from "vue-router";
|
||||||
|
import { translationStatus } from "@/assets/js/utils.js";
|
||||||
|
|
||||||
const route = useRoute();
|
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 } =
|
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||||
useListData(getQuestionListByCoursewareIdAndType, {
|
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>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss"></style>
|
<style scoped lang="scss"></style>
|
|
@ -3,24 +3,24 @@
|
||||||
<el-card>
|
<el-card>
|
||||||
<el-form
|
<el-form
|
||||||
:model="searchForm"
|
:model="searchForm"
|
||||||
label-width="130px"
|
label-width="80px"
|
||||||
@submit.prevent="fnResetPagination"
|
@submit.prevent="fnResetPagination"
|
||||||
>
|
>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="课程名称" prop="KEYWORDS">
|
<el-form-item label="课程名称" prop="KEYWORDS">
|
||||||
<el-input
|
<el-input v-model="searchForm.KEYWORDS" />
|
||||||
v-model="searchForm.KEYWORDS"
|
|
||||||
placeholder="请输入课程名称"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
<el-form-item
|
||||||
|
label="岗位培训类型"
|
||||||
|
prop="POSTTYPE"
|
||||||
|
label-width="120px"
|
||||||
|
>
|
||||||
<layout-learning-train-type
|
<layout-learning-train-type
|
||||||
v-model="searchForm.POSTTYPE"
|
v-model="searchForm.POSTTYPE"
|
||||||
type="post"
|
type="post"
|
||||||
placeholder="请选择岗位培训类型"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
@ -51,14 +51,10 @@
|
||||||
label="课程名称"
|
label="课程名称"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
/>
|
||||||
<el-table-column
|
<el-table-column show-overflow-tooltip label="培训行业类型">
|
||||||
show-overflow-tooltip
|
|
||||||
prop="train_type_name"
|
|
||||||
label="培训行业类型"
|
|
||||||
>
|
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<div v-if="row.CURRENCY === '1'">通用</div>
|
<span v-if="row.CURRENCY === '1'">通用</span>
|
||||||
<div v-else>{{ row.train_type_name }}</div>
|
<span v-else>{{ row.train_type_name }}</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column
|
<el-table-column
|
||||||
|
@ -66,9 +62,9 @@
|
||||||
label="岗位培训类型"
|
label="岗位培训类型"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
/>
|
||||||
<el-table-column prop="CLASSHOUR" label="学时(分钟)" />
|
<el-table-column prop="CLASSHOUR" label="学时(分钟)" width="100" />
|
||||||
<el-table-column prop="videoCount" label="视频课件数" />
|
<el-table-column prop="videoCount" label="视频课件数" width="100" />
|
||||||
<el-table-column prop="dataCount" label="资料课件数" />
|
<el-table-column prop="dataCount" label="资料课件数" width="100" />
|
||||||
<el-table-column label="操作" width="130">
|
<el-table-column label="操作" width="130">
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<el-button
|
<el-button
|
||||||
|
@ -89,7 +85,7 @@
|
||||||
router.push({
|
router.push({
|
||||||
path: '/platform_resource_library/curriculum/view',
|
path: '/platform_resource_library/curriculum/view',
|
||||||
query: {
|
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 LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||||
import {
|
import {
|
||||||
getCurriculumList,
|
getCurriculumList,
|
||||||
joinMyCurriculum,
|
setCurriculumJoin,
|
||||||
} from "@/request/platform_resource_library.js";
|
} from "@/request/platform_resource_library.js";
|
||||||
import useListData from "@/assets/js/useListData.js";
|
import useListData from "@/assets/js/useListData.js";
|
||||||
import { serialNumber } from "@/assets/js/utils.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) => {
|
const fnAdd = debounce(1000, async (CURRICULUM_ID) => {
|
||||||
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
||||||
await joinMyCurriculum({ CURRICULUM_ID });
|
await setCurriculumJoin({ CURRICULUM_ID });
|
||||||
ElMessage.success("添加成功");
|
ElMessage.success("添加成功");
|
||||||
fnResetPagination();
|
fnResetPagination();
|
||||||
});
|
});
|
|
@ -1,130 +1,107 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<layout-card>
|
||||||
<layout-card>
|
<el-divider content-position="left">课程信息</el-divider>
|
||||||
<el-divider content-position="left">课程信息</el-divider>
|
<el-descriptions :column="1" border>
|
||||||
<el-descriptions :column="1" border>
|
<el-descriptions-item label="课程名称">
|
||||||
<el-descriptions-item label="课程名称">
|
{{ data.info.CURRICULUMNAME }}
|
||||||
{{ data.curriculumInfo.CURRICULUMNAME }}
|
</el-descriptions-item>
|
||||||
</el-descriptions-item>
|
<el-descriptions-item label="培训行业类型">
|
||||||
<el-descriptions-item label="培训行业类型">
|
{{ data.info.CURRENCY === "1" ? "通用" : data.info.train_type_name }}
|
||||||
{{
|
</el-descriptions-item>
|
||||||
data.curriculumInfo.CURRENCY === "1"
|
<el-descriptions-item label="岗位培训类型">
|
||||||
? "通用"
|
{{ data.info.post_type_name }}
|
||||||
: data.curriculumInfo.train_type_name
|
</el-descriptions-item>
|
||||||
}}
|
<el-descriptions-item label="课程图片">
|
||||||
</el-descriptions-item>
|
<img
|
||||||
<el-descriptions-item label="岗位培训类型">
|
v-viewer
|
||||||
{{ data.curriculumInfo.post_type_name }}
|
:src="VITE_FILE_URL + data.info.CAPTURE"
|
||||||
</el-descriptions-item>
|
width="100"
|
||||||
<el-descriptions-item label="课程图片">
|
height="100"
|
||||||
<img
|
alt=""
|
||||||
:src="FILE_URL + data.curriculumInfo.CAPTURE"
|
/>
|
||||||
width="100"
|
</el-descriptions-item>
|
||||||
height="100"
|
<el-descriptions-item label="课程介绍">
|
||||||
/>
|
{{ data.info.CURRICULUMINTRODUCE }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="课程介绍">
|
</el-descriptions>
|
||||||
{{ data.curriculumInfo.CURRICULUMINTRODUCE }}
|
<template v-for="(item, index) in data.chapterList" :key="index">
|
||||||
</el-descriptions-item>
|
<el-divider content-position="center">{{ item.NAME }}</el-divider>
|
||||||
</el-descriptions>
|
<el-divider content-position="left">视频课件</el-divider>
|
||||||
<template v-for="(chapter, index) in data.chapterList" :key="index">
|
<layout-table :data="item.xzVideoList" :show-pagination="false">
|
||||||
<el-divider content-position="left">{{ data.NAME }}</el-divider>
|
<el-table-column
|
||||||
<el-divider content-position="left">视频课件</el-divider>
|
show-overflow-tooltip
|
||||||
<layout-table :data="chapter.xzVideoList" :showPagination="false">
|
prop="COURSEWARENAME"
|
||||||
<el-table-column
|
label="视频课件名称"
|
||||||
show-overflow-tooltip
|
>
|
||||||
prop="COURSEWARENAME"
|
<template v-slot="{ row }">
|
||||||
label="视频课件名称"
|
<el-button type="primary" text link @click="fnPreviewVideo(row)">
|
||||||
>
|
{{ row.COURSEWARENAME }}
|
||||||
<template v-slot="{ row }">
|
</el-button>
|
||||||
<template
|
</template>
|
||||||
v-if="
|
</el-table-column>
|
||||||
(row.VIDEOCOURSEWARE_ID_REMOTE &&
|
<el-table-column
|
||||||
row.VIDEOCOURSEWARE_ID_REMOTE.length > 0) ||
|
show-overflow-tooltip
|
||||||
(row.VIDEOFILES && row.VIDEOFILES.length > 0)
|
prop="post_type_name"
|
||||||
"
|
label="岗位培训类型"
|
||||||
>
|
/>
|
||||||
<a @click="fnPreviewVideo(row)">
|
<el-table-column
|
||||||
{{ row.COURSEWARENAME }}
|
show-overflow-tooltip
|
||||||
</a>
|
prop="train_type_name"
|
||||||
</template>
|
label="培训行业类型"
|
||||||
<template v-else>
|
/>
|
||||||
{{ row.COURSEWARENAME }}
|
<el-table-column show-overflow-tooltip prop="CLASSHOUR" label="学时" />
|
||||||
</template>
|
<el-table-column
|
||||||
</template>
|
show-overflow-tooltip
|
||||||
</el-table-column>
|
prop="COURSEWAREINTRODUCE"
|
||||||
<el-table-column
|
label="课件描述"
|
||||||
show-overflow-tooltip
|
/>
|
||||||
prop="post_type_name"
|
<el-table-column
|
||||||
label="岗位培训类型"
|
show-overflow-tooltip
|
||||||
/>
|
prop="teacherName"
|
||||||
<el-table-column
|
label="讲师"
|
||||||
show-overflow-tooltip
|
/>
|
||||||
prop="train_type_name"
|
</layout-table>
|
||||||
label="培训行业类型"
|
<el-divider content-position="left">资料课件</el-divider>
|
||||||
/>
|
<layout-table :data="item.xzDataList" :show-pagination="false">
|
||||||
<el-table-column
|
<el-table-column
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
prop="CLASSHOUR"
|
prop="COURSEWARENAME"
|
||||||
label="学时"
|
label="资料课件名称"
|
||||||
/>
|
>
|
||||||
<el-table-column
|
<template v-slot="{ row }">
|
||||||
show-overflow-tooltip
|
<el-button
|
||||||
prop="COURSEWAREINTRODUCE"
|
type="primary"
|
||||||
label="课件描述"
|
text
|
||||||
/>
|
link
|
||||||
<el-table-column
|
@click="fnPreviewPdf(row.COURSEWAREFILES)"
|
||||||
show-overflow-tooltip
|
>
|
||||||
prop="teacherName"
|
{{ row.COURSEWARENAME }}
|
||||||
label="讲师"
|
</el-button>
|
||||||
/>
|
</template>
|
||||||
</layout-table>
|
</el-table-column>
|
||||||
<el-divider content-position="left">资料课件</el-divider>
|
<el-table-column
|
||||||
<layout-table :data="chapter.xzDataList" :showPagination="false">
|
show-overflow-tooltip
|
||||||
<el-table-column
|
prop="post_type_name"
|
||||||
show-overflow-tooltip
|
label="岗位培训类型"
|
||||||
prop="COURSEWARENAME"
|
/>
|
||||||
label="资料课件名称"
|
<el-table-column
|
||||||
>
|
show-overflow-tooltip
|
||||||
<template v-slot="{ row }">
|
prop="train_type_name"
|
||||||
<template v-if="interceptTheSuffix(row.COURSEWAREFILES, '.pdf')">
|
label="培训行业类型"
|
||||||
<a @click="fnPreviewPdf(row.COURSEWAREFILES)">
|
/>
|
||||||
{{ row.COURSEWARENAME }}
|
<el-table-column show-overflow-tooltip prop="CLASSHOUR" label="学时" />
|
||||||
</a>
|
<el-table-column
|
||||||
</template>
|
show-overflow-tooltip
|
||||||
<template v-else>
|
prop="COURSEWAREINTRODUCE"
|
||||||
{{ row.COURSEWARENAME }}
|
label="课件描述"
|
||||||
</template>
|
/>
|
||||||
</template>
|
<el-table-column
|
||||||
</el-table-column>
|
show-overflow-tooltip
|
||||||
<el-table-column
|
prop="teacherName"
|
||||||
show-overflow-tooltip
|
label="讲师"
|
||||||
prop="post_type_name"
|
/>
|
||||||
label="岗位培训类型"
|
</layout-table>
|
||||||
/>
|
</template>
|
||||||
<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-pdf
|
<layout-pdf
|
||||||
:src="data.pdfDialog.src"
|
:src="data.pdfDialog.src"
|
||||||
v-model:visible="data.pdfDialog.visible"
|
v-model:visible="data.pdfDialog.visible"
|
||||||
|
@ -135,25 +112,22 @@
|
||||||
:play-auth="data.videoDialog.playAuth"
|
:play-auth="data.videoDialog.playAuth"
|
||||||
v-model:visible="data.videoDialog.visible"
|
v-model:visible="data.videoDialog.visible"
|
||||||
/>
|
/>
|
||||||
</div>
|
</layout-card>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { reactive } from "vue";
|
import { reactive } from "vue";
|
||||||
import { useRoute } from "vue-router";
|
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 LayoutPdf from "@/components/pdf/index.vue";
|
||||||
import LayoutVideo from "@/components/video/index.vue";
|
import LayoutVideo from "@/components/video/index.vue";
|
||||||
import { getVideoAuth, getVideoSource } from "@/request/api.js";
|
import useAliYunVideoPreview from "@/assets/js/useAliYunVideoPreview.js";
|
||||||
import { interceptTheSuffix } from "@/assets/js/utils.js";
|
|
||||||
|
|
||||||
const FILE_URL = import.meta.env.VITE_FILE_URL;
|
|
||||||
|
|
||||||
|
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const { CURRICULUM_ID } = route.query;
|
const { CURRICULUM_ID } = route.query;
|
||||||
|
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
curriculumInfo: {},
|
info: {},
|
||||||
chapterList: [],
|
chapterList: [],
|
||||||
pdfDialog: {
|
pdfDialog: {
|
||||||
src: "",
|
src: "",
|
||||||
|
@ -166,51 +140,24 @@ const data = reactive({
|
||||||
visible: false,
|
visible: false,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
const fnGetData = async () => {
|
||||||
const fnGetCurriculumInfo = async () => {
|
const resData = await getCurriculumView({ CURRICULUM_ID });
|
||||||
const respData = await getCurriculumInfo({ CURRICULUM_ID });
|
if (resData) {
|
||||||
if (respData) {
|
data.info = resData.pd;
|
||||||
data.curriculumInfo = respData.pd;
|
data.chapterList = resData.chapterList;
|
||||||
data.chapterList = respData.chapterList;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetCurriculumInfo();
|
fnGetData();
|
||||||
|
|
||||||
const fnPreviewPdf = (FILEPATH) => {
|
const fnPreviewPdf = (FILEPATH) => {
|
||||||
data.pdfDialog.visible = true;
|
data.pdfDialog.visible = true;
|
||||||
data.pdfDialog.src = FILEPATH;
|
data.pdfDialog.src = FILEPATH;
|
||||||
};
|
};
|
||||||
|
|
||||||
const fnPreviewVideo = async (row) => {
|
const fnPreviewVideo = async (row) => {
|
||||||
data.videoDialog.src = "";
|
const { src, vid, playAuth, visible } = await useAliYunVideoPreview(row);
|
||||||
data.videoDialog.vid = "";
|
data.videoDialog.src = src;
|
||||||
data.videoDialog.playAuth = "";
|
data.videoDialog.vid = vid;
|
||||||
if (
|
data.videoDialog.playAuth = playAuth;
|
||||||
row.VIDEOCOURSEWARE_ID_REMOTE &&
|
data.videoDialog.visible = visible;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
|
@ -3,24 +3,24 @@
|
||||||
<el-card>
|
<el-card>
|
||||||
<el-form
|
<el-form
|
||||||
:model="searchForm"
|
:model="searchForm"
|
||||||
label-width="130px"
|
label-width="80px"
|
||||||
@submit.prevent="fnResetPagination"
|
@submit.prevent="fnResetPagination"
|
||||||
>
|
>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="试卷名称" prop="KEYWORDS">
|
<el-form-item label="试卷名称" prop="KEYWORDS">
|
||||||
<el-input
|
<el-input v-model="searchForm.KEYWORDS" />
|
||||||
v-model="searchForm.KEYWORDS"
|
|
||||||
placeholder="请输入试卷名称"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
<el-form-item label="岗位培训类型" prop="POSTTYPE">
|
<el-form-item
|
||||||
|
label="岗位培训类型"
|
||||||
|
prop="POSTTYPE"
|
||||||
|
label-width="120px"
|
||||||
|
>
|
||||||
<layout-learning-train-type
|
<layout-learning-train-type
|
||||||
v-model="searchForm.POSTTYPE"
|
v-model="searchForm.POSTTYPE"
|
||||||
type="post"
|
type="post"
|
||||||
placeholder="请选择岗位培训类型"
|
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
@ -61,7 +61,7 @@
|
||||||
label="岗位培训类型"
|
label="岗位培训类型"
|
||||||
show-overflow-tooltip
|
show-overflow-tooltip
|
||||||
/>
|
/>
|
||||||
<el-table-column label="试题数">
|
<el-table-column label="试题数" width="100">
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
{{
|
{{
|
||||||
Number(row.DUOXUANTICOUNT) +
|
Number(row.DUOXUANTICOUNT) +
|
||||||
|
@ -70,12 +70,12 @@
|
||||||
}}
|
}}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="EXAMSCORE" label="总分数" />
|
<el-table-column prop="EXAMSCORE" label="总分数" width="100" />
|
||||||
<el-table-column prop="PASSSCORE" label="及格分数" />
|
<el-table-column prop="PASSSCORE" label="及格分数" width="100" />
|
||||||
<el-table-column prop="STATE" label="试卷状态">
|
<el-table-column label="试卷状态" width="100">
|
||||||
<template v-slot="{ row }">
|
<template v-slot="{ row }">
|
||||||
<template v-if="row.STATE === 0">启用</template>
|
<span v-if="row.STATE === 0">启用</span>
|
||||||
<template v-if="row.STATE === 1">禁用</template>
|
<span v-if="row.STATE === 1">禁用</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="130">
|
<el-table-column label="操作" width="130">
|
||||||
|
@ -97,7 +97,7 @@
|
||||||
router.push({
|
router.push({
|
||||||
path: '/platform_resource_library/paper/view',
|
path: '/platform_resource_library/paper/view',
|
||||||
query: {
|
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 LayoutLearningTrainType from "@/components/learning_train_type/index.vue";
|
||||||
import {
|
import {
|
||||||
getPaperList,
|
getPaperList,
|
||||||
joinMyPaper,
|
setPaperJoin,
|
||||||
} from "@/request/platform_resource_library.js";
|
} from "@/request/platform_resource_library.js";
|
||||||
import useListData from "@/assets/js/useListData.js";
|
import useListData from "@/assets/js/useListData.js";
|
||||||
import { serialNumber } from "@/assets/js/utils.js";
|
import { serialNumber } from "@/assets/js/utils.js";
|
||||||
|
@ -125,10 +125,9 @@ import { useRouter } from "vue-router";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
|
||||||
useListData(getPaperList);
|
useListData(getPaperList);
|
||||||
|
|
||||||
const fnAdd = debounce(1000, async (STAGEEXAMPAPERINPUT_ID) => {
|
const fnAdd = debounce(1000, async (STAGEEXAMPAPERINPUT_ID) => {
|
||||||
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
await ElMessageBox.confirm("确定要添加吗?", { type: "warning" });
|
||||||
await joinMyPaper({ STAGEEXAMPAPERINPUT_ID });
|
await setPaperJoin({ STAGEEXAMPAPERINPUT_ID });
|
||||||
ElMessage.success("添加成功");
|
ElMessage.success("添加成功");
|
||||||
fnResetPagination();
|
fnResetPagination();
|
||||||
});
|
});
|
|
@ -1,56 +1,56 @@
|
||||||
<template>
|
<template>
|
||||||
<layout-card>
|
<layout-card>
|
||||||
<el-descriptions :column="2" border>
|
<el-descriptions :column="2" border>
|
||||||
<el-descriptions-item label="试卷名称">
|
<el-descriptions-item label="试卷名称" :span="2">
|
||||||
{{ data.paperInfo.EXAMNAME }}
|
{{ data.info.EXAMNAME }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="试卷总分">
|
<el-descriptions-item label="试卷总分">
|
||||||
{{ data.paperInfo.EXAMSCORE }}
|
{{ data.info.EXAMSCORE }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="合格分数">
|
<el-descriptions-item label="合格分数">
|
||||||
{{ data.paperInfo.PASSSCORE }}
|
{{ data.info.PASSSCORE }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="岗位培训类型">
|
<el-descriptions-item label="岗位培训类型">
|
||||||
{{ data.paperInfo.post_type_name }}
|
{{ data.info.post_type_name }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="行业培训类型">
|
<el-descriptions-item label="行业培训类型">
|
||||||
{{ data.paperInfo.train_type_name }}
|
{{ data.info.train_type_name }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="多选题数">
|
<el-descriptions-item label="多选题数">
|
||||||
{{ data.paperInfo.DUOXUANTICOUNT }}
|
{{ data.info.DUOXUANTICOUNT }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="多选分数">
|
<el-descriptions-item label="多选分数">
|
||||||
{{ data.paperInfo.DUOXUANTINUMBER }}
|
{{ data.info.DUOXUANTINUMBER }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="单选题数">
|
<el-descriptions-item label="单选题数">
|
||||||
{{ data.paperInfo.DANYUANTICOUNT }}
|
{{ data.info.DANYUANTICOUNT }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="单选分数">
|
<el-descriptions-item label="单选分数">
|
||||||
{{ data.paperInfo.DANXUANTINUMBER }}
|
{{ data.info.DANXUANTINUMBER }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="判断题数">
|
<el-descriptions-item label="判断题数">
|
||||||
{{ data.paperInfo.PANDUITICOUNT }}
|
{{ data.info.PANDUITICOUNT }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
<el-descriptions-item label="判断分数">
|
<el-descriptions-item label="判断分数">
|
||||||
{{ data.paperInfo.PANDUITINUMBER }}
|
{{ data.info.PANDUITINUMBER }}
|
||||||
</el-descriptions-item>
|
</el-descriptions-item>
|
||||||
</el-descriptions>
|
</el-descriptions>
|
||||||
|
<div
|
||||||
<div v-for="(row, index) in data.questionList" :key="row.QUESTION_ID">
|
v-for="(row, index) in [
|
||||||
|
...data.questionList,
|
||||||
|
...data.questionList,
|
||||||
|
...data.questionList,
|
||||||
|
]"
|
||||||
|
:key="row.QUESTION_ID"
|
||||||
|
class="item ptb-20"
|
||||||
|
>
|
||||||
<div class="mt-20">
|
<div class="mt-20">
|
||||||
{{ index + 1 }}.
|
{{ index + 1 }}.
|
||||||
<span v-if="row.QUESTIONTYPE === '1'" class="question-type">
|
<span v-if="row.QUESTIONTYPE === '1'"> (单选题) </span>
|
||||||
(单选题)
|
<span v-if="row.QUESTIONTYPE === '2'"> (多选题) </span>
|
||||||
</span>
|
<span v-if="row.QUESTIONTYPE === '3'"> (判断题) </span>
|
||||||
<span v-if="row.QUESTIONTYPE === '2'" class="question-type">
|
|
||||||
(多选题)
|
|
||||||
</span>
|
|
||||||
<span v-if="row.QUESTIONTYPE === '3'" class="question-type">
|
|
||||||
(判断题)
|
|
||||||
</span>
|
|
||||||
{{ row.QUESTIONDRY }}
|
{{ row.QUESTIONDRY }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mt-10 ml-30">
|
<div class="mt-10 ml-30">
|
||||||
<el-radio-group
|
<el-radio-group
|
||||||
v-if="row.QUESTIONTYPE === '1'"
|
v-if="row.QUESTIONTYPE === '1'"
|
||||||
|
@ -89,29 +89,26 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import { reactive } from "vue";
|
import { reactive } from "vue";
|
||||||
import { useRoute } from "vue-router";
|
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 route = useRoute();
|
||||||
const { STAGEEXAMPAPERINPUT_ID } = route.query;
|
const { STAGEEXAMPAPERINPUT_ID } = route.query;
|
||||||
|
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
paperInfo: {},
|
info: {},
|
||||||
questionList: [],
|
questionList: [],
|
||||||
});
|
});
|
||||||
|
const fnGetData = async () => {
|
||||||
const fnGetPaperInfo = async () => {
|
const resData = await getPaperView({ STAGEEXAMPAPERINPUT_ID });
|
||||||
const respData = await getPaperInfo({ STAGEEXAMPAPERINPUT_ID });
|
if (resData) {
|
||||||
if (respData) {
|
data.info = resData.pd;
|
||||||
data.paperInfo = respData.pd;
|
data.questionList = resData.inputQue;
|
||||||
data.questionList = respData.inputQue;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
await fnGetPaperInfo();
|
fnGetData();
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.question-type {
|
.item {
|
||||||
font-size: 12px;
|
border-bottom: 1px dashed #ebeef5;
|
||||||
color: gray;
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
Loading…
Reference in New Issue