Files
dvcp_v2_webapp/packages/3.0.0/AppPartyHistoryClass/components/seriesAdd.vue
yanran200730 ac46ebb348 25600
2021-12-23 18:05:50 +08:00

387 lines
11 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>
<section class="add_Party" :class="{isDetail:!isEdit}">
<ai-detail>
<ai-title slot="title" :title="detailTitle" isShowBottomBorder isShowBack @onBackClick="$emit('back')">
</ai-title>
<template #content>
<ai-card title="基本信息" v-if="isEdit">
<template #content>
<el-form class="ai-form" :model="form" label-width="120px" ref="ruleForm" :rules="rules">
<el-form-item style="width: 100%;" label="单集名称" prop="title">
<el-input size="small" v-model="form.title" clearable placeholder="请输入..." maxlength="100"
show-word-limit/>
</el-form-item>
<el-form-item style="width: 100%;" label="单集顺序" prop="num">
<el-row type="flex" justify="space-between">
<div style="flex: 1;margin-right: 20px;">
<el-input size="small" v-model="form.num" clearable placeholder="请输入..." maxlength="100"
show-word-limit/>
</div>
<span>已更新至{{episodeNum}}</span>
</el-row>
</el-form-item>
<el-form-item style="width: 100%;" label="视频" prop="videoUrl">
<el-upload :show-file-list="false" ref="upload1"
action :http-request="submitUpload" :accept="accept" :limit="1">
<div class="video" v-if="!form.videoUrl.length">
<div class="icon">
<ai-icon type="svg" icon="iconVideo"/>
<span>上传视频</span>
</div>
<span class="tips">支持mp4格式单个文件最大100MB</span>
</div>
</el-upload>
<video class="video-com" style="width:100%; height:100%; object-fit: fill;" muted
:src="form.videoUrl[0].url" controls="controls" v-if="form.videoUrl.length"></video>
<el-upload :show-file-list="false" ref="upload2" action :http-request="submitUpload" :accept="accept"
:limit="1" v-if="form.videoUrl.length">
<el-button style="margin-top: 10px;">重新选择</el-button>
</el-upload>
</el-form-item>
</el-form>
</template>
</ai-card>
<!--详情-->
<ai-card title="基本信息" v-else>
<template #content>
<div class="village_title">
<h3>{{ form.title }}</h3>
<p style="font-size: 14px;color: #999;">{{ form.createDate|timeVal }} {{ form.organizationName }}</p>
</div>
<div class="village_file" v-if="form.files && form.files.length">
<span>附件</span>
<div>
<p v-for="(item,i) in form.files" :key="i" class="fileSty" @click="downLoad(item.accessUrl)">
{{ item.fileName }}{{ item.postfix }}
</p>
</div>
</div>
<img class="cover" :src="form.thumbUrl[0].url" v-if="form.thumbUrl && form.thumbUrl.length">
<div class="village_cont" v-html="form.content"/>
</template>
</ai-card>
</template>
<template #footer>
<template v-if="isEdit">
<el-button size="small" @click="$emit('back')">取消</el-button>
<el-button type="primary" size="small" @click="saveAdd">保存</el-button>
</template>
</template>
</ai-detail>
</section>
</template>
<script>
import mp4box from 'mp4box'
import { mapState } from 'vuex'
export default {
name: "seriesAdd",
props: {
instance: Function,
dict: Object,
permissions: Function,
row: Object,
parentRow: Object,
isEdit: Boolean
},
computed: {
detailTitle() {
return this.isEdit ? '编辑剧集' : '新增剧集'
},
...mapState(['user'])
},
data() {
return {
form: {
title: '',
num: '',
videoUrl: [],
},
accept: ".mp4",
rules: {
title: [{required: true, message: "请填写单集名称"}],
num: [{required: true, message: "请填写单集顺序"}],
videoUrl: [{required: true, message: "请选择视频"}],
},
isDetail: true,
episodeNum: 0,
cropOps: {
width: "336px",
height: "210px"
}
}
},
methods: {
downLoad(url) {
window.open(url);
},
// 保存
saveAdd() {
this.$refs.ruleForm.validate(v => {
if (v) {
this.instance.post('/app/apppartyclassroomepisode/addOrUpdate', {
...this.form,
createUser: this.user.info.name,
createUserId: this.user.info.id,
status: 1,
classroomId: this.parentRow?.id,
id: !!this.row.id ? this.row.id : null,
videoUrl: this.form.videoUrl.length ? this.form.videoUrl[0].url : ''
}).then((res) => {
if (res && res.code == 0) {
this.row?.id ? this.$message.success('修改成功') : this.$message.success('添加成功');
this.$emit("back");
}
})
}
})
},
submitUpload(file) {
this.$refs['upload1']?.clearFiles();
this.$refs['upload2']?.clearFiles();
this.$refs['ruleForm']?.clearValidate('videoFile');
const fileType = file.file.name.split(".")[1];
const size = file.file.size / 1024 / 1024 > 100;
let mp4boxfile = mp4box.createFile();
const reader = new FileReader();
reader.readAsArrayBuffer(file.file);
reader.onload = (e) => {
const arrayBuffer = e.target.result;
arrayBuffer.fileStart = 0;
mp4boxfile.appendBuffer(arrayBuffer);
};
mp4boxfile.onReady = (info) => {
let codec = info.mime.match(/codecs="(\S*),/)[1]
if (codec.indexOf('avc') === -1) {
return this.$message.error("视频编码格式不支持")
}
if (size) {
return this.$message.error("视频大小不能超过100M");
}
if (fileType && this.accept.indexOf(fileType.toLocaleLowerCase()) > -1) {
let formData = new FormData()
formData.append('file', file.file);
this.instance.post(`/admin/file/add-unlimited`, formData).then(res => {
if (res && res.data) {
let videoList = res.data[0].split(";");
this.form.videoUrl = [{
id: videoList[1],
url: videoList[0]
}]
}
})
} else {
return this.$message.error("视频格式错误");
}
};
},
// 详情
checkDetaiList(id) {
id && this.instance.post('/app/apppartyclassroom/queryLargestNum', null, {
params: {id}
}).then((res) => {
if (res?.data) {
this.episodeNum = res.data;
}
})
},
getDetail() {
this.instance.post('/app/apppartyclassroomepisode/queryDetailById', null, {
params: {
id: this.row?.id
}
}).then((res) => {
if (res?.data) {
this.form.title = res.data.title;
this.form.num = res.data.num;
this.form.videoUrl = res.data.videoUrl ? [{
url: res.data.videoUrl
}]: [];
}
})
},
handleDelete(ids) {
this.$confirm('确定删除该文章吗').then(() => {
this.instance.post('/app/apppartyhistory/delete', null, {
params: {ids}
}).then(res => {
if (res?.code == 0) {
this.isAdd = false;
this.isDetailEdit = false;
this.$message.success('删除成功');
if ((this.total - 1) % this.searchObj.size == 0) {
this.searchObj.current -= 1
}
this.searchVillageList();
}
})
}).catch(() => 0)
},
},
created() {
this.checkDetaiList(this.parentRow?.id);
if (this.row?.id) {
this.getDetail();
}
},
}
</script>
<style scoped lang="scss">
.cover {
display: block;
width: 300px;
height: 140px;
margin: 20px auto;
}
.add_Party {
height: 100%;
position: relative;
background: #fff;
display: flex;
flex-direction: column;
.video {
width: 640px;
height: 360px;
border-radius: 4px;
border: 1px dashed #D0D4DC;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.icon {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
span:nth-child(2) {
display: inline-block;
font-size: 16px;
color: #333333;
line-height: 30px;
}
.iconfont {
display: inline-block;
font-size: 40px;
color: #2266FF;
}
}
.tips {
display: inline-block;
font-size: 12px;
color: #999999;
line-height: 26px;
}
}
.video-com {
width: 640px;
height: 360px;
background: rgba(0, 0, 0, 0.5);
border-radius: 2px;
border: 1px solid #D0D4DC;
margin-top: -40px;
}
::v-deep .AiIcon {
width: 38px;
height: 38px;
}
.footer_btn {
width: 106px;
}
.detail-content {
padding-bottom: 80px;
}
.el-form {
.upload-tip {
position: absolute;
text-align: left;
left: 100px;
top: 5px;
li {
color: #888;
font-size: 12px;
line-height: 14px;
}
b {
color: red;
font-size: 14px
}
}
}
.village_detail {
margin-top: 16px;
width: 760px;
overflow-y: auto;
border: 1px solid #eee;
border-radius: 4px;
display: flex;
flex-direction: column;
background: #fff;
.village_title {
padding: 24px;
border-bottom: 1px solid #eee;
h3, p {
text-align: center;
}
}
.village_file {
display: flex;
border-bottom: 1px solid #eee;
padding: 8px 20px;
span {
width: 60px;
}
div {
flex: 1;
}
.fileSty {
color: #999;
font-size: 14px;
cursor: pointer;
margin-bottom: 4px;
}
.fileSty:hover {
color: #5088FF;
}
}
.village_cont {
flex: 1;
padding: 30px 20px;
}
}
&.isDetail {
::v-deep .ai-detail__content {
background: #f3f6f9;
}
}
}
</style>