|
@@ -0,0 +1,523 @@
|
|
|
+<template>
|
|
|
+ <div
|
|
|
+ class="pb_content"
|
|
|
+ style="background: #fff; width: 98%; height: 95%; margin: 20px"
|
|
|
+ >
|
|
|
+ <div class="pb_head top">
|
|
|
+ <span>学习资料</span>
|
|
|
+ <div @click="addImg($event)">
|
|
|
+ <input
|
|
|
+ type="file"
|
|
|
+ style="display: none"
|
|
|
+ @change="beforeUpload1($event, 1)"
|
|
|
+ />
|
|
|
+ <div class="uploadThing">上传资料</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="pb_content_body" style="height: 70%">
|
|
|
+ <div class="student_head">
|
|
|
+ <div class="three">
|
|
|
+ <div :class="choose == 0 ? 'choose' : ''" @click="sMtl(0)">
|
|
|
+ 第一天
|
|
|
+ </div>
|
|
|
+ <div :class="choose == 1 ? 'choose' : ''" @click="sMtl(1)">
|
|
|
+ 第二天
|
|
|
+ </div>
|
|
|
+ <div :class="choose == 2 ? 'choose' : ''" @click="sMtl(2)">
|
|
|
+ 第三天
|
|
|
+ </div>
|
|
|
+ <div :class="choose == 3 ? 'choose' : ''" @click="sMtl(3)">
|
|
|
+ 第四天
|
|
|
+ </div>
|
|
|
+ <div :class="choose == 4 ? 'choose' : ''" @click="sMtl(4)">
|
|
|
+ 第五天
|
|
|
+ </div>
|
|
|
+ <div :class="choose == 5 ? 'choose' : ''" @click="sMtl(5)">
|
|
|
+ 第六天
|
|
|
+ </div>
|
|
|
+ <div :class="choose == 6 ? 'choose' : ''" @click="sMtl(6)">
|
|
|
+ 第七天
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="student_table">
|
|
|
+ <div
|
|
|
+ style="
|
|
|
+ padding: 15px 0;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ flex-wrap: wrap;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: flex-start;
|
|
|
+ "
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ class="out_box"
|
|
|
+ v-for="(item, index) in chapInfoNew"
|
|
|
+ :key="index"
|
|
|
+ >
|
|
|
+ <div class="tup" v-if="item.fileT == 0">
|
|
|
+ <img
|
|
|
+ :src="
|
|
|
+ item.file.chapdataInfo
|
|
|
+ ? JSON.parse(item.file.chapdataInfo).url
|
|
|
+ : mtp
|
|
|
+ "
|
|
|
+ alt=""
|
|
|
+ @click="
|
|
|
+ handlePictureCardPreview(
|
|
|
+ JSON.parse(item.file.chapdataInfo).url
|
|
|
+ )
|
|
|
+ "
|
|
|
+ />
|
|
|
+ <div class="deleteWord" @click="deleteM(item.file.id)">
|
|
|
+ <img src="../../assets/icon/delete.png" alt="" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="tup" v-if="item.fileT == 1">
|
|
|
+ <img
|
|
|
+ src="../../assets/icon/stuVedio.png"
|
|
|
+ alt=""
|
|
|
+ @click="
|
|
|
+ handlePictureCardPreview(
|
|
|
+ JSON.parse(item.file.chapdataInfo).url
|
|
|
+ )
|
|
|
+ "
|
|
|
+ />
|
|
|
+ <div class="deleteWord" @click="deleteM(item.file.id)">
|
|
|
+ <img src="../../assets/icon/delete.png" alt="" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="tup" v-if="item.fileT == 2">
|
|
|
+ <img
|
|
|
+ src="../../assets/icon/stuFile.png"
|
|
|
+ alt=""
|
|
|
+ @click="
|
|
|
+ handlePictureCardPreview(
|
|
|
+ JSON.parse(item.file.chapdataInfo).url
|
|
|
+ )
|
|
|
+ "
|
|
|
+ />
|
|
|
+ <div class="deleteWord" @click="deleteM(item.file.id)">
|
|
|
+ <img src="../../assets/icon/delete.png" alt="" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="bottom_box">
|
|
|
+ <div>
|
|
|
+ {{
|
|
|
+ item.file.chapdataInfo
|
|
|
+ ? JSON.parse(item.file.chapdataInfo).name
|
|
|
+ : "图片暂无名称"
|
|
|
+ }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- <div v-if="this.choose == 1" style="padding: 15px 5px; display: flex">
|
|
|
+ <div class="out_box" v-for="(item, index) in chapInfo" :key="index">
|
|
|
+ <div class="tup">
|
|
|
+ <img
|
|
|
+ :src="msp"
|
|
|
+ alt=""
|
|
|
+ @click="
|
|
|
+ handlePictureCardPreview1(JSON.parse(item.chapdataInfo).url)
|
|
|
+ "
|
|
|
+ />
|
|
|
+ <div class="deleteWord" @click="deleteM(item.id)">
|
|
|
+ <img src="../assets/icon/deleteL.png" alt="" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="bottom_box">
|
|
|
+ <div>
|
|
|
+ {{
|
|
|
+ item.chapdataInfo
|
|
|
+ ? JSON.parse(item.chapdataInfo).name
|
|
|
+ : "图片暂无名称"
|
|
|
+ }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="this.choose == 2" style="padding: 15px 5px; display: flex">
|
|
|
+ <div class="out_box" v-for="(item, index) in chapInfo" :key="index">
|
|
|
+ <div class="tup">
|
|
|
+ <img
|
|
|
+ :src="mfj"
|
|
|
+ alt=""
|
|
|
+ @click="downFile(JSON.parse(item.chapdataInfo).url)"
|
|
|
+ />
|
|
|
+ <div class="deleteWord" @click="deleteM(item.id)">
|
|
|
+ <img src="../assets/icon/deleteL.png" alt="" />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="bottom_box">
|
|
|
+ <div>
|
|
|
+ {{
|
|
|
+ item.chapdataInfo
|
|
|
+ ? JSON.parse(item.chapdataInfo).name
|
|
|
+ : "图片暂无名称"
|
|
|
+ }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div> -->
|
|
|
+ </div>
|
|
|
+ <div class="student_page">
|
|
|
+ <el-pagination
|
|
|
+ background
|
|
|
+ layout="prev, pager, next"
|
|
|
+ :page-size="10"
|
|
|
+ :total="total"
|
|
|
+ v-if="page"
|
|
|
+ @current-change="handleCurrentChange"
|
|
|
+ >
|
|
|
+ </el-pagination>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <el-dialog :visible.sync="pictureDialog" size="tiny">
|
|
|
+ <img width="100%" :src="dialogImageUrl" alt="" />
|
|
|
+ </el-dialog>
|
|
|
+ <el-dialog :visible.sync="vedioDialog" size="tiny">
|
|
|
+ <video-player
|
|
|
+ class="video-player vjs-custom-skin"
|
|
|
+ ref="videoPlayer"
|
|
|
+ :playsinline="true"
|
|
|
+ :options="playerO"
|
|
|
+ @play="onPlayerPlay($event)"
|
|
|
+ style="width: 100%; height: 100%"
|
|
|
+ ></video-player>
|
|
|
+ </el-dialog>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+export default {
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ choose: 0,
|
|
|
+ chapInfo: [],
|
|
|
+ chapInfoNew: [],
|
|
|
+ cImgInfo: [],
|
|
|
+ isLoading: false,
|
|
|
+ noneBtnImg: false,
|
|
|
+ mtp: require("../../assets/sp1.png"),
|
|
|
+ // msp: require("../../assets/sp1.png"),
|
|
|
+ // mfj: require("../../assets/yp1.png"),
|
|
|
+ page: 1,
|
|
|
+ total: 0,
|
|
|
+ dialogImageUrl: "",
|
|
|
+ userid: this.$route.query.userid,
|
|
|
+ pictureDialog: false,
|
|
|
+ vedioDialog: false,
|
|
|
+ playerOptions: {
|
|
|
+ playbackRates: [0.7, 1.0, 1.5, 2.0], //播放速度
|
|
|
+ autoplay: false, //如果true,浏览器准备好时开始回放。
|
|
|
+ muted: false, // 默认情况下将会消除任何音频。
|
|
|
+ loop: false, // 导致视频一结束就重新开始。
|
|
|
+ preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
|
|
|
+ language: "zh-CN",
|
|
|
+ aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
|
|
|
+ fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
|
|
|
+ sources: [
|
|
|
+ {
|
|
|
+ type: "video/mp4", //这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目 || "video/ogg"|| "video/webm"
|
|
|
+ src: "", //url地址require("../../assets/media/aaa.mp4")
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ // poster: require("../../assets/tu31.png"), //你的封面地址
|
|
|
+ // poster: dataRes.imgUrl, //你的封面地址
|
|
|
+ notSupportedMessage: "此视频暂无法播放,请稍后再试", //允许覆盖Video.js无法播放媒体源时显示的默认信息。
|
|
|
+ controlBar: {
|
|
|
+ timeDivider: true, //当前时间和持续时间的分隔符
|
|
|
+ durationDisplay: true, //显示持续时间
|
|
|
+ remainingTimeDisplay: false, //是否显示剩余时间功能
|
|
|
+ fullscreenToggle: true, //全屏按钮
|
|
|
+ },
|
|
|
+ },
|
|
|
+ playerO: {},
|
|
|
+ };
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ handleCurrentChange(val) {
|
|
|
+ this.page = val;
|
|
|
+ this.selectMtl();
|
|
|
+ },
|
|
|
+ addImg(e) {
|
|
|
+ var el = e.currentTarget;
|
|
|
+ el.getElementsByTagName("input")[0].click();
|
|
|
+ },
|
|
|
+ imgChange(file, fileList, type) {
|
|
|
+ var _tmp = this.chapInfo;
|
|
|
+ this.noneBtnImg = _tmp.length >= 1;
|
|
|
+ },
|
|
|
+ downFile(url) {
|
|
|
+ window.open(url);
|
|
|
+ },
|
|
|
+ beforeUpload1(event, type) {
|
|
|
+ var file = event.target.files[0];
|
|
|
+ var credentials = {
|
|
|
+ accessKeyId: "AKIATLPEDU37QV5CHLMH",
|
|
|
+ secretAccessKey: "Q2SQw37HfolS7yeaR1Ndpy9Jl4E2YZKUuuy2muZR",
|
|
|
+ }; //秘钥形式的登录上传
|
|
|
+ window.AWS.config.update(credentials);
|
|
|
+ window.AWS.config.region = "cn-northwest-1"; //设置区域
|
|
|
+
|
|
|
+ var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ if (file) {
|
|
|
+ var params = {
|
|
|
+ Key:
|
|
|
+ file.name.split(".")[0] +
|
|
|
+ new Date().getTime() +
|
|
|
+ "." +
|
|
|
+ file.name.split(".")[1],
|
|
|
+ ContentType: file.type,
|
|
|
+ Body: file,
|
|
|
+ "Access-Control-Allow-Credentials": "*",
|
|
|
+ ACL: "public-read",
|
|
|
+ }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
|
|
|
+ var options = {
|
|
|
+ partSize: 2048 * 1024 * 1024,
|
|
|
+ queueSize: 2,
|
|
|
+ leavePartsOnError: true,
|
|
|
+ };
|
|
|
+ bucket
|
|
|
+ .upload(params, options)
|
|
|
+ .on("httpUploadProgress", function (evt) {
|
|
|
+ //这里可以写进度条
|
|
|
+ // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
|
|
|
+ })
|
|
|
+ .send(function (err, data) {
|
|
|
+ if (err) {
|
|
|
+ var a = _this.$refs.upload1.uploadFiles;
|
|
|
+ a.splice(a.length - 1, a.length);
|
|
|
+ _this.$message.error("上传失败");
|
|
|
+ } else {
|
|
|
+ _this.cImgInfo.push({
|
|
|
+ name: file.name,
|
|
|
+ url: data.Location,
|
|
|
+ });
|
|
|
+ _this.addMtl();
|
|
|
+ _this.cImgInfo = [];
|
|
|
+ _this.selectMtl();
|
|
|
+ _this.imgChange(null, null, type);
|
|
|
+ console.log(data.Location);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ },
|
|
|
+ handlePictureCardPreview(url) {
|
|
|
+ this.dialogImageUrl = url;
|
|
|
+ this.pictureDialog = true;
|
|
|
+ },
|
|
|
+ handlePictureCardPreview1(url) {
|
|
|
+ this.playerO = {};
|
|
|
+ this.playerOptions.poster = "";
|
|
|
+ this.playerOptions.sources[0].src = url;
|
|
|
+ this.playerO = this.playerOptions;
|
|
|
+ // this.dialogImageUrl = url;
|
|
|
+ this.vedioDialog = true;
|
|
|
+ },
|
|
|
+ addMtl() {
|
|
|
+ let params = {
|
|
|
+ cInfo: this.cImgInfo[0],
|
|
|
+ t: this.choose,
|
|
|
+ cBy: this.userid,
|
|
|
+ };
|
|
|
+ this.ajax
|
|
|
+ .get(this.$store.state.api + "addStuMtl", params)
|
|
|
+ .then((res) => {
|
|
|
+ this.$message.success("上传素材成功");
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ console.error(err);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ sMtl(type) {
|
|
|
+ this.choose = type;
|
|
|
+ this.selectMtl();
|
|
|
+ },
|
|
|
+ selectMtl() {
|
|
|
+ this.isLoading = true;
|
|
|
+ this.chapInfo = [];
|
|
|
+ this.chapInfoNew = [];
|
|
|
+ let params = {
|
|
|
+ t: parseInt(this.choose),
|
|
|
+ page: this.page,
|
|
|
+ };
|
|
|
+ this.ajax
|
|
|
+ .get(this.$store.state.api + "selectStuMtl", params)
|
|
|
+ .then((res) => {
|
|
|
+ this.isLoading = false;
|
|
|
+ this.total = res.data[0].length > 0 ? res.data[0][0].num : 0;
|
|
|
+ this.chapInfo = res.data[0];
|
|
|
+ var a = ["BMP", "JPG", "JPEG", "PNG", "GIF"];
|
|
|
+ var b = [
|
|
|
+ "MP4",
|
|
|
+ "MOV",
|
|
|
+ "AVI",
|
|
|
+ "WMV",
|
|
|
+ "MPG",
|
|
|
+ "MPEG",
|
|
|
+ "RM",
|
|
|
+ "RAM",
|
|
|
+ "SWF",
|
|
|
+ "FLV",
|
|
|
+ ];
|
|
|
+ var c = ["PPT", "PPTX", "PDF", "XLSX", "XLS", "DOC", "DOCX"];
|
|
|
+ for (var i = 0; i < this.chapInfo.length; i++) {
|
|
|
+ var d = JSON.parse(this.chapInfo[i].chapdataInfo).url;
|
|
|
+ if (
|
|
|
+ a.indexOf(
|
|
|
+ d.split(".")[d.split(".").length - 1].toLocaleUpperCase()
|
|
|
+ ) != -1
|
|
|
+ ) {
|
|
|
+ this.chapInfoNew.push({ file: this.chapInfo[i], fileT: 0 });
|
|
|
+ } else if (
|
|
|
+ b.indexOf(
|
|
|
+ d.split(".")[d.split(".").length - 1].toLocaleUpperCase()
|
|
|
+ ) != -1
|
|
|
+ ) {
|
|
|
+ this.chapInfoNew.push({ file: this.chapInfo[i], fileT: 1 });
|
|
|
+ } else if (
|
|
|
+ c.indexOf(
|
|
|
+ d.split(".")[d.split(".").length - 1].toLocaleUpperCase()
|
|
|
+ ) != -1
|
|
|
+ ) {
|
|
|
+ this.chapInfoNew.push({ file: this.chapInfo[i], fileT: 2 });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ this.isLoading = false;
|
|
|
+ console.error(err);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ deleteM(id) {
|
|
|
+ this.isLoading = true;
|
|
|
+ let params = {
|
|
|
+ id: id,
|
|
|
+ };
|
|
|
+ this.ajax
|
|
|
+ .get(this.$store.state.api + "deleteStuM", params)
|
|
|
+ .then((res) => {
|
|
|
+ this.isLoading = false;
|
|
|
+ this.$message.success("删除成功");
|
|
|
+ this.selectMtl();
|
|
|
+ })
|
|
|
+ .catch((err) => {
|
|
|
+ this.isLoading = false;
|
|
|
+ console.error(err);
|
|
|
+ });
|
|
|
+ },
|
|
|
+ onPlayerPlay() {},
|
|
|
+ },
|
|
|
+ created() {
|
|
|
+ this.selectMtl();
|
|
|
+ },
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.student_head >>> .el-button--primary {
|
|
|
+ background-color: #2268bc;
|
|
|
+}
|
|
|
+.student_head {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-start;
|
|
|
+ align-items: center;
|
|
|
+ flex-direction: row;
|
|
|
+ flex-wrap: nowrap;
|
|
|
+}
|
|
|
+.three {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: row;
|
|
|
+ justify-content: space-between;
|
|
|
+ height: 30px;
|
|
|
+}
|
|
|
+
|
|
|
+.three > div {
|
|
|
+ cursor: pointer;
|
|
|
+ margin-right: 20px;
|
|
|
+}
|
|
|
+
|
|
|
+.choose {
|
|
|
+ border-bottom: 5px solid #3994fd;
|
|
|
+}
|
|
|
+
|
|
|
+.student_table {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+ margin-top: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.tup {
|
|
|
+ width: 200px;
|
|
|
+ height: 191px;
|
|
|
+ margin: 0 auto;
|
|
|
+ position: relative;
|
|
|
+}
|
|
|
+
|
|
|
+.tup:hover .deleteWord {
|
|
|
+ display: block;
|
|
|
+}
|
|
|
+
|
|
|
+.deleteWord {
|
|
|
+ width: 25px;
|
|
|
+ height: 25px;
|
|
|
+ position: absolute;
|
|
|
+ right: -25px;
|
|
|
+ top: -10px;
|
|
|
+ cursor: pointer;
|
|
|
+ display: none;
|
|
|
+}
|
|
|
+
|
|
|
+.tup > img,
|
|
|
+.deleteWord > img {
|
|
|
+ width: 100%;
|
|
|
+ height: 100%;
|
|
|
+}
|
|
|
+
|
|
|
+.out_box {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ flex-wrap: nowrap;
|
|
|
+ width: 250px;
|
|
|
+ padding: 10px 0;
|
|
|
+ background: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.bottom_box {
|
|
|
+ display: flex;
|
|
|
+ text-align: center;
|
|
|
+ margin: 0 auto;
|
|
|
+ padding: 10px 0 5px 0;
|
|
|
+}
|
|
|
+.bottom_box > div:nth-child(1) {
|
|
|
+ white-space: nowrap;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ overflow: hidden;
|
|
|
+ word-break: break-all;
|
|
|
+ width: 200px;
|
|
|
+}
|
|
|
+.uploadThing {
|
|
|
+ background: #2268bc;
|
|
|
+ width: 90px;
|
|
|
+ height: 35px;
|
|
|
+ color: #fff;
|
|
|
+ font-size: 12px;
|
|
|
+ text-align: center;
|
|
|
+ line-height: 35px;
|
|
|
+ cursor: pointer;
|
|
|
+ border-radius: 4px;
|
|
|
+}
|
|
|
+
|
|
|
+.top {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+}
|
|
|
+.student_page {
|
|
|
+ margin-top: 30px;
|
|
|
+}
|
|
|
+</style>
|