多媒体信息发布平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

977 lines
26 KiB

<template>
<div class="app-container">
<el-form ref="form" :model="form" size="small">
<!-- 创建标题 -->
<el-row class="in_release_item" type="flex" justify="space-between">
<el-col :span="3" class="item_title">创建{{ publishType === 0 ? "即时发布" : "定时发布" }}</el-col>
<el-col :span="18">
<div class="input_wrap">
<span class="input_label">名称</span>
<el-input
v-model="form.name"
:placeholder="changePlaceholder"
class="input_name"
/>
</div>
</el-col>
<el-col :span="4" class="release_right">
<el-button
round
class="release_btn"
type="primary"
>发布</el-button>
<el-button round type="primary">关闭</el-button>
</el-col>
</el-row>
<!-- 第一步:设置时间 -->
<el-row class="in_release_item">
<el-col class="step_1">第一步:设置时间</el-col>
<el-col class="step_form">
<el-form-item
label="发布时间"
prop="date"
:rules="[
{ required: true, message: '请选择发布时间', trigger: 'change' }
]"
label-width="100px"
>
<el-date-picker
v-if="publishType === 0"
v-model="form.date"
type="date"
placeholder="选择日期"
/>
<el-date-picker
v-else
v-model="form.date"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
/>
</el-form-item>
<el-form-item
v-if="publishType === 1"
label="设置周期"
prop="timePeriod"
:rules="[
{ required: true, message: '请设置周期:', trigger: 'change' },
]"
:class="['set_weekly',{'no_margin': form.timePeriod === '每周'}]"
label-width="100px"
>
<el-radio-group v-model="form.timePeriod" @change="clearCheckbox()">
<el-radio label="每天" value="everyday" />
<el-radio label="每周" value="weekly" />
</el-radio-group>
</el-form-item>
<el-form-item
v-if="form.timePeriod === '每周'"
:class="{'weekly_margin': form.timePeriod === '每周'}"
prop="onweek"
:rules="[
{ required: true, message: '请选择每周开机时间', trigger: 'change' },
]"
>
<el-checkbox-group v-model="form.onweek">
<el-checkbox label="周一" name="onweek" />
<el-checkbox label="周二" name="onweek" />
<el-checkbox label="周三" name="onweek" />
<el-checkbox label="周四" name="onweek" />
<el-checkbox label="周五" name="onweek" />
<el-checkbox label="周六" name="onweek" />
<el-checkbox label="周日" name="onweek" />
</el-checkbox-group>
</el-form-item>
<!-- :rules="[
{ required: true, message: '请选择是否置顶', trigger: 'change' }
]" -->
<el-form-item
label="是否置顶"
prop="isTop"
label-width="100px"
>
<el-radio v-model="form.isTop" label="1">置顶</el-radio>
</el-form-item>
</el-col>
</el-row>
<!-- 第二步:选择内容 -->
<el-row class="in_release_item">
<el-col class="step_1">第二步:选择内容</el-col>
<el-col class="step_form">
<div class="step_select">
<div>已选内容: 0</div>
<div>内容总时长:0.00s</div>
<div>添加BGM:<el-button class="step_select_audio" type="primary" round @click="selectAudioCont">选择文件</el-button></div>
</div>
<div class="step_select_list">
<div class="step_upload" @click="selectContVisible = true"></div>
<draggable
v-model="listSelectedData"
class="drag_list"
@end="dragEnd"
>
<div
v-for="(item, index) in listSelectedData"
:key="index"
:class="['material_item', 'item_cont']"
@click="selectedItem(item.id,item)"
>
<img v-if="item.coverImg" :src="item.coverImg" alt />
<div v-if="item.type == 'audio'" class="radio_img"></div>
<div class="item_format">
<span class="item_type">{{ item.type }}</span>
<span v-if="item.type !== 'JPG'" class="item_time">03:00</span>
</div>
<div class="file_name">{{ item.name }}</div>
<div v-if="contentIds.includes(item.id)" class="select_handle">
<div class="select_delt" @click.stop="selectDelt(item.id,index)">
<svg class="font-icon icon1" aria-hidden="true">
<use xlink:href="#icon-guanbi2" />
</svg>
</div>
<div class="select_edit" @click.stop="selectEdit()">
<svg class="font-icon icon1" aria-hidden="true">
<use xlink:href="#icon-bianji" />
</svg>
</div>
</div>
</div>
</draggable>
</div>
</el-col>
</el-row>
<!-- 第三步-选择设备 -->
<el-row class="in_release_item">
<el-col class="step_1">第三步:选择设备</el-col>
<el-col class="step_form">
<el-form-item
label=""
prop="deviceSelect"
:rules="[
{ required: true, message: '请选择设备', trigger: 'change' },
]"
>
<el-radio-group v-model="form.deviceSelect">
<el-radio label="all" value="all">所有设备</el-radio>
<el-radio label="other" value="other">部分设备<i v-if="form.deviceSelect === 'other'" class="radio_tip" @click="addDeviceTag()">添加</i></el-radio>
</el-radio-group>
</el-form-item>
<div v-if="form.deviceSelect === 'all'" class="select_all_tip">所有设备都将被发送</div>
<div v-if="deviceTags.length > 0 && form.deviceSelect === 'other'" class="select_other">
<el-row>
<el-col :span="10" class="other_tip">以下设备都将被发送<span>总计{{ deviceTags.length }}个设备</span></el-col>
<el-col :span="4">
<el-button round class="delt_btn" @click="clearDevice()">清空</el-button>
</el-col>
</el-row>
<el-tag
v-for="tag in deviceTags"
:key="tag"
closable
:disable-transitions="true"
:hit="false"
color="#cbe3ff"
@close="deltTags(tag)"
>
{{ tag }}
</el-tag>
</div>
</el-col>
</el-row>
</el-form>
<!-- 第二步:选择内容 - 选择素材 -->
<div class="release_layer upload_layer">
<el-dialog
:close-on-click-modal="false"
:show-close="false"
:visible.sync="selectContVisible"
width="1200px"
>
<div slot="title" class="layer_tab_title">
<span :class="{'active': activeIndex === 0}" @click="tabAll(0)">素材库</span>
<span :class="{'active': activeIndex === 1}" @click="tabAll(1)">主题库</span>
</div>
<!-- 素材库 -->
<div v-if="activeIndex === 0">
<ul class="tab_item">
<li
v-for="(item, index) in materialTabItem"
:key="index"
:class="{'active': activeItemIndex === index}"
@click="tab(index)"
>{{ item.name }}<span>{{ item.num }}</span>
</li>
</ul>
<div class="material_list">
<div
v-for="(item, index) in listData"
:key="index"
:class="['material_item', 'item_cont',{ 'item_multi': uploadContentIds.includes(item.id) }]"
>
<img v-if="item.coverImg" :src="item.coverImg" alt />
<div v-if="item.type == 'audio'" class="radio_img"></div>
<div class="item_format">
<span class="item_type">{{ item.type }}</span>
<span v-if="item.type !== 'JPG'" class="item_time">03:00</span>
</div>
<div class="file_name">{{ item.name }}</div>
<span v-if="isMultiSelected" class="checked_btn" @click="selectedListItem(item.id, item.type)"></span>
</div>
</div>
</div>
<!-- 主题库 -->
<div v-if="activeIndex === 1" class="theme_cont">
<!-- 主题库list -->
<ThemeGalleryList
ref="ThemeGalleryList"
:is-multi-selected="isMultiSelected"
:mulit-text="mulitText"
:show-item-info="false"
/>
</div>
<div class="upload_list_right">
<div class="mulit_btn" @click="multiSelectBtn">{{ mulitText }}</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round @click="submitForm('form')">确 定</el-button>
<el-button round @click="cancelContSelect">取 消</el-button>
</div>
</el-dialog>
</div>
<!-- 编辑播放内容 -->
<div class="upload_layer">
<el-dialog
title="请选择播放内容"
:close-on-click-modal="false"
:visible.sync="listEditVisible"
>
<div class="total_time">
内容总时长:3m15s
</div>
<div
v-for="(item, index) in selectedData"
:key="index"
class="edit_material"
>
<div class="edit_img">
<img v-if="item.coverImg" :src="item.coverImg" alt />
<div v-if="item.type == 'audio'" class="radio_img"></div>
<span class="">{{ index+1 }}</span>
</div>
<div class="edit_cont">
<div class="edit_cont_base">
<p>{{ item.name }}</p>
<span>{{ item.type }}</span>
<span>{{ item.size }}</span>
</div>
<div v-if="item.type === 'JPG'" class="edit_cont_set">
<div class="set_time">
<span>展示时长</span>
<el-input v-model="time" type="text" style="width: 66px" />
<em>秒</em>
</div>
<div class="set_animation">
<span class="set_item">切换动效</span>
<el-select v-model="animation" style="width:100px">
<el-option label="无动画" value="0">无动画</el-option>
<el-option label="动画1" value="1">动画1</el-option>
<el-option label="动画2" value="2">动画2</el-option>
</el-select>
</div>
<div class="set_time set_audio">
<span>音频:</span>
<p class="audio_name">audio.mp3</p>
<!-- 主题库音频文件不可选择 -->
<el-button type="primary" round @click="selectAudioCont">选择文件</el-button>
</div>
</div>
<div v-else class="edit_cont_other">内容时长:{{ item.time }}</div>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round @click="submitForm('form')">保 存</el-button>
<el-button round @click="listEditVisible = false">取 消</el-button>
</div>
</el-dialog>
</div>
<!-- 素材库 - 音频选择 -->
<div class="release_layer upload_layer">
<el-dialog
:close-on-click-modal="false"
:show-close="false"
:visible.sync="selectAudioVisible"
width="1200px"
>
<div slot="title" class="layer_tab_title">
<span class="active">素材库</span>
</div>
<div>
<ul class="tab_item">
<li>音频<span>3</span></li>
</ul>
<div class="material_list">
<div
v-for="(item, index) in listData"
:key="index"
:class="['material_item', 'item_cont',{ 'item_multi': audioChecked === index }]"
>
<img v-if="item.coverImg" :src="item.coverImg" alt />
<div v-if="item.type == 'audio'" class="radio_img"></div>
<div class="item_format">
<span class="item_type">{{ item.type }}</span>
<span v-if="item.type !== 'JPG'" class="item_time">03:00</span>
</div>
<div class="file_name">{{ item.name }}</div>
<span v-if="isMultiSelected" class="checked_btn" @click="audioCheckedHandle(index)"></span>
</div>
</div>
</div>
<div class="upload_list_right">
<div class="mulit_btn" @click="multiSelectBtn('audio')">{{ mulitText }}</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round>确 定</el-button>
<el-button round @click="cancelContSelect('audio')">取 消</el-button>
</div>
</el-dialog>
</div>
<!-- 添加发布的设备 -->
<div class="add_device_layer">
<el-dialog
title="请选择设备"
:close-on-click-modal="false"
:visible.sync="selectDeviceVisible"
width="400px"
>
<el-tag
v-for="tag in deviceAllTags"
:key="tag"
:disable-transitions="true"
:hit="false"
color="#cbe3ff"
class="all_tags"
@click="tagHandle(tag)"
>
{{ tag }}
</el-tag>
</el-dialog>
</div>
</div>
</template>
<script>
import draggable from 'vuedraggable'
import ThemeGalleryList from '../components/ThemeGalleryList.vue'
export default {
name: 'ImmediateRelease',
components: {
draggable,
ThemeGalleryList
},
data() {
return {
publishType: 0,
time: 15,
audio_name: 'audio.mp3',
animation: null,
selectDeviceVisible: false,
listEditVisible: false,
selectContVisible: false,
activeIndex: 0,
activeItemIndex: 0,
selectAudioVisible: false,
audioChecked: null,
deviceAllTags: ['GCXR1', 'GCXR2', 'GCXR3', 'GCXR4', 'GCXR5'],
deviceTags: [],
mulitText: '多选',
isMultiSelected: false,
form: {
name: '',
date: null,
isTop: null,
deviceSelect: '',
timePeriod: null,
onweek: []
},
listData: [
{
id: '1',
name: '1',
type: 'JPG',
size: '12kb',
coverImg: require('@/assets/images/background.jpg'),
time: ''
},
{
id: '2',
name: '2',
type: 'JPG',
size: '12kb',
coverImg: require('@/assets/images/background.jpg'),
time: ''
},
{
id: '3',
name: '4',
type: 'VEDIO',
size: '12kb',
coverImg: require('@/assets/images/background.jpg'),
time: '03:00'
},
{
id: '4',
name: '4',
type: 'audio',
size: '12kb',
coverImg: '',
time: '01:20'
}
],
listSelectedData: [
{
id: '1',
name: '1',
type: 'JPG',
size: '12kb',
coverImg: require('@/assets/images/background.jpg'),
time: ''
},
{
id: '2',
name: '2',
type: 'JPG',
size: '12kb',
coverImg: require('@/assets/images/background.jpg'),
time: ''
},
{
id: '3',
name: '4',
type: 'VEDIO',
size: '12kb',
coverImg: require('@/assets/images/background.jpg'),
time: '03:00'
},
{
id: '4',
name: '4',
type: 'audio',
size: '12kb',
coverImg: '',
time: '01:20'
}
],
contentIds: [],
uploadContentIds: [],
selectedData: [], // 选择内容 - 选择的item
materialTabItem: [
{
key: 1,
name: '全部',
num: '3'
},
{
key: 2,
name: '图片',
num: '1'
},
{
key: 3,
name: '视频',
num: '1'
},
{
key: 4,
name: '音频',
num: '1'
}
]
}
},
computed: {
changePlaceholder() {
return this.publishType === 0 ? '即时发布 2022-01-01' : '定时发布 2022-01-01'
}
},
mounted() {
console.log(this.$route.query.tag)
if (this.$route.path === '/release') {
this.materialTabItem.pop()
}
if (this.$route.query.tag) {
this.publishType = this.$route.query.tag
}
console.log(this.$router.options.routes)
console.log(this.$route.path)
},
methods: {
selectEdit() {
this.listEditVisible = true
// console.log(this.selectedData)
},
dragEnd() {
// console.log(this.listData)
// console.log(this.selectedData)
},
selectDelt(id, i) {
const index = this.contentIds.indexOf(id)
this.contentIds.splice(index, 1)
this.selectedData.splice(index, 1)
this.listSelectedData.splice(i, 1)
},
selectedItem(id, item) {
const arr = this.contentIds
if (arr.includes(id)) {
const index = arr.indexOf(id)
if (index > -1) {
arr.splice(index, 1)
this.selectedData.splice(index, 1)
}
} else {
this.contentIds.push(id)
this.selectedData.push(item)
}
},
// 多选btn
multiSelectBtn(type) {
this.isMultiSelected = !this.isMultiSelected
if (this.isMultiSelected) {
this.mulitText = '取消'
} else {
if (type === 'audio') {
this.mulitText = '选择'
this.audioChecked = null
} else {
this.mulitText = '多选'
this.uploadContentIds = []
}
}
},
// 多选选中
selectedListItem(id) {
const arr = this.uploadContentIds
if (arr.includes(id)) {
const index = arr.indexOf(id)
if (index > -1) {
arr.splice(index, 1)
}
} else {
this.uploadContentIds.push(id)
}
},
// 设备选择
addDeviceTag() {
this.selectDeviceVisible = true
},
tagHandle(tag) {
console.log(tag)
this.deviceTags.push(tag)
},
// 删除已选择的设备
deltTags(tag) {
this.deviceTags.splice(this.deviceTags.indexOf(tag), 1)
console.log(this.deviceTags)
},
// 清空已选择的设备
clearDevice() {
this.deviceTags = []
},
// 选择内容-素材库/主题库 tab
tabAll(index) {
this.activeIndex = index
this.activeItemIndex = 0
this.isMultiSelected = false
this.mulitText = '多选'
this.uploadContentIds = []
},
tab(index) {
this.activeItemIndex = index
},
// 时间设置-切换到每天时
clearCheckbox() {
if (this.form.timePeriod === '每天') {
this.form.onweek = []
}
},
// 选择音频
selectAudioCont() {
this.isMultiSelected = false
this.mulitText = '选择'
this.selectAudioVisible = true
},
// 音频选中-单选
audioCheckedHandle(index) {
this.audioChecked = index
console.log(this.audioChecked)
},
// 素材选择 - 取消按钮
cancelContSelect(type) {
this.isMultiSelected = false
if (type === 'audio') {
this.selectAudioVisible = false
this.mulitText = '选择'
this.audioChecked = null
} else {
this.selectContVisible = false
this.mulitText = '多选'
this.uploadContentIds = []
}
}
}
}
</script>
<style lang="scss" scoped>
.app-container {
background: none;
padding: 0;
}
.in_release_item {
padding: 16px 24px;
margin-bottom: 10px;
line-height: 34px;
background: #fff;
border-radius: 6px;
.item_title {
font-size: 16px;
font-weight: bold;
color: #3a8aeb;
}
.input_wrap {
display: flex;
width: 282px;
height: 34px;
padding: 0 24px;
font-size: 14px;
background: #f5f6fa;
line-height: 34px;
border-radius: 34px;
.input_label {
&::after {
content: "|";
padding-left: 8px;
color: #ccc;
}
}
.input_name {
width: 194px;
::v-deep .el-input__inner {
border: none;
background: #f5f6fa;
}
}
}
.release_right {
text-align: right;
.el-button {
font-size: 14px;
padding: 8px 24px;
border: none !important;
}
.release_btn {
color: #fff;
background: linear-gradient(to right, #fc8c6f, #fa544e) !important;
}
}
}
.step_1{
font-size: 16px;
line-height: 54px;
border-bottom: 1px solid #eee;
}
.set_weekly {
::v-deep .el-form-item__label{
line-height: 40px;
}
}
.no_margin {
margin: 0;
}
.weekly_margin{
margin: 0 0 6px 100px;
::v-deep .el-form-item__error{
top: 70%;
}
}
.step_select{
display: flex;
font-size: 14px;
margin-bottom: 20px;
div{
margin-right: 30px;
}
.step_select_audio{
margin-left: 5px;
padding: 5px;
}
}
.step_select_list{
display: flex;
.step_upload{
width: 164px;
height: 172px;
margin-right: 16px;
border: 1px dashed #dcdde3;
background: url(~@/assets/images/t-sc.png) #f2f7ff no-repeat center center;
background-size: 36px 29px;
border-radius: 6px;
}
}
.material_item{
position: relative;
.select_delt{
position: absolute;
top: 12px;
right: 12px;
.font-icon{
width: 19px;
height: 19px;
}
}
.select_edit{
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 44px;
background: rgba(0,0,0,.5);
text-align: center;
.font-icon{
width: 16px;
height: 17px;
margin-top: 12px;
}
}
}
.step_form{
padding-top: 30px;
.select_all_tip{
margin: -20px 0 0 0;
}
.select_other{
margin: -20px 0 0 0;
}
}
.drag_list{
display: flex;
flex-wrap: wrap;
}
.upload_return{
color: #8ebcfe;
}
.total_time{
position: absolute;
top: 72px;
right: 24px;
font-size: 14px;
color: #000;
}
.edit_material{
display: flex;
padding: 12px 0;
border-bottom: 1px solid #f2f6fd;
&:nth-last-child(2){
border-bottom: none;
}
.edit_img{
position: relative;
width: 58px;
height: 77px;
border-radius: 4px;
overflow: hidden;
img{
display: block;
width: 100%;
height: 100%;
}
.radio_img {
width: 58px;
height: 77px;
background: url(~@/assets/images/t-yp.png) no-repeat #b3e8fa center;
background-size: 40px 40px;
}
span{
position: absolute;
top: -1px;
left: -1px;
display: block;
width: 20px;
height: 14px;
font-size: 12px;
text-align: center;
color: #fff;
line-height: 14px;
}
}
&:nth-child(odd){
.edit_img{
span{
background: url(~@/assets/images/num_bg2.png) no-repeat;
background-size: 20px 14px;
}
}
}
&:nth-child(even){
.edit_img{
span{
background: url(~@/assets/images/num_bg1.png) no-repeat;
background-size: 20px 14px;
}
}
}
.edit_cont{
display: flex;
flex-direction: column ;
justify-content: space-between;
flex: 1;
padding: 10px 0 8px 0;
font-size: 14px;
margin-left: 25px;
.edit_cont_base{
display: flex;
p{
margin-right: 14px;
color: #000;
}
span{
display: inline-block;
padding: 0 5px;
margin-right: 8px;
font-size: 12px;
line-height: 16px;
color: #3a8aeb;
background: #cde4ff;
border-radius: 2px;
}
}
.edit_cont_set{
display: flex;
font-size: 12px;
color: #666;
line-height: 26px;
.set_time{
display: flex;
margin-right: 30px;
span{
margin-right: 8px;
}
em{
display: block;
margin-left: 8px;
font-style: normal;
}
}
.set_animation{
display: flex;
margin-right: 30px;
span.set_item{
margin-right: 8px;
}
}
.set_audio{
.audio_name{
margin-right: 10px;
}
::v-deep .el-button--small{
padding: 0 15px;
border: none;
}
}
::v-deep .el-input__inner{
text-align: center;
height: 27px;
line-height: 27px;
}
::v-deep .el-input__icon{
line-height: 27px;
}
}
.edit_cont_other{
line-height: 27px;
font-size: 12px;
color: #666;
}
}
}
.release_layer{
::v-deep .el-dialog__header{
padding: 0;
height: 60px;
}
.layer_tab_title{
display: flex;
span{
position: relative;
display: block;
margin-right: 32px;
line-height: 60px;
font-size: 18px;
color: #666;
cursor: pointer;
&.active{
color: #333;
}
&.active::after{
content: "";
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 3px;
background: #3a8aeb;
}
}
}
.tab_item{
display: flex;
font-size: 14px;
color: #666;
margin: -14px 0 16px 0;
li{
margin-right: 30px;
cursor: pointer;
span{
display: inline-block;
margin-left: 4px;
}
&.active{
color: #3a8aeb;
}
}
}
.material_list{
display: flex;
flex-wrap: wrap;
.item_cont{
margin: 0 24px 20px 0;
}
}
}
.theme_cont{
::v-deep .el-tabs__header {
padding: 0;
margin-bottom: 0;
}
}
.release_layer {
::v-deep .el-tabs{
margin: -26px 0 8px 0;
}
::v-deep .el-tabs__nav-wrap::after{
display: none;
}
::v-deep .el-tabs__active-bar{
display: none;
}
}
</style>