Files
learning-system-portal/src/components/Course/auditCourse1.vue
2022-06-03 11:32:51 +08:00

706 lines
27 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="examine-index">
<!--微课审核-->
<el-tabs v-model="activeName">
<el-tab-pane label="课程信息" name="info">
<el-row :gutter="10">
<el-col :span="24">
<el-form label-width="120px" size="mini" v-if="isEdit">
<el-form-item label="名称">{{courseInfo.name}}</el-form-item>
<el-form-item label="封面图片">
<el-col :span="8">
<div style="width: 160px;height: 90px">
<img style="width:100%;height:100%" v-if="courseCoverurl == ''" :src="webBaseUrl + '/images/bgimg/course.png'" alt="" srcset="">
<img style="width:100%;height:100%" v-else :src="courseCoverurl" alt="" srcset="">
</div>
</el-col>
<el-col :span="16">
<el-form-item label="内容分类">
<span>{{sysTypeName(courseInfo.sysType1)}}</span>
<span v-if="courseInfo.sysType2 !=''">/{{sysTypeName(courseInfo.sysType2)}}</span>
<span v-if="courseInfo.sysType3 !=''">/{{sysTypeName(courseInfo.sysType3)}}</span>
</el-form-item>
<!-- <el-form-item label="资源归属">
<span>{{resOwnerName(courseInfo.resOwner1)}}</span>
<span v-if="courseInfo.resOwner2 != ''">/{{resOwnerName(courseInfo.resOwner2)}}</span>
<span v-if="courseInfo.resOwner3 != ''">/{{resOwnerName(courseInfo.resOwner3)}}</span>
</el-form-item> -->
<el-form-item label="场景">
{{ sceneFilter(courseInfo.forScene)}}
</el-form-item>
</el-col>
</el-form-item>
<el-form-item label="授课教师" ><!--授课老师默认是当前操作人-->
{{teacher && teacher.join(',')}}</el-form-item>
<!-- <el-form-item label="系统标签">{{courseInfo.tags}}</el-form-item> -->
<el-form-item label="课程来源">{{courseInfo.source == 2?'外部':'内部'}}</el-form-item>
<el-form-item label="目标人群">{{courseInfo.forUsers}}</el-form-item>
<el-form-item label="观看设置">
{{courseInfo.device == 3? '多端可见': courseInfo.device == 2?'移动端可见':'PC端可见'}}
</el-form-item>
<!-- <el-form-item label="关键字">
{{courseInfo.keywords}}
</el-form-item> -->
<el-form-item label="课程价值">{{courseInfo.value}}</el-form-item>
<el-form-item label="课程简介">
{{courseInfo.summary}}
</el-form-item>
<!-- <el-form-item label="完成规则" v-if="!weike.onlyRequired"><el-input maxlength="50" v-model="params.forScene" placeholder="可基于组织树或受众选择"></el-input></el-form-item> -->
<!-- <el-form-item label="开放权限">{{courseInfo.openObject}}</el-form-item> -->
<!-- <el-form-item label="课程描述">
<div v-html="courseInfo.overview"></div>
</el-form-item> -->
<el-form-item v-if="isShow"><el-button type="primary" @click="isEdit = false">编辑</el-button> </el-form-item>
</el-form>
<!-- rules 以下是课程的基本信息编辑 可以做成一个单独的组件传course对象教师列表通过回调方法的方式处理 -->
<el-form label-width="120px" size="mini" v-else>
<el-form-item label="名称" required><el-input maxlength="100" v-model="courseInfo.name" placeholder="课程名称(限100字以内)"></el-input></el-form-item>
<el-form-item label="封面图片" required >
<el-col :span="8">
<imageUpload :value="courseCoverurl" width="160px" height="90px" @success="uploadCoverImgSuccess" @remove="removeCoverImgSuccess"></imageUpload>
<div>上传为16:9(:800*450)的png或jpg图片</div>
</el-col>
<el-col :span="16">
<el-form-item label="内容分类" required>
<el-cascader placeholder="选择内容分类" style="width: 90%;" clearable v-model="sysType" :props="sysProps" :options="sysTypeListMap"></el-cascader>
</el-form-item>
<!-- <el-form-item label="资源归属" required>
<el-cascader placeholder="选择资源归属" style="width: 90%;" clearable v-model="resOwnerArray" :props="defaultProps" :options="resOwnerListMap"></el-cascader>
</el-form-item> -->
<el-form-item label="场景">
<el-select v-model="courseInfo.forScene" style="width: 90%;">
<el-option v-for="item in sceneList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="授课教师" required ><!--授课老师默认是当前操作人-->
<el-select style="width: 90%;"
v-model="teacherName"
multiple
filterable
remote
disabled
value-key="teacherId"
reserve-keyword
placeholder="请输入授课教师姓名"
:remote-method="remoteMethod"
:loading="loading">
<el-option v-for="item in teacherList" :key="item.teacherId" :label="item.teacherName" :value="item"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item label="目标人群" >
<el-input maxlength="50" show-word-limit v-model="courseInfo.forUsers" placeholder="目标人群(限50字以内)"></el-input>
</el-form-item>
<el-form-item label="课程价值"><el-input maxlength="200" show-word-limit v-model="courseInfo.value" placeholder="课程价值(限200字以内)"></el-input></el-form-item>
<!-- <el-form-item label="系统标签">
<el-col :span="14">
<el-select style="width: 100%;"
v-model="showTags"
multiple
filterable
remote
reserve-keyword
placeholder="请输入关键词"
:remote-method="remoteTagMethod"
:loading="loading">
<el-option v-for="item in tagList" :key="item.id" :label="item.name" :value="item.name"> </el-option>
</el-select>
</el-col> -->
<!-- <el-col :span="10">
<el-form-item label="关键字"><el-input v-model="courseInfo.keywords" maxlength="50" placeholder="请输入关键字(限100字以内)"></el-input></el-form-item>
</el-col> -->
<!-- </el-form-item> -->
<el-form-item label="观看设置">
<el-col :span="14">
<el-radio v-model="courseInfo.device" :label="1">PC端可见</el-radio>
<el-radio v-model="courseInfo.device" :label="2">移动端可见</el-radio>
<el-radio v-model="courseInfo.device" :label="3">多端可见</el-radio>
</el-col>
<el-col :span="10">
<el-form-item label="课程来源">
<el-radio-group v-model="courseInfo.source" >
<el-radio :label="1">内部</el-radio>
<el-radio :label="2">外部</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-form-item>
<!-- <el-form-item label="完成规则" v-if="!weike.onlyRequired"><el-input maxlength="50" v-model="params.forScene" placeholder="可基于组织树或受众选择"></el-input></el-form-item> -->
<!-- <el-form-item label="开放权限"><el-input maxlength="50" v-model="courseInfo.openObject" placeholder="可基于组织树或受众选择"></el-input></el-form-item> -->
<el-form-item label="课程简介">
<el-input type="textarea" maxlength="100" show-word-limit :rows="3" v-model="courseInfo.summary" placeholder="课程介绍,要换成富文本编辑器"></el-input>
</el-form-item>
<!-- <el-form-item label="课程描述">
<WxEditor v-model="courseInfo.overview" :minHeight="100"></WxEditor>
</el-form-item> -->
<el-form-item label=""><el-button type="primary" v-loading="btnLoading" @click="saveEdit">保存</el-button> </el-form-item>
</el-form>
</el-col>
</el-row>
</el-tab-pane>
<el-tab-pane label="课件" name="courseware">
<div v-if="coursewareInfo.content.contentType == 10" style="position: relative;">
<videoPlayer :src="fileBaseUrl+curriculumData.url"
@onPlayerPlaying="onPlayerPlaying"
@onPlayerPlay="onPlayerPlay"
@onPlayerPause="onPlayerPause"
@onPlayerEnded="onPlayerEnded"></videoPlayer>
<!-- <video :src="fileBaseUrl+coursewareInfo.content.content" width="100%" controls controlslist="nodownload" style="width: 100%; height: 100%; object-fit: fill"></video> -->
</div>
<div v-if="coursewareInfo.content.contentType == 20">
<audioPlayer :url="fileBaseUrl+curriculumData.url"
:name="coursewareInfo.content.contentName"
@onPlaying="audioPlaying"
@onPlay="audioPlay"
@onPause="audioPause"
@onPlayEnd="audioEnd"
></audioPlayer>
<!-- <audio width="100%" controls :src="fileBaseUrl+coursewareInfo.content.content">
您的浏览器不支持 audio 标签
</audio> -->
</div>
<div v-if="coursewareInfo.content.contentType == 40">
<div style="padding: 10px;color: #767676;text-align: center;line-height: 40px; " v-if="converStatus < 2 && !coursewareInfo.content.content">
<div>文档文件转化中还未转化完成</div>
<div >上传时间{{curCFile.sysCreateTime}}</div>
</div>
<div style="padding: 10px;color: #767676;color: #ff0000;text-align: center;" v-if="converStatus == 3 && !coursewareInfo.content.content">
文件转化失败请重新上传不要上传加密的文件或联系管理员
</div>
<pdfPreview :filePath="fileBaseUrl+coursewareInfo.content.content"></pdfPreview>
</div>
<div v-if="coursewareInfo.content.contentType == 41">
<div class="picture-text" v-html="coursewareInfo.content.content"></div>
</div>
<div v-if="coursewareInfo.content.contentType == 52">
<div v-if="coursewareInfo.content.content!=''">
<!-- <hyper-link :content="coursewareInfo.content"></hyper-link> -->
<!-- <iframe :src="coursewareInfo.content.content" style="width: 100%;border:0px;min-height: 473px;" frameborder="0"></iframe> -->
</div>
</div>
</el-tab-pane>
<el-tab-pane v-if="homeworkInfo.id" label="作业" name="homework">
<homework :showRecord="isDetails" v-if="homeworkInfo.id" :showSubmit="false" :content="homeworkInfo" ></homework>
</el-tab-pane>
<el-tab-pane v-if="examInfo.id" label="考试" name="test">
<exam :showRecord="isDetails" :showTest="showTest" v-if="examInfo.id" :showSubmit="false" :content="examInfo"></exam>
</el-tab-pane>
<el-tab-pane v-if="assessInfo.id" label="评估" name="assess">
<assess :showSubmit="false" v-if="assessInfo.id" :showRecord="false" :content="assessInfo"></assess>
</el-tab-pane>
<el-tab-pane label="修改记录" name="record" v-if="isShow">
<div class="grid-info">
<el-table border style="margin-bottom: 20px" height="350" :data="dataList">
<el-table-column type="expand">
<template slot-scope="props">
<el-table border style="margin-bottom: 10px" :data="props.row.logData">
<el-table-column label="内容" prop="title"></el-table-column>
<el-table-column label="修改前" prop="before" show-overflow-tooltip>
<template slot-scope="props">
{{props.row.before == 'null' || props.row.before == ''? '--':props.row.before}}
</template>
</el-table-column>
<el-table-column label="修改后" prop="after" show-overflow-tooltip></el-table-column>
</el-table>
</template>
</el-table-column>
<el-table-column label="修改人" prop="sysCreateBy"></el-table-column>
<el-table-column label="修改时间" prop="sysCreateTime"></el-table-column>
</el-table>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import apiCoursePortal from "@/api/modules/coursePortal.js";
import {
formatDate,
courseType,
getType,
numberToLetter
} from "@/utils/tools.js";
import imageUpload from "@/components/ImageUpload/index.vue";
import pdfPreview from "@/components/PdfPreview/index.vue";
import weikeContent from "@/components/Course/weikeContent.vue";
import catalogCourseware from "@/components/Course/catalogCourseware.vue";
import apiCourse from "@/api/modules/course.js";
import scene from "../../api/modules/scene.js";
import exam from "@/components/Course/exam";
import homework from "@/components/Course/homework";
import assess from "@/components/Course/assess";
import WxEditor from "@/components/Editor/index.vue";
import apiTag from "../../api/modules/tag.js";
import videoPlayer from "@/components/VideoPlayer/index.vue";
import audioPlayer from "@/components/AudioPlayer/index.vue";
import apiCourseFile from '@/api/modules/courseFile.js';
import { mapGetters, mapActions } from "vuex";
// import hyperLink from '@/components/Course/hyperLink.vue';
export default {
name: "auditCourse1",
components: {
weikeContent,
catalogCourseware,
imageUpload,
exam,
homework,
assess,
WxEditor,
pdfPreview,
videoPlayer,
audioPlayer
// hyperLink
},
computed: {
...mapGetters(["resOwnerMap", "sysTypeMap"])
},
props: {
id: {
type: String,
default: ""
},
isDetails: {
type: Boolean,
default: true
},
isShow: {
// 控制修改记录,编辑按钮是否出现
type: Boolean,
default: true
},
showTest: {
//预览显示试题
type: Boolean,
default: false
}
},
data() {
return {
converStatus:4,
courseType: courseType,
isEdit: true,
homeworkInfo: {},
examInfo: {},
assessInfo: {},
fileBaseUrl: this.$Constants.fileBaseUrl,
btnLoading: false,
curCFile:{},//课件内容
coursewareInfo: {
content: {},
finish: false,
studyItemId: ""
},
curriculumData: {
url: "",
isDrag: false,
completeSetup: 1
},
sceneList: [],
sysType: [],
tagList: [], // 标签
showTags: [], //用于显示标签
teacherList: [],
teacherName: [],
teacher: [],
loading: false,
resOwnerArray: [],
defaultProps: {
value: "code",
label: "name"
},
sysProps: {
value: "id",
label: "name"
},
courseCoverurl: "",
courseInfo: {}, //基本信息
dataList: [],
activeName: "info",
resOwnerListMap: [],
resOwnerListMap: [],
rules: {
name: [{ required: true, message: "请输入课程名称", trigger: "blur" }],
kind: [
{ required: true, message: "请选择课程分类", trigger: "change" }
],
location: [
{ required: true, message: "请选择资源归属", trigger: "change" }
],
aim: [{ required: true, message: "请输入目标人群", trigger: "blur" }],
courseValue: [
{ required: true, message: "请输入课程价值", trigger: "blur" }
],
tag: [{ required: true, message: "请输入标签", trigger: "blur" }],
power: [{ required: true, message: "请输入开放权限", trigger: "blur" }]
}
};
},
mounted() {
this.getDetail();
this.getSceneData();
this.updateLogs();
this.getResOwnerTree().then(rs => {
this.resOwnerListMap = rs;
});
this.getSysTypeTree().then(rs => {
this.sysTypeListMap = rs;
});
},
methods: {
...mapActions({
getResOwnerTree: "resOwner/getResOwnerTree",
loadResOwners: "resOwner/loadResOwners",
getSysTypeTree: "sysType/getSysTypeTree",
loadSysTypes: "sysType/loadSysTypes"
}),
resOwnerName(code) {
if (code == "") {
return "";
}
return this.resOwnerMap.get(code);
},
sysTypeName(code) {
if (code == "") {
return "";
}
return this.sysTypeMap.get(code);
},
onPlayerPlay() {
console.log("开始播放");
},
onPlayerPause() {
console.log("暂停");
},
onPlayerEnded() {
console.log("播放结束");
},
onPlayerPlaying(itme) {
console.log("当前播放" + itme);
},
audioPlaying(item) {
console.log("当前播放" + item);
},
audioPlay() {
console.log("开始播放");
},
audioPause() {
console.log("暂停");
},
audioEnd() {
console.log("播放结束");
},
// 场景过滤
sceneFilter(forScene) {
// sceneList
// this.courseInfo.forScene
let name = "";
this.sceneList.forEach(item => {
if (item.id === forScene) {
name = item.name;
}
});
return name;
},
//修改记录
updateLogs() {
let params = {
courseId: this.id,
name: ""
};
apiCourse.findUpdateLogs(params).then(res => {
if (res.status === 200) {
res.result.forEach(item => {
item.logData = JSON.parse(item.logData);
});
this.dataList = res.result;
} else {
this.$message.error(res.message);
}
});
},
saveEdit() {
this.btnLoading = true;
this.courseInfo.tags = this.showTags.join();
//处理资源归属
// if (this.resOwnerArray.length > 0) {
// this.courseInfo.resOwner1 = this.resOwnerArray[0]; //资源归属一级的id
// this.courseInfo.resOwner2 = this.resOwnerArray[1]; //资源归属二级的id
// } else {
// this.$message.error("请选择资源归属");
// this.btnLoading = false;
// return;
// }
if (this.resOwnerArray.length > 2) {
this.courseInfo.resOwner3 = this.resOwnerArray[2]; //资源归属三级的id
}
// 分类
if (this.sysType.length > 0) {
this.courseInfo.sysType1 = this.sysType[0]; //资源归属一级的id
this.courseInfo.sysType2 = this.sysType[1]; //资源归属二级的id
} else {
this.$message.error("请选择内容分类");
this.btnLoading = false;
return;
}
if (this.sysType.length > 2) {
this.courseInfo.sysType3 = this.sysType[2]; //资源归属三级的id
}
// let postData = {
// course: this.courseInfo,
// // teachers: this.teacherName
// };
apiCourse
.saveOnlyCourse(this.courseInfo)
.then(res => {
if (res.status === 200) {
this.$message.success("操作成功!");
// let result = res.result;
this.isEdit = true;
this.courseInfo = result.course;
// this.curCourseId = result.course.id; //设置当前课程的id
// this.courseTeachers = result.teachers;
// let list = [];
// this.courseTeachers.forEach(item => {
// list.push(item.teacherName);
// });
this.btnLoading = false;
} else {
this.$message.error(res.message);
this.btnLoading = false;
}
})
.catch(err => {
this.btnLoading = false;
});
},
// 标签远程查询
async remoteTagMethod(query) {
if (query) {
try {
const { result, status } = await apiTag.findByName(1, query);
if (status === 200) {
this.tagList = result;
}
} catch (error) {
console.log(error);
}
} else {
this.tagList = [];
}
},
//获取场景,保留
async getSceneData() {
try {
const { result, status } = await scene.list(1);
if (status === 200) {
this.sceneList = result;
}
} catch (error) {
console.log(error);
}
},
// 教师列标,远程查询
async remoteMethod(query) {
if (query) {
this.loading = true;
try {
const { result, status } = await apiTeacher.findByName(query);
if (status === 200) {
let list = [];
result.forEach(item => {
list.push({
teacherId: item.id,
teacherName: item.name
});
});
this.teacherList = list;
this.loading = false;
}
} catch (error) {
this.loading = false;
}
} else {
this.teacherList = [];
}
},
//上传课程图片处理
uploadCoverImgSuccess(res) {
this.courseInfo.coverImg = res.result.filePath;
this.courseCoverurl = res.result.httpPath;
},
removeCoverImgSuccess() {
this.courseCoverurl = "";
this.courseInfo.coverImg = "";
},
getDetail() {
let $this = this;
apiCoursePortal.detail(this.id).then(rs => {
if (rs.status == 200) {
this.courseInfo = rs.result.course;
this.teacherList = rs.result.teachers;
this.teacherName = rs.result.teachers;
this.teacher = rs.result.teachers.map(res => res.teacherName);
this.totalContent = rs.result.contents.length; //计算总内容数
if (this.courseInfo.tags != "") {
this.showTags = this.courseInfo.tags.split(",");
}
if (rs.result.course.coverImg !== "") {
this.courseCoverurl = this.fileBaseUrl + rs.result.course.coverImg;
}
if (rs.result.course.resOwner3 == "") {
this.resOwnerArray = [
rs.result.course.resOwner1,
rs.result.course.resOwner2
];
} else {
this.resOwnerArray = [
rs.result.course.resOwner1,
rs.result.course.resOwner2,
rs.result.course.resOwner3
];
}
if (
rs.result.course.sysType3 == "" &&
rs.result.course.sysType2 == ""
) {
this.sysType = [rs.result.course.sysType1];
} else if (rs.result.course.sysType3 == "") {
this.sysType = [
rs.result.course.sysType1,
rs.result.course.sysType2
];
} else {
this.sysType = [
rs.result.course.sysType1,
rs.result.course.sysType2,
rs.result.course.sysType3
];
}
rs.result.contents.forEach(con => {
if (con.sortIndex == 1) {
$this.coursewareInfo.content = con;
if (
$this.coursewareInfo.content.contentType == 10 ||
$this.coursewareInfo.content.contentType == 20
) {
if (con.content.startsWith("{")) {
$this.curriculumData = JSON.parse(con.content);
} else {
$this.curriculumData.url = con.content;
}
}
if($this.coursewareInfo.content.contentType == 40) {
//console.log(con.content,'con.content');
// if(con.content != '' && con.content.indexOf('.pdf') > -1) {
// $this.coursewareInfo.content.content = con.content;
// }else {
apiCourseFile.detail(con.contentRefId).then(cfrs => {
if (cfrs.status == 200) {
$this.coursewareInfo.content.content = cfrs.result.previewFilePath;
$this.curCFile=cfrs.result;
$this.converStatus = cfrs.result.converStatus;
if(cfrs.result.previewFilePath == '' && cfrs.result.filePath.indexOf('.pdf') > -1) {
$this.coursewareInfo.content.content = cfrs.result.filePath;
}
if($this.coursewareInfo.content.content && $this.coursewareInfo.content.content.indexOf('.pdf') > -1){
if(cfrs.result.converStatus || cfrs.result.converStatus<2){
$this.converStatus=2;//转化完成
}
}
} else {
$this.$message.error('加载pdf课件文件失败');
}
});
// }
}
} else if (con.sortIndex == 2) {
$this.homeworkInfo = con;
//查询作业信息并显示
} else if (con.sortIndex == 3) {
$this.examInfo = con;
} else if (con.sortIndex == 4) {
$this.assessInfo = con;
}
});
} else {
this.$message.error(rs.message);
}
});
}
}
};
</script>
<style lang="scss" scoped>
::v-deep .picture-text{
img{
width: 100%;
}
}
.examine-index {
.grid-info {
display: flex;
padding: 0 20px;
.grid-item {
flex: 1;
.item-one {
font-size: 16px;
height: 20px;
}
.item-title {
font-size: 20px;
font-weight: 600;
}
}
}
.demo-table-expand {
font-size: 0;
}
.demo-table-expand label {
width: 90px;
color: #99a9bf;
}
.demo-table-expand .el-form-item {
margin-right: 0;
margin-bottom: 0;
width: 50%;
}
}
.homework-div {
border: 1px solid;
min-height: 500px;
padding: 20px;
font-size: 14px;
.homework-title {
font-weight: 600;
margin-bottom: 10px;
}
.homework-content {
color: #666;
margin-bottom: 10px;
}
}
.test-div {
border: 1px solid;
min-height: 500px;
padding: 20px;
font-size: 14px;
.test-info {
margin-bottom: 10px;
}
}
.assess-div {
border: 1px solid;
min-height: 500px;
padding: 20px;
font-size: 14px;
.assess-info {
margin-bottom: 10px;
}
}
</style>