Browse Source

即时发布

dev
xuhuajiao 3 years ago
parent
commit
e9a75e020f
  1. 9
      src/api/material/material.js
  2. 10
      src/api/release/release.js
  3. 10
      src/utils/index.js
  4. 201
      src/views/components/MaterialCompontentList.vue
  5. 761
      src/views/immediateRelease/index.vue
  6. 31
      src/views/materialContent/index.vue
  7. 162
      src/views/materialContent/materialList/index.vue

9
src/api/material/material.js

@ -53,3 +53,12 @@ export function moveMyMaterial(parameter) {
data: parameter
})
}
// 根据素材类型获取素材 - 素材库
export function getMaterialByType(parameter) {
return request({
url: 'api/material/getMaterialByType',
method: 'get',
params: parameter
})
}

10
src/api/release/release.js

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 编辑 - 发布信息
export function saveRelease(parameter) {
return request({
url: 'api/release/saveRelease',
method: 'post',
data: parameter
})
}

10
src/utils/index.js

@ -421,3 +421,13 @@ export function getSeconds(s) {
return result
}
}
// 字节大小转换为的KB、MB、GB
export function formatBytes(bytes, decimals) {
if (bytes == 0) return '0 Bytes'
var k = 1024
var dm = decimals || 2
var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
var i = Math.floor(Math.log(bytes) / Math.log(k))
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]
}

201
src/views/components/MaterialCompontentList.vue

@ -0,0 +1,201 @@
<template>
<div ref="materialContent" class="material_content">
<div v-if="isToFolder" class="material_item cont_upload">
<el-button class="return_btn" round type="primary" @click="returnFolder">返回</el-button>
</div>
<!-- 文件夹list -->
<div v-for="(item,index) in materialFolders" :key="item.id" :class="['material_item', 'folder']" @dblclick="floderDbClick(item,index)">
<div class="icon_bg">
<svg v-if="!item.imgPath" class="font-icon icon" aria-hidden="true">
<use xlink:href="#icon-wenjianjia" />
</svg>
<img v-else :src="item.imgPath" />
</div>
<p class="file_name">{{ item.name }}</p>
</div>
<div
v-for="(item, index) in materialList"
:key="'list-'+index"
:class="['material_item', 'item_cont', { 'item_multi': selectedListId.includes(item.material_id) }]"
>
<img v-if="item.img_path || item.material_type == 1" :src="item.img_path" :onerror="defaultImg" alt />
<div v-if="item.material_type == 2" class="radio_img"></div>
<div class="item_format">
<span class="item_type">{{ materialPostfix[index] }}</span>
<span v-if="item.material_type !== '0'" class="item_time">{{ item.duration | getSeconds }}</span>
</div>
<div class="file_name">{{ item.material_name }}</div>
<span v-if="isMultiSelected" class="checked_btn" @click="checkedItem(item)"></span>
</div>
</div>
</template>
<script>
import { getMaterialList } from '@/api/material/material'
import { getSeconds } from '@/utils/index.js'
export default {
name: 'MaterialList',
components: { },
filters: {
getSeconds(s) {
return getSeconds(s)
}
},
props: {
isMultiSelected: {
type: Boolean,
required: true
}
},
data() {
return {
orga_id: '133221333123111', // ID
rootFolderId: null, // ID
thisFoldId: null, // ID
materialFolders: [], // list
materialList: [], // list
materialPostfix: [], //
selectedMaterial: [], //
selectedListId: [], // material_id
selectinFolderid: [], // id -- in_folder_id
isToFolder: false, //
isReturn: false, //
currentFolderId: null // ID
}
},
computed: {
changePlaceholder() {
return this.publishType === 0 ? '即时发布 2022-01-01' : '定时发布 2022-01-01'
},
defaultImg() {
return 'this.src="' + require('@/assets/images/menu_bg_02.png') + '"'
}
},
watch: {
isMultiSelected(newName, oldName) {
if (newName === false) {
this.selectedListId = []
}
}
},
mounted() {
this.getMaterialList()
},
methods: {
// list
getMaterialList() {
this.materialFolders = []
this.materialList = []
let params
if (this.isToFolder) {
console.log('文件夹内')
let folder_id
if (this.isReturn) {
folder_id = this.rootFolderId
} else {
this.currentFolderId = localStorage.getItem('currentFolderId')
folder_id = this.currentFolderId
}
params = {
'folder_id': folder_id,
'material_name': null,
'material_type': null,
'orga_id': this.orga_id
}
} else {
console.log('文件夹外')
localStorage.removeItem('currentFolderId')
params = {
'folder_id': null,
'material_name': null,
'material_type': null,
'orga_id': this.orga_id
}
}
getMaterialList(params).then(res => {
if (res.code == 200) {
if (!this.isToFolder) {
localStorage.setItem('rootFolderId', res.data.thisFoldId)
}
this.materialFolders = res.data.materialFolders
this.materialList = res.data.pageThemeVO
// data
this.thisFoldId = res.data.thisFoldId
//
this.materialList.forEach((item, key) => {
this.materialPostfix[key] = item.deposit_url.substring(
item.deposit_url.lastIndexOf('.') + 1,
item.deposit_url.length
)
})
} else {
this.$message({
message: res.msg,
type: 'error'
})
}
})
},
returnFolder() {
this.isReturn = false
this.isToFolder = false
this.rootFolderId = localStorage.getItem('rootFolderId')
this.getMaterialList()
},
//
floderDbClick(item, index) {
this.isToFolder = true
this.currentFolderId = item.id
localStorage.setItem('currentFolderId', this.currentFolderId)
this.getMaterialList()
this.selectedListId = []
},
// -
checkedItem(item) {
const id = item.material_id
const inFolderId = item.in_folder_id
const type = item.material_type
const arr = this.selectedListId
if (arr.includes(id)) {
const index = arr.indexOf(id)
if (index > -1) {
arr.splice(index, 1)
this.selectinFolderid.splice(index, 1)
this.selectedMaterial.splice(index, 1)
}
} else {
this.selectedListId.push(id)
this.selectinFolderid.push(inFolderId)
this.selectedMaterial.push(item)
this.formatType = type
}
}
}
}
</script>
<style lang="scss" scoped>
.material_content {
display: flex;
flex-wrap: wrap;
.material_item {
position: relative;
width: 174px;
height: 182px;
border-radius: 4px;
margin: 0 20px 20px 0;
overflow: hidden;
}
.item_cont {
border-color: #dcdde3;
img {
width: 100%;
height: 148px;
}
.radio_img {
width: 100%;
height: 148px;
}
}
}
</style>

