pull/1/head
z 2024-01-20 09:19:27 +08:00
parent 7166ee57d8
commit 41a4ee6edd
7 changed files with 544 additions and 508 deletions

View File

@ -868,6 +868,22 @@ export default [
path: "", path: "",
component: "online_learn_exam/courseware/video/index", component: "online_learn_exam/courseware/video/index",
}, },
{
path: "/online_learn_exam/courseware/video/add",
meta: {
title: "添加",
activeMenu: "/online_learn_exam/courseware/video",
},
component: "online_learn_exam/courseware/video/add",
},
{
path: "/online_learn_exam/courseware/video/edit",
meta: {
title: "修改",
activeMenu: "/online_learn_exam/courseware/video",
},
component: "online_learn_exam/courseware/video/add",
},
{ {
path: "/online_learn_exam/courseware/video/exercises", path: "/online_learn_exam/courseware/video/exercises",
meta: { meta: {
@ -887,6 +903,22 @@ export default [
path: "", path: "",
component: "online_learn_exam/courseware/data/index", component: "online_learn_exam/courseware/data/index",
}, },
{
path: "/online_learn_exam/courseware/data/add",
meta: {
title: "新增",
activeMenu: "/online_learn_exam/courseware/data",
},
component: "online_learn_exam/courseware/data/add",
},
{
path: "/online_learn_exam/courseware/data/edit",
meta: {
title: "修改",
activeMenu: "/online_learn_exam/courseware/data",
},
component: "online_learn_exam/courseware/data/add",
},
{ {
path: "/online_learn_exam/courseware/data/exercises", path: "/online_learn_exam/courseware/data/exercises",
meta: { meta: {
@ -916,6 +948,14 @@ export default [
}, },
component: "online_learn_exam/curriculum/view", component: "online_learn_exam/curriculum/view",
}, },
{
path: "/online_learn_exam/curriculum/add",
meta: {
title: "新增",
activeMenu: "/online_learn_exam/curriculum",
},
component: "online_learn_exam/curriculum/add",
},
], ],
}, },
], ],

View File

@ -0,0 +1,225 @@
<template>
<layout-card>
<el-form
ref="formRef"
:rules="rules"
:model="data.form"
label-width="120px"
>
<el-row>
<el-col :span="12">
<el-form-item label="课件名称" prop="COURSEWARENAME">
<el-input v-model="data.form.COURSEWARENAME" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="培训板块" prop="trainingSection">
<layout-training-section-cascader
v-model="data.form.trainingSection"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="培训行业类型" prop="TRAINTYPE">
<layout-learning-train-type
v-model="data.form.TRAINTYPE"
type="industry"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="岗位培训类型" prop="POSTTYPE">
<layout-learning-train-type
v-model="data.form.POSTTYPE"
type="post"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="课件学时(分钟)" prop="CLASSHOUR">
<el-input-number v-model="data.form.CLASSHOUR" :min="1" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="讲师名称" prop="SPEAKER">
<el-input v-model="data.form.SPEAKER" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="课件文件" prop="file">
<layout-upload
v-model:file-list="data.form.file"
accept=".pdf"
:size="500"
@preview="fnPreviewPdf"
>
<template #tip> 只能上传pdf文件 </template>
</layout-upload>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="课件截图" prop="screenshotFile">
<layout-upload
v-model:file-list="data.form.screenshotFile"
accept=".jpg,.jpeg,.png"
list-type="picture-card"
>
<template #tip> 建议上传尺寸224*160 </template>
</layout-upload>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="课件描述" prop="COURSEWAREINTRODUCE">
<el-input
v-model="data.form.COURSEWAREINTRODUCE"
type="textarea"
:autosize="{
minRows: 3,
}"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="大纲类型" prop="ONTLINETYPE">
<el-select v-model="data.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-col>
</el-row>
</el-form>
<div class="tc mt-10">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
<layout-pdf
:src="data.pdfDialog.src"
v-model:visible="data.pdfDialog.visible"
/>
</layout-card>
</template>
<script setup>
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 {
getDataCoursewareView,
setDataCoursewareAdd,
setDataCoursewareEdit,
} from "@/request/online_learn_exam.js";
import { getFileName } from "@/assets/js/utils.js";
import { useRoute, useRouter } from "vue-router";
import { useUserStore } from "@/pinia/user.js";
const route = useRoute();
const router = useRouter();
const userStore = useUserStore();
const { DATACOURSEWARE_ID } = route.query;
const VITE_FILE_URL = import.meta.env.VITE_FILE_URL;
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 formRef = ref(null);
const data = reactive({
form: {
COURSEWARENAME: "",
trainingSection: [],
TRAINTYPE: "",
POSTTYPE: "",
CLASSHOUR: 1,
SPEAKER: "",
file: [],
screenshotFile: [],
COURSEWAREINTRODUCE: "",
ONTLINETYPE: "",
},
pdfDialog: {
src: "",
visible: false,
},
});
const fnGetData = async () => {
if (!DATACOURSEWARE_ID)
data.form.TRAINTYPE = userStore.getUserInfo.CORP_TRAINTYPE;
else {
const resData = await getDataCoursewareView({ DATACOURSEWARE_ID });
data.form = resData.pd;
data.form.screenshotFile = [
{
url: VITE_FILE_URL + resData.pd.COURSEWARECAPTURE,
name: getFileName(resData.pd.COURSEWARECAPTURE),
},
];
data.form.file = [
{
url: VITE_FILE_URL + resData.pd.COURSEWAREFILES,
name: getFileName(resData.pd.COURSEWAREFILES),
},
];
data.form.trainingSection = resData.coursewareAllList.map((item) =>
item.DICTIONARIES_IDS.split(",")
);
}
};
fnGetData();
const outlineTypeList = await layoutFnGetOutlineType();
const fnPreviewPdf = async (event) => {
data.pdfDialog.visible = true;
data.pdfDialog.src = event.url;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(data.form).forEach((key) => {
formData.append(key, data.form[key]);
});
if (data.form.trainingSection.length > 0) {
formData.delete("trainingSection");
formData.append("trainingSection", data.form.trainingSection.join(";"));
}
formData.delete("file");
formData.delete("screenshotFile");
if (data.form.file[0].raw) formData.append("cfile", data.form.file[0].raw);
if (data.form.screenshotFile[0].raw)
formData.append("ccfile", data.form.screenshotFile[0].raw);
formData.append("captureIsType", !!data.form.screenshotFile[0].raw);
formData.append("fileIsType", !!data.form.file[0].raw);
!DATACOURSEWARE_ID
? await setDataCoursewareAdd(formData)
: await setDataCoursewareEdit(formData);
ElMessage.success("提交成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -1,179 +0,0 @@
<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>

View File

@ -140,7 +140,14 @@
row.STAGECOUNT === 0 && row.STAGECOUNT === 0 &&
row.ISPLATFORM === '0' row.ISPLATFORM === '0'
" "
@click="fnAddOrEdit(row.DATACOURSEWARE_ID, 'edit')" @click="
router.push({
path: '/online_learn_exam/courseware/data/edit',
query: {
DATACOURSEWARE_ID: row.DATACOURSEWARE_ID,
},
})
"
> >
修改 修改
</el-button> </el-button>
@ -180,7 +187,11 @@
<el-button <el-button
v-if="buttonJurisdiction.add" v-if="buttonJurisdiction.add"
type="primary" type="primary"
@click="fnAddOrEdit('', 'add')" @click="
router.push({
path: '/online_learn_exam/courseware/data/add',
})
"
> >
新增 新增
</el-button> </el-button>
@ -191,44 +202,29 @@
: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,
getDataCoursewareView,
setDataCoursewareDelete, setDataCoursewareDelete,
setDataCoursewareState, 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 { nextTick, reactive } from "vue"; import { reactive } from "vue";
import { import { serialNumber, translationStatus } from "@/assets/js/utils.js";
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 userStore = useUserStore();
const stateList = [ const stateList = [
{ ID: 0, NAME: "启用" }, { ID: 0, NAME: "启用" },
{ ID: 1, 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 buttonJurisdiction = await useButtonJurisdiction("courseware");
@ -237,22 +233,6 @@ const data = reactive({
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;
@ -284,32 +264,6 @@ const fnDelete = debounce(
}, },
{ 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>

View File

@ -0,0 +1,253 @@
<template>
<layout-card>
<el-form
ref="formRef"
:rules="rules"
:model="data.form"
label-width="120px"
>
<el-row>
<el-col :span="24">
<el-form-item label="课件名称" prop="COURSEWARENAME">
<el-input v-model="data.form.COURSEWARENAME" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="培训板块" prop="trainingSection">
<layout-training-section-cascader
v-model="data.form.trainingSection"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="培训行业类型" prop="TRAINTYPE">
<layout-learning-train-type
v-model="data.form.TRAINTYPE"
type="industry"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="岗位培训类型" prop="POSTTYPE">
<layout-learning-train-type
v-model="data.form.POSTTYPE"
type="post"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="讲师名称" prop="SPEAKER">
<el-input v-model="data.form.SPEAKER" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="课件文件" prop="file">
<layout-upload
v-model:file-list="data.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-col>
<el-col :span="24">
<el-form-item
label="课件截图"
prop="screenshotFile"
v-if="data.form.screenshotFile.length > 0"
>
<layout-upload
v-model:file-list="data.form.screenshotFile"
accept=".jpg,.jpeg,.png"
list-type="picture-card"
disabled
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="课件描述" prop="COURSEWAREINTRODUCE">
<el-input
v-model="data.form.COURSEWAREINTRODUCE"
type="textarea"
:autosize="{
minRows: 3,
}"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="大纲类型" prop="ONTLINETYPE">
<el-select v-model="data.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-col>
</el-row>
</el-form>
<div class="tc mt-10">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
<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, 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 {
getVideoCoursewareView,
setVideoCoursewareAdd,
setVideoCoursewareEdit,
} from "@/request/online_learn_exam.js";
import LayoutVideo from "@/components/video/index.vue";
import useAliYunVideoPreview from "@/assets/js/useAliYunVideoPreview.js";
import { getFileName } from "@/assets/js/utils.js";
import { useRoute, useRouter } from "vue-router";
import { useUserStore } from "@/pinia/user.js";
const route = useRoute();
const router = useRouter();
const userStore = useUserStore();
const { VIDEOCOURSEWARE_ID } = route.query;
let uploader;
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 formRef = ref(null);
const progressBarVisible = ref(false);
const progressBar = ref(0);
const data = reactive({
form: {
COURSEWARENAME: "",
trainingSection: [],
TRAINTYPE: "",
POSTTYPE: "",
SPEAKER: "",
file: [],
screenshotFile: [],
COURSEWAREINTRODUCE: "",
ONTLINETYPE: "",
},
videoDialog: {
src: "",
vid: "",
playAuth: "",
visible: false,
},
});
const fnGetData = async () => {
if (!VIDEOCOURSEWARE_ID)
data.form.TRAINTYPE = userStore.getUserInfo.CORP_TRAINTYPE;
else {
const resData = await getVideoCoursewareView({ VIDEOCOURSEWARE_ID });
data.form = resData.pd;
data.form.screenshotFile = [
{
url: resData.pd.VIDEOCAPTURE,
name: getFileName(resData.pd.VIDEOCAPTURE),
},
];
data.form.file = [
{
url: resData.pd.VIDEOFILES,
name: getFileName(resData.pd.VIDEOFILES),
},
];
data.form.trainingSection = resData.coursewareAllList.map((item) =>
item.DICTIONARIES_IDS.split(",")
);
}
};
fnGetData();
const outlineTypeList = await layoutFnGetOutlineType();
const fnPreviewVideo = async () => {
const { src, vid, playAuth, visible } = await useAliYunVideoPreview(
data.form
);
data.videoDialog.src = src;
data.videoDialog.vid = vid;
data.videoDialog.playAuth = playAuth;
data.videoDialog.visible = visible;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
if (data.form.file[0].raw) {
uploader = useAliYunUpload({
onUploadSucceed: (uploadInfo) => {
fnSubmitForm(uploadInfo.videoId);
},
onUploadstarted: () => {
progressBarVisible.value = true;
},
onUploadFailed: () => {
progressBarVisible.value = false;
},
onUploadProgress: (uploadInfo, totalSize, progress) => {
progressBar.value = Math.ceil(progress * 100);
},
});
fnSubmitVideo();
} else {
await fnSubmitForm();
}
},
{ atBegin: true }
);
const fnSubmitVideo = () => {
uploader.addFile(data.form.file[0].raw, null, null, null, '{"Vod":{}}');
uploader.startUpload();
};
const fnSubmitForm = async (videoId = "") => {
const params = {
...data.form,
videoId,
isEditVideo: !!data.form.file[0].raw,
trainingSection: data.form.trainingSection.join(";"),
};
!VIDEOCOURSEWARE_ID
? await setVideoCoursewareAdd(params)
: await setVideoCoursewareEdit(params);
ElMessage.success("提交成功");
router.back();
};
</script>
<style scoped lang="scss"></style>

View File

@ -1,209 +0,0 @@
<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;
},
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,
trainingSection: form.value.trainingSection.join(";"),
};
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>

View File

@ -142,7 +142,12 @@
row.STAGECOUNT === 0 && row.STAGECOUNT === 0 &&
row.ISPLATFORM === 0 row.ISPLATFORM === 0
" "
@click="fnAddOrEdit(row.VIDEOCOURSEWARE_ID, 'edit')" @click="
router.push({
path: '/online_learn_exam/courseware/video/edit',
query: { VIDEOCOURSEWARE_ID: row.VIDEOCOURSEWARE_ID },
})
"
> >
修改 修改
</el-button> </el-button>
@ -182,7 +187,9 @@
<el-button <el-button
v-if="buttonJurisdiction.add" v-if="buttonJurisdiction.add"
type="primary" type="primary"
@click="fnAddOrEdit('', 'add')" @click="
router.push({ path: '/online_learn_exam/courseware/video/add' })
"
> >
新增 新增
</el-button> </el-button>
@ -195,12 +202,6 @@
: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>
@ -209,26 +210,18 @@ import {
getVideoCoursewareList, getVideoCoursewareList,
setVideoCoursewareState, setVideoCoursewareState,
setVideoCoursewareDelete, 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 { nextTick, reactive } from "vue"; import { reactive } from "vue";
import { import { serialNumber, translationStatus } from "@/assets/js/utils.js";
getFileName,
serialNumber,
translationStatus,
} from "@/assets/js/utils.js";
import LayoutVideo from "@/components/video/index.vue"; import LayoutVideo from "@/components/video/index.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"; import useAliYunVideoPreview from "@/assets/js/useAliYunVideoPreview.js";
const router = useRouter(); const router = useRouter();
const userStore = useUserStore();
const stateList = [ const stateList = [
{ ID: 0, NAME: "启用" }, { ID: 0, NAME: "启用" },
{ ID: 1, NAME: "禁用" }, { ID: 1, NAME: "禁用" },
@ -243,21 +236,6 @@ const data = reactive({
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) => {
const { src, vid, playAuth, visible } = await useAliYunVideoPreview(row); const { src, vid, playAuth, visible } = await useAliYunVideoPreview(row);
@ -292,32 +270,6 @@ const fnDelete = debounce(
}, },
{ 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>