761
src/views/immediateRelease/index.vue
File diff suppressed because it is too large
View File

31
src/views/materialContent/index.vue

@ -2,14 +2,7 @@
<div class="app-container">
<div class="content_warp">
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="全部" name="first">
<MaterialList
ref="MaterialList"
:is-multi-selected="isMultiSelected"
:mulit-text="mulitText"
@changedMultiSelected="changedMultiSelected"
/>
</el-tab-pane>
<el-tab-pane label="全部" name="first" />
<el-tab-pane name="second">
<span slot="label">
图片
@ -32,6 +25,7 @@
yinp
</el-tab-pane>
</el-tabs>
<MaterialList ref="MaterialList" :is-multi-selected="isMultiSelected" :mulit-text="mulitText" @changedMultiSelected="changedMultiSelected" />
</div>
<div class="material_btn">
<el-button round type="primary" @click="handleUpload">上传列表</el-button>
@ -45,31 +39,26 @@ import MaterialList from './materialList/index'
export default {
name: 'MaterialContent',
components: { MaterialList },
data() {
data () {
return {
activeName: 'first',
activeIndex: 0,
isMultiSelected: false,
mulitText: '多选'
}
},
methods: {
handleClick(tab, event) {
console.log(tab, event)
handleClick (tab) {
console.log(tab.index)
},
handleUpload() {
handleUpload () {
this.$refs.MaterialList.UploadList()
},
multiSelectBtn() {
multiSelectBtn () {
this.isMultiSelected = !this.isMultiSelected
if (this.isMultiSelected) {
this.mulitText = '取消'
} else {
this.mulitText = '多选'
}
// this.$refs.MaterialList.multiSelectList()
this.mulitText = this.isMultiSelected ? '取消' : '多选'
},
//
changedMultiSelected() {
changedMultiSelected () {
if (this.isMultiSelected) {
this.isMultiSelected = false
this.mulitText = '多选'

162
src/views/materialContent/materialList/index.vue

@ -26,11 +26,7 @@
<span v-if="folderChecked == index" class="checked_btn"></span>
</div>
<!-- 素材库list -->
<div
v-for="(item, index) in materialList"
:key="'list-'+index"
:class="['material_item', 'item_cont', { 'item_multi': selectedList.includes(item.material_id) }]"
>
<div v-for="(item, index) in materialList" :key="'list-'+index" :class="['material_item', 'item_cont', { 'item_multi': selectedListId.includes(item.material_id) }]">
<img v-if="item.img_path || item.material_type == 1" :src="item.img_path" :onerror="defaultImg" alt />
<div v-if="item.material_type == 2" class="radio_img"></div>
<div class="item_format">
@ -38,27 +34,17 @@
<span v-if="item.material_type !== '0'" class="item_time">{{ item.duration | getSeconds }}</span>
</div>
<div class="file_name">{{ item.material_name }}</div>
<span v-if="isMultiSelected" class="checked_btn" @click="selectedItem(item.material_id, item.in_folder_id, item.material_type)"></span>
<span v-if="isMultiSelected" class="checked_btn" @click="selectedItem(item)"></span>
</div>
</div>
<!-- 创建文件夹layer / 编辑 -->
<div class="publish_layer">
<el-dialog
:title="layerTitle"
:close-on-click-modal="false"
:show-close="false"
:visible.sync="mkdirVisible"
width="616px"
>
<el-dialog :title="layerTitle" :close-on-click-modal="false" :show-close="false" :visible.sync="mkdirVisible" width="616px">
<el-form ref="folderForm" :inline="true" :model="folderForm" size="small" label-width="100px">
<el-form-item
:label="labelTxt"
prop="name"
:rules="[
<el-form-item :label="labelTxt" prop="name" :rules="[
{ required: true, message: '请输入名称', trigger: 'blur' }
]"
>
]">
<el-input v-model="folderForm.name" style="width: 336px" />
</el-form-item>
<el-form-item v-if="formatType != 0" label="封面">
@ -74,26 +60,17 @@
</div>
<!-- 多选操作 -->
<div v-if="selectedList.length != 0 || folderChecked != -1" class="multi_handle">
<div v-if="isEditFolder != true && folderChecked == -1 && isMultiSelected">
<div v-if="selectedListId.length != 0 || folderChecked != -1" class="multi_handle">
<div v-if="!isEditFolder && folderChecked == -1 && isMultiSelected">
<el-button type="button" class="mulit_btn" @click="publishHandle(0)">即时发布</el-button>
<el-button type="button" class="mulit_btn" @click="publishHandle(1)">定时发布</el-button>
<el-button
type="button"
class="mulit_btn"
:disabled="selectedList.length > 1"
@click="editContent()"
>编辑</el-button>
<el-button type="button" class="mulit_btn" :disabled="selectedListId.length > 1" @click="editContent()">编辑</el-button>
<el-button type="button" class="mulit_btn">下载</el-button>
<el-button type="button" class="mulit_btn" @click="moveingTo()">移动</el-button>
<el-button type="button" class="mulit_btn mulit_delt_btn" @click="deleteMyMaterial">删除</el-button>
</div>
<div v-else>
<el-button
type="button"
class="mulit_btn"
@click="handleMkdir(1)"
>编辑</el-button>
<el-button type="button" class="mulit_btn" @click="handleMkdir(1)">编辑</el-button>
<el-button type="button" class="mulit_btn mulit_delt_btn" @click="deleteMaterialFolder">删除</el-button>
</div>
</div>
@ -101,21 +78,9 @@
<!-- 移动至layer -->
<div class="wjj_layer">
<!-- width="736px" -->
<el-dialog
title="移动至"
:close-on-click-modal="false"
:show-close="false"
:visible.sync="movingVisible"
width="576px"
height="384px"
>
<el-dialog title="移动至" :close-on-click-modal="false" :show-close="false" :visible.sync="movingVisible" width="576px" height="384px">
<div class="wjj_list">
<div
v-for="(item, index) in folderList"
:key="index"
:class="['wjj_item', { 'wjj_item_active': folderListChecked == index }]"
@click="wjjSelected(item,index)"
>
<div v-for="(item, index) in folderList" :key="index" :class="['wjj_item', { 'wjj_item_active': folderListChecked == index }]" @click="wjjSelected(item,index)">
<svg class="font-icon icon" aria-hidden="true">
<use xlink:href="#icon-wenjianjia" />
</svg>
@ -132,15 +97,15 @@
</template>
<script>
import { getMaterialList, saveMaterialFolder, deleteMaterialFolder, saveMaterial, deleteMyMaterial, moveMyMaterial } from '@/api/material/material'
import { getMaterialList, saveMaterialFolder, deleteMaterialFolder, saveMaterial, deleteMyMaterial, moveMyMaterial, getMaterialByType } from '@/api/material/material'
import Upload from '../../components/upload'
import UploadCover from '../../components/upload_cover'
import { getSeconds } from '@/utils/index.js'
export default {
name: 'MaterialList',
name: 'Material',
components: { Upload, UploadCover },
filters: {
getSeconds(s) {
getSeconds (s) {
return getSeconds(s)
}
},
@ -150,7 +115,7 @@ export default {
required: true
}
},
data() {
data () {
return {
orga_id: '133221333123111', // ID
rootFolderId: null, // ID
@ -176,12 +141,12 @@ export default {
materialDuration: 0, //
materialName: '', //
uploadFileUrl: null, //
selectedList: [], // material_id
selectedMaterial: [], //
selectedListId: [], // material_id
selectinFolderid: [], // id -- in_folder_id
layerTitle: '创建文件夹', // /title
labelTxt: '文件夹名称',
isToFolder: false, //
isToFolderRouter: null,
currentFolder: '', //
currentFolderId: null,
movingVisible: false,
@ -192,19 +157,18 @@ export default {
}
},
computed: {
defaultImg() {
defaultImg () {
return 'this.src="' + require('@/assets/images/menu_bg_02.png') + '"'
}
},
watch: {
isMultiSelected(newName, oldName) {
isMultiSelected (newName, oldName) {
console.log('newName', newName)
if (newName === false) {
this.selectedList = []
this.selectedListId = []
}
this.isPropMultiSelected = newName
},
'$route.query.folderTag'(Val) {
'$route.query.folderTag' (Val) {
console.log(Val)
// if (Val) {
// this.isToFolder = true
@ -213,14 +177,14 @@ export default {
// }
}
},
mounted: function() {
mounted: function () {
console.log(this.$route.query.folderTag)
this.getMaterialList()
document.addEventListener('click', this.hiddenFolderActiveClick)
},
methods: {
// list
getMaterialList() {
getMaterialList () {
let params
if (this.$route.query.folderTag) {
console.log('文件夹内')
@ -264,7 +228,7 @@ export default {
})
},
// /
handleMkdir(mkdirType) {
handleMkdir (mkdirType) {
this.mkdirVisible = true
this.folderForm.fid = this.thisFoldId
this.folderForm.orga_id = this.orga_id
@ -282,7 +246,7 @@ export default {
}
},
//
floderDbClick(item, index) {
floderDbClick (item, index) {
this.isEditMaterial = false
this.$router.replace(
{
@ -294,19 +258,19 @@ export default {
localStorage.setItem('currentFolder', this.currentFolder)
localStorage.setItem('currentFolderId', this.currentFolderId)
this.getMaterialList()
this.selectedList = []
this.selectedListId = []
this.folderChecked = -1
this.isEditFolder = false
},
//
hiddenFolderActiveClick() {
hiddenFolderActiveClick () {
this.folderChecked = -1
this.isEditFolder = false
},
//
editFolder(item, index) {
editFolder (item, index) {
this.isEditMaterial = false
this.selectedList = []
this.selectedListId = []
//
this.$emit('changedMultiSelected')
if (index != this.folderChecked) {
@ -325,7 +289,7 @@ export default {
}
},
//
deleteMaterialFolder() {
deleteMaterialFolder () {
this.$confirm('此操作将永久删除该文件夹, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
@ -353,7 +317,7 @@ export default {
})
},
// - /
submitForm(formName) {
submitForm (formName) {
this.folderForm.img_path = this.$refs.childUpload.imageUrl
this.$refs[formName].validate((valid) => {
if (valid) {
@ -381,21 +345,23 @@ export default {
})
},
//
resetForm() {
resetForm () {
// folderForm
// Object.assign(this.$data.folderForm, this.$options.data.call(this).folderForm)
this.mkdirVisible = false
},
// - to /
publishHandle(index) {
publishHandle (index) {
this.$router.push(
{
path: '/release', query: { tag: index }
}
)
localStorage.removeItem('selectedMaterial')
localStorage.setItem('selectedMaterial', JSON.stringify(this.selectedMaterial))
},
// -
editContent() {
editContent () {
this.mkdirVisible = true
this.labelTxt = '文件名称'
this.isEditMaterial = true
@ -407,7 +373,7 @@ export default {
this.layerTitle = '图片编辑'
}
const checkedMaterial = this.materialList.filter(item => {
return item.material_id == this.selectedList[0]
return item.material_id == this.selectedListId[0]
})
this.materialId = checkedMaterial[0].material_id
this.folderForm.name = checkedMaterial[0].material_name
@ -416,9 +382,10 @@ export default {
this.materialImgPath = checkedMaterial[0].img_path
},
//
saveMaterial() {
saveMaterial () {
if (!this.isEditMaterial) {
console.log('新增')
console.log(this.$refs.uploadMaterial.fileSize)
const formatType = this.$refs.uploadMaterial.formatType
this.uploadFileUrl = this.$refs.uploadMaterial.uploadFileUrl
const duration = this.$refs.uploadMaterial.duration
@ -449,7 +416,7 @@ export default {
setTimeout(() => {
const params = {
'class_ids': [
// id
// id
],
'deposit_url': this.uploadFileUrl, //
'device_direction': 1, // 1. 2.,
@ -459,6 +426,7 @@ export default {
'img_path': this.materialImgPath, // id
'material_name': this.materialName, //
'material_type': this.formatType, //
'file_size': this.$refs.uploadMaterial.fileSize, //
'orga_id': this.orga_id, // id
'store_type': 1 // 1. 2.
}
@ -481,29 +449,34 @@ export default {
}, 200)
},
// -
selectedItem(id, inFolderId, type) {
const arr = this.selectedList
selectedItem (item) {
const id = item.material_id
const inFolderId = item.in_folder_id
const type = item.material_type
const arr = this.selectedListId
if (arr.includes(id)) {
const index = arr.indexOf(id)
if (index > -1) {
arr.splice(index, 1)
this.selectinFolderid.splice(index, 1)
this.selectedMaterial.splice(index, 1)
}
} else {
this.selectedList.push(id)
this.selectedListId.push(id)
this.selectinFolderid.push(inFolderId)
this.selectedMaterial.push(item)
this.formatType = type
}
},
// -
deleteMyMaterial() {
deleteMyMaterial () {
this.$confirm('此操作将永久删除该素材, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
const params = {
ids: this.selectedList
ids: this.selectedListId
}
deleteMyMaterial(params).then(res => {
if (res.code === 200) {
@ -512,7 +485,7 @@ export default {
type: 'success'
})
this.getMaterialList()
this.selectedList = []
this.selectedListId = []
}
})
}).catch(() => {
@ -522,11 +495,11 @@ export default {
})
})
},
UploadList() {
UploadList () {
this.uploadListVisible = true
},
// -btn
moveingTo(index) {
moveingTo (index) {
this.folderList = []
if (this.materialFolders.length > 0) {
this.folderList = this.materialFolders.slice(0, this.materialFolders.length)
@ -540,14 +513,13 @@ export default {
this.movingVisible = true
},
// list -
wjjSelected(item, index) {
wjjSelected (item, index) {
this.folderListChecked = index
this.thisFoldId = item.id
},
// -
moveFile() {
moveFile () {
if (this.materialFolders.length > 0) {
console.log(this.materialFolders)
if (this.thisFoldId == this.rootFolderId) {
this.$message({
message: '不能讲文件移动到自身目录下哦~',
@ -561,7 +533,7 @@ export default {
const params = {
'folder_id': this.thisFoldId,
'ids': this.selectinFolderid,
'material_ids': this.selectedList
'material_ids': this.selectedListId
}
moveMyMaterial(params).then(res => {
if (res.code === 200) {
@ -571,14 +543,14 @@ export default {
})
this.movingVisible = false
this.getMaterialList()
this.selectedList = []
this.selectedListId = []
}
})
},
format(percentage) {
format (percentage) {
return percentage === 100 ? '100%' : `${percentage}%`
},
start() {
start () {
const that = this
that.$nextTick(() => {
that.progressLoading = true
@ -591,7 +563,7 @@ export default {
})
},
//
end() {
end () {
this.loading_txt = '继续'
// const that = this
// that.percentage = 100
@ -605,9 +577,9 @@ export default {
</script>
<style lang="scss" scoped>
.material_crumbs{
.material_crumbs {
padding: 0 24px 15px 24px;
::v-deep .el-breadcrumb{
::v-deep .el-breadcrumb {
font-size: 12px;
color: #999999;
}
@ -636,8 +608,8 @@ export default {
}
}
}
.upload_layer{
::v-deep .el-dialog__body{
.upload_layer {
::v-deep .el-dialog__body {
padding: 0 20px 30px 20px;
}
}
@ -650,8 +622,8 @@ export default {
}
}
}
.multi_handle{
div{
.multi_handle {
div {
display: flex;
}
}

Loading…
Cancel
Save