多媒体信息发布平台
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.

697 lines
23 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. <template>
  2. <div>
  3. <div v-if="isToFolder" class="material_crumbs">
  4. <el-breadcrumb separator-class="el-icon-arrow-right">
  5. <el-breadcrumb-item><a href="/content/material">素材库</a></el-breadcrumb-item>
  6. <el-breadcrumb-item>{{ currentFolder }}</el-breadcrumb-item>
  7. </el-breadcrumb>
  8. </div>
  9. <div class="material_content">
  10. <!-- 上传 / 创建文件夹 -->
  11. <div class="material_item cont_upload">
  12. <Upload ref="uploadMaterial" :is-theme="isTheme" @saveMaterial="saveMaterial" />
  13. <el-button v-if="!isToFolder && tabType == null" class="mkdir_btn" round type="primary" @click="handleMkdir(0)">创建文件夹</el-button>
  14. <el-button v-if="isToFolder" class="return_btn" round type="primary"><a href="/content/material">返回</a></el-button>
  15. </div>
  16. <!-- 文件夹list -->
  17. <div v-for="(item,index) in materialFolders" :key="item.id" :class="['material_item', 'folder', { 'item_multi': folderChecked == index }]" @click.stop="editFolder(item,index)" @dblclick="floderDbClick(item,index)">
  18. <div class="icon_bg">
  19. <svg v-if="!item.imgPath" class="font-icon icon" aria-hidden="true">
  20. <use xlink:href="#icon-wenjianjia" />
  21. </svg>
  22. <img v-else :src="item.imgPath" />
  23. </div>
  24. <p class="file_name">{{ item.name }}</p>
  25. <span v-if="folderChecked == index" class="checked_btn"></span>
  26. </div>
  27. <!-- 素材库list -->
  28. <div v-for="(item, index) in materialList" :key="'list-'+index" :class="['material_item', 'item_cont', { 'item_multi': selectedListId.includes(item.material_id) }]" @click.stop="previewMaterial(item)">
  29. <div v-if="item.img_path || item.material_type == 1" class="img_box">
  30. <img :src="item.img_path" :onerror="defaultImg" alt />
  31. </div>
  32. <div v-if="!item.img_path && item.material_type == 2" class="radio_img"></div>
  33. <div class="item_format">
  34. <span class="item_type">{{ item.deposit_url | getFileFormat }}</span>
  35. <span v-if="item.material_type !== '0'" class="item_time">{{ item.duration | getSeconds }}</span>
  36. </div>
  37. <div class="file_name">{{ item.material_name }}</div>
  38. <span v-if="isMultiSelected" class="checked_btn" @click.stop="selectedItem(item)"></span>
  39. </div>
  40. </div>
  41. <!-- 素材点击预览 -->
  42. <div class="">
  43. <el-dialog
  44. title="预览"
  45. :visible.sync="previewVisible"
  46. :show-close="false"
  47. >
  48. <el-image v-if="previewType==0" :src="previewSrc" :onerror="defaultImg" fit="contain" />
  49. <video v-if="previewType==1" :src="previewSrc" controls width="100%"></video>
  50. <audio v-if="previewType==2" :src="previewSrc" controls></audio>
  51. </el-dialog>
  52. </div>
  53. <!-- 创建文件夹layer / 编辑 -->
  54. <div class="publish_layer">
  55. <el-dialog :title="layerTitle" :close-on-click-modal="false" :show-close="false" :visible.sync="mkdirVisible" width="616px">
  56. <el-form ref="folderForm" :inline="true" :model="folderForm" size="small" label-width="100px">
  57. <el-form-item
  58. :label="labelTxt"
  59. prop="name"
  60. :rules="[
  61. { required: true, message: '请输入名称', trigger: 'blur' }
  62. ]"
  63. >
  64. <el-input v-model="folderForm.name" style="width: 336px" />
  65. </el-form-item>
  66. <el-form-item v-if="formatType != 0" label="封面">
  67. <UploadCover ref="childUpload" />
  68. </el-form-item>
  69. </el-form>
  70. <div slot="footer" class="dialog-footer">
  71. <el-button v-if="!isEditMaterial" type="primary" round @click="submitForm('folderForm')"> </el-button>
  72. <el-button v-else type="primary" round @click="saveMaterial"> </el-button>
  73. <el-button round @click="resetForm()"> </el-button>
  74. </div>
  75. </el-dialog>
  76. </div>
  77. <!-- 多选操作 -->
  78. <div v-if="selectedListId.length != 0 || folderChecked != -1" class="multi_handle">
  79. <div v-if="!isEditFolder && folderChecked == -1 && isMultiSelected">
  80. <el-button type="button" class="mulit_btn" @click="publishHandle(0)">即时发布</el-button>
  81. <el-button type="button" class="mulit_btn" @click="publishHandle(1)">定时发布</el-button>
  82. <el-button type="button" class="mulit_btn" :disabled="selectedListId.length > 1" @click="editContent()">编辑</el-button>
  83. <el-button type="button" class="mulit_btn" :disabled="selectedListId.length > 1" @click="downloadMaterial">下载</el-button>
  84. <el-button type="button" class="mulit_btn" @click="moveingTo()">移动</el-button>
  85. <el-button type="button" class="mulit_btn mulit_delt_btn" @click="deleteMyMaterial">删除</el-button>
  86. </div>
  87. <div v-else>
  88. <el-button type="button" class="mulit_btn" @click="handleMkdir(1)">编辑</el-button>
  89. <el-button type="button" class="mulit_btn mulit_delt_btn" @click="deleteMaterialFolder">删除</el-button>
  90. </div>
  91. </div>
  92. <!-- 移动至layer -->
  93. <div class="wjj_layer">
  94. <el-dialog title="移动至" :close-on-click-modal="false" :show-close="false" :visible.sync="movingVisible" width="576px" height="384px">
  95. <div class="wjj_list">
  96. <div v-for="(item, index) in folderList" :key="index" :class="['wjj_item', { 'wjj_item_active': folderListChecked == index }]" @click="wjjSelected(item,index)">
  97. <svg class="font-icon icon" aria-hidden="true">
  98. <use xlink:href="#icon-wenjianjia" />
  99. </svg>
  100. <p class="wjj_name">{{ item.name }}</p>
  101. </div>
  102. </div>
  103. <div slot="footer" class="dialog-footer">
  104. <el-button type="primary" round @click="moveFile">确定</el-button>
  105. <el-button round @click="movingVisible=false">取消</el-button>
  106. </div>
  107. </el-dialog>
  108. </div>
  109. </div>
  110. </template>
  111. <script>
  112. import { getMaterialList, saveMaterialFolder, deleteMaterialFolder, saveMaterial, deleteMyMaterial, moveMyMaterial } from '@/api/material/material'
  113. import Upload from '@/views/components/upload'
  114. import UploadCover from '@/views/components/upload_cover'
  115. import { getSeconds, getFileFormat } from '@/utils/index.js'
  116. export default {
  117. name: 'Material',
  118. components: { Upload, UploadCover },
  119. filters: {
  120. getSeconds(s) {
  121. return getSeconds(s)
  122. },
  123. getFileFormat(s) {
  124. return getFileFormat(s)
  125. }
  126. },
  127. props: {
  128. isMultiSelected: {
  129. type: Boolean,
  130. required: true
  131. },
  132. activeIndex: {
  133. type: String,
  134. required: true
  135. }
  136. },
  137. data() {
  138. return {
  139. isTheme: false,
  140. orga_id: '133221333123111', // 机构ID
  141. rootFolderId: null, // 根目录文件夹ID
  142. thisFoldId: null, // 当前父文件夹ID
  143. folderList: [], // 文件夹list
  144. materialFolders: [], // 文件夹list
  145. folderForm: { // form
  146. fid: '',
  147. id: '',
  148. img_path: '',
  149. name: '',
  150. orga_id: ''
  151. },
  152. isEditFolder: false, // 是否编辑文件夹
  153. mkdirVisible: false, // 新建编辑layer
  154. folderChecked: -1, // 文件夹是否单击选中
  155. materialList: [], // 素材库list
  156. isEditMaterial: false, // 是否是编辑素材
  157. formatType: null, // 上传素材类型 0 img 1 video 2 audio
  158. materialId: null, // 编辑时需要参数 id
  159. materialImgPath: '', // 素材封面
  160. materialDuration: 0, // 时长
  161. materialName: '', // 素材名称
  162. uploadFileUrl: null, // 素材保存路径
  163. selectedMaterial: [], // 素材选中
  164. selectedListId: [], // 素材选中的material_id
  165. selectInFolderid: [], // 素材选中的和文件关联表id -- in_folder_id
  166. layerTitle: '创建文件夹', // 文件夹/素材编辑框title
  167. labelTxt: '文件夹名称',
  168. isToFolder: false, // 是否进入文件夹
  169. currentFolder: '', // 当前进入的文件夹名
  170. currentFolderId: null,
  171. movingVisible: false,
  172. uploadListData: [ // 上传列表
  173. ],
  174. folderListChecked: -1,
  175. tabType: null,
  176. audioNum: 0,
  177. imgNum: 0,
  178. videoNum: 0,
  179. previewVisible: false, // 预览
  180. previewSrc: null,
  181. previewType: null
  182. }
  183. },
  184. computed: {
  185. defaultImg() {
  186. return 'this.src="' + require('@/assets/images/menu_bg_02.png') + '"'
  187. }
  188. },
  189. watch: {
  190. isMultiSelected(newName, oldName) {
  191. if (newName === false) {
  192. this.selectedListId = []
  193. }
  194. },
  195. activeIndex(newName, oldName) {
  196. this.tabIndex = newName
  197. this.$nextTick(() => {
  198. switch (this.tabIndex) {
  199. case '0':
  200. this.$refs.uploadMaterial.isActiveType = null
  201. break
  202. case '1':
  203. this.formatType = 1
  204. this.$refs.uploadMaterial.isActiveType = 0
  205. break
  206. case '2':
  207. this.formatType = 2
  208. this.$refs.uploadMaterial.isActiveType = 1
  209. break
  210. case '3':
  211. this.formatType = 2
  212. this.$refs.uploadMaterial.isActiveType = 2
  213. break
  214. }
  215. })
  216. },
  217. '$route.query.folderTag'(Val) {
  218. // console.log(Val)
  219. }
  220. },
  221. mounted: function() {
  222. this.getMaterialList()
  223. document.addEventListener('click', this.hiddenFolderActiveClick)
  224. },
  225. methods: {
  226. // 素材下载
  227. downloadMaterial() {
  228. // console.log(this.selectedMaterial[0])
  229. // const url = this.selectedMaterial[0].deposit_url.lastIndexOf('.')
  230. // console.log(url)
  231. },
  232. // 素材单击预览
  233. previewMaterial(item) {
  234. this.previewVisible = true
  235. this.folderChecked = -1
  236. this.isEditFolder = false
  237. switch (item.material_type) {
  238. case '0':
  239. this.previewType = 0
  240. this.previewSrc = item.img_path
  241. break
  242. case '1':
  243. this.previewType = 1
  244. this.previewSrc = item.deposit_url
  245. break
  246. case '2':
  247. this.previewType = 2
  248. this.previewSrc = item.deposit_url
  249. break
  250. }
  251. },
  252. // 获取素材库list
  253. getMaterialList() {
  254. let params
  255. if (this.$route.query.folderTag) {
  256. this.isToFolder = true
  257. this.currentFolder = localStorage.getItem('currentFolder')
  258. this.currentFolderId = localStorage.getItem('currentFolderId')
  259. params = {
  260. 'folder_id': this.currentFolderId,
  261. 'material_name': null,
  262. 'material_type': this.tabType,
  263. 'material_type_not': null,
  264. 'orga_id': this.orga_id
  265. }
  266. } else {
  267. this.isToFolder = false
  268. localStorage.removeItem('currentFolder')
  269. localStorage.removeItem('currentFolderId')
  270. params = {
  271. 'folder_id': null,
  272. 'material_name': null,
  273. 'material_type': this.tabType,
  274. 'material_type_not': null,
  275. 'orga_id': this.orga_id
  276. }
  277. }
  278. getMaterialList(params).then(res => {
  279. if (!this.$route.query.folderTag) {
  280. localStorage.setItem('rootFolderId', res.data.thisFoldId)
  281. }
  282. this.materialFolders = res.data.materialFolders
  283. this.materialList = res.data.pageThemeVO
  284. this.audioNum = res.data.audioNum
  285. this.imgNum = res.data.imgNum
  286. this.videoNum = res.data.videoNum
  287. // 创建文件夹获取data
  288. this.thisFoldId = res.data.thisFoldId
  289. })
  290. },
  291. // 新建 / 编辑 文件夹
  292. handleMkdir(mkdirType) {
  293. this.mkdirVisible = true
  294. this.folderForm.fid = this.thisFoldId
  295. this.folderForm.orga_id = this.orga_id
  296. if (mkdirType === 0) {
  297. this.$nextTick(() => {
  298. this.$refs.childUpload.imageUrl = ''
  299. this.folderForm.img_path = ''
  300. this.folderForm.name = ''
  301. })
  302. delete this.folderForm.id
  303. } else {
  304. this.$nextTick(() => {
  305. this.$refs.childUpload.imageUrl = this.folderForm.img_path
  306. })
  307. }
  308. },
  309. // 文件夹双击操作
  310. floderDbClick(item, index) {
  311. this.isEditMaterial = false
  312. this.$router.replace(
  313. {
  314. path: '/content/material', query: { folderTag: 1 }
  315. }
  316. )
  317. this.currentFolder = item.name
  318. this.currentFolderId = item.id
  319. localStorage.setItem('currentFolder', this.currentFolder)
  320. localStorage.setItem('currentFolderId', this.currentFolderId)
  321. this.getMaterialList()
  322. this.selectedListId = []
  323. this.folderChecked = -1
  324. this.isEditFolder = false
  325. },
  326. // 点击其他区域选中的文件夹 去掉选中样式
  327. hiddenFolderActiveClick() {
  328. this.folderChecked = -1
  329. this.isEditFolder = false
  330. },
  331. // 选择 编辑 文件夹
  332. editFolder(item, index) {
  333. this.isEditMaterial = false
  334. this.selectedListId = []
  335. // 有选择中的文件夹时,同时存在素材多选操作时
  336. this.$emit('changedMultiSelected')
  337. if (index != this.folderChecked) {
  338. this.folderChecked = index
  339. this.isEditFolder = true
  340. this.folderForm = {
  341. fid: item.fid,
  342. id: item.id,
  343. name: item.name,
  344. img_path: item.imgPath,
  345. orga_id: item.orgaId
  346. }
  347. } else {
  348. this.folderChecked = -1
  349. this.isEditFolder = false
  350. }
  351. },
  352. // 删除 文件夹
  353. deleteMaterialFolder() {
  354. this.$confirm('此操作将永久删除该文件夹, 是否继续?', '提示', {
  355. confirmButtonText: '确定',
  356. cancelButtonText: '取消',
  357. type: 'warning'
  358. }).then(() => {
  359. const params = {
  360. id: this.folderForm.id
  361. }
  362. deleteMaterialFolder(params).then(res => {
  363. if (res.code === 200) {
  364. this.$message({
  365. message: '删除文件夹成功',
  366. type: 'success'
  367. })
  368. this.getMaterialList()
  369. this.folderChecked = -1
  370. this.isEditFolder = false
  371. }
  372. })
  373. }).catch(() => {
  374. this.$message({
  375. message: '已取消删除',
  376. type: 'info'
  377. })
  378. })
  379. },
  380. // 提交表单 - 新建/编辑
  381. submitForm(formName) {
  382. this.folderForm.img_path = this.$refs.childUpload.imageUrl
  383. this.$refs[formName].validate((valid) => {
  384. if (valid) {
  385. saveMaterialFolder(this.folderForm).then(res => {
  386. if (res.code === 200) {
  387. this.$message({
  388. message: '创建文件夹成功',
  389. duration: 2000,
  390. type: 'success'
  391. })
  392. this.mkdirVisible = false
  393. this.getMaterialList()
  394. } else {
  395. this.$message({
  396. message: '创建文件夹失败',
  397. duration: 2000,
  398. type: 'warning'
  399. })
  400. }
  401. })
  402. } else {
  403. console.log('error submit!!')
  404. return false
  405. }
  406. })
  407. },
  408. // 重置表单
  409. resetForm() {
  410. // 强制重置folderForm表单
  411. // Object.assign(this.$data.folderForm, this.$options.data.call(this).folderForm)
  412. this.mkdirVisible = false
  413. },
  414. // 选择素材 - to 即时发布/定时发布
  415. publishHandle(index) {
  416. localStorage.removeItem('selectedMaterial')
  417. localStorage.removeItem('releaseId')
  418. localStorage.setItem('selectedMaterial', JSON.stringify(this.selectedMaterial))
  419. // 判断是否选择了多个音频文件
  420. const resultAudio = []
  421. this.selectedMaterial.map(item => {
  422. if (item.material_type == 2) {
  423. resultAudio.push(item)
  424. }
  425. })
  426. if (resultAudio.length > 1) {
  427. this.$message.error('音频类型的文件只可选择1个')
  428. return
  429. }
  430. this.$router.push(
  431. {
  432. path: '/release', query: { tag: index }
  433. }
  434. )
  435. },
  436. // 素材 - 编辑
  437. editContent() {
  438. this.mkdirVisible = true
  439. this.labelTxt = '文件名称'
  440. this.isEditMaterial = true
  441. if (this.formatType == 1) {
  442. this.layerTitle = '视频编辑'
  443. } else if (this.formatType == 2) {
  444. this.layerTitle = '音频编辑'
  445. } else {
  446. this.layerTitle = '图片编辑'
  447. }
  448. const checkedMaterial = this.materialList.filter(item => {
  449. return item.material_id == this.selectedListId[0]
  450. })
  451. this.materialId = checkedMaterial[0].material_id
  452. this.folderForm.name = checkedMaterial[0].material_name
  453. this.materialDuration = checkedMaterial[0].duration
  454. this.uploadFileUrl = checkedMaterial[0].deposit_url
  455. this.materialImgPath = checkedMaterial[0].img_path
  456. },
  457. // 上传素材
  458. saveMaterial() {
  459. if (!this.isEditMaterial) {
  460. const formatType = this.$refs.uploadMaterial.formatType
  461. this.uploadFileUrl = this.$refs.uploadMaterial.uploadFileUrl
  462. // 视频和音频的时长
  463. const duration = this.$refs.uploadMaterial.duration
  464. this.materialName = this.$refs.uploadMaterial.fileNames
  465. switch (formatType) {
  466. case 'image':
  467. this.formatType = 0
  468. this.materialImgPath = this.uploadFileUrl
  469. this.materialDuration = 0
  470. break
  471. case 'video':
  472. this.formatType = 1
  473. this.materialDuration = duration
  474. break
  475. case 'audio':
  476. this.formatType = 2
  477. this.materialDuration = duration
  478. break
  479. }
  480. } else {
  481. this.materialName = this.folderForm.name
  482. this.$nextTick(() => {
  483. if (this.$refs.childUpload) {
  484. this.materialImgPath = this.$refs.childUpload.imageUrl
  485. }
  486. })
  487. }
  488. setTimeout(() => {
  489. const params = {
  490. 'class_ids': [
  491. // 素材类id集合
  492. ],
  493. 'deposit_url': this.uploadFileUrl, // 素材存放路径
  494. 'device_direction': 1, // 横竖屏 1.横屏 2.竖屏,
  495. 'duration': this.materialDuration, // 时长s
  496. 'material_id': this.materialId,
  497. 'folder_id': this.thisFoldId, // 文件夹id
  498. 'img_path': this.materialImgPath, // 封面图片id
  499. 'material_name': this.materialName, // 素材名称
  500. 'material_type': this.formatType, // 素材类别
  501. 'file_size': this.$refs.uploadMaterial.fileSize, // 文件大小
  502. 'orga_id': this.orga_id, // 机构id
  503. 'store_type': 1 // 库类型 1.素材库 2.主题库
  504. }
  505. if (!this.isEditMaterial) {
  506. // 新上传素材时不需要该字段
  507. delete params.material_id
  508. }
  509. saveMaterial(params).then(res => {
  510. if (res.code === 200) {
  511. this.$message({
  512. message: '上传素材成功',
  513. type: 'success'
  514. })
  515. this.mkdirVisible = false
  516. this.getMaterialList()
  517. this.materialImgPath = ''
  518. }
  519. })
  520. }, 200)
  521. },
  522. // 素材 - 多选
  523. selectedItem(item) {
  524. const id = item.material_id
  525. const inFolderId = item.in_folder_id
  526. const type = item.material_type
  527. const arr = this.selectedListId
  528. if (arr.includes(id)) {
  529. const index = arr.indexOf(id)
  530. if (index > -1) {
  531. arr.splice(index, 1)
  532. this.selectInFolderid.splice(index, 1)
  533. this.selectedMaterial.splice(index, 1)
  534. }
  535. } else {
  536. this.selectedListId.push(id)
  537. this.selectInFolderid.push(inFolderId)
  538. this.selectedMaterial.push(item)
  539. this.formatType = type
  540. }
  541. },
  542. // 素材 - 删除
  543. deleteMyMaterial() {
  544. this.$confirm('此操作将永久删除该素材, 是否继续?', '提示', {
  545. confirmButtonText: '确定',
  546. cancelButtonText: '取消',
  547. type: 'warning'
  548. }).then(() => {
  549. const params = {
  550. ids: this.selectedListId
  551. }
  552. deleteMyMaterial(params).then(res => {
  553. if (res.code === 200) {
  554. this.$message({
  555. message: '删除素材成功',
  556. type: 'success'
  557. })
  558. this.getMaterialList()
  559. this.selectedListId = []
  560. }
  561. })
  562. }).catch(() => {
  563. this.$message({
  564. message: '已取消删除',
  565. type: 'info'
  566. })
  567. })
  568. },
  569. UploadList() {
  570. this.$refs.uploadMaterial.uploadListVisible = true
  571. },
  572. // 点击-移动btn
  573. moveingTo(index) {
  574. this.folderList = []
  575. if (this.materialFolders.length > 0) {
  576. this.folderList = this.materialFolders.slice(0, this.materialFolders.length)
  577. }
  578. this.rootFolderId = localStorage.getItem('rootFolderId')
  579. const returnFolder = {
  580. id: this.rootFolderId,
  581. name: '返回上一级'
  582. }
  583. this.folderList.unshift(returnFolder)
  584. this.movingVisible = true
  585. },
  586. // 文件夹list - 选中操作
  587. wjjSelected(item, index) {
  588. this.folderListChecked = index
  589. this.thisFoldId = item.id
  590. },
  591. // 点击确定 - 移动素材
  592. moveFile() {
  593. if (this.materialFolders.length > 0) {
  594. if (this.thisFoldId == this.rootFolderId) {
  595. this.$message({
  596. message: '不能讲文件移动到自身目录下哦~',
  597. type: 'error'
  598. })
  599. return
  600. }
  601. } else {
  602. this.thisFoldId = this.rootFolderId
  603. }
  604. const params = {
  605. 'folder_id': this.thisFoldId,
  606. 'ids': this.selectInFolderid,
  607. 'material_ids': this.selectedListId
  608. }
  609. moveMyMaterial(params).then(res => {
  610. if (res.code === 200) {
  611. this.$message({
  612. message: '移动成功',
  613. type: 'success'
  614. })
  615. this.movingVisible = false
  616. this.getMaterialList()
  617. this.selectedListId = []
  618. }
  619. })
  620. },
  621. format(percentage) {
  622. return percentage === 100 ? '100%' : `${percentage}%`
  623. },
  624. start() {
  625. const that = this
  626. that.$nextTick(() => {
  627. that.progressLoading = true
  628. that.percentage = 0
  629. that.timeStart = setInterval(() => {
  630. if (that.percentage < 100) {
  631. that.percentage += 1
  632. }
  633. }, 100)
  634. })
  635. }
  636. }
  637. }
  638. </script>
  639. <style lang="scss" scoped>
  640. .material_crumbs {
  641. padding: 0 24px 15px 24px;
  642. margin-top: -20px;
  643. ::v-deep .el-breadcrumb {
  644. font-size: 12px;
  645. color: #999999;
  646. }
  647. }
  648. .material_content {
  649. display: flex;
  650. flex-wrap: wrap;
  651. margin-left: 24px;
  652. .material_item {
  653. position: relative;
  654. width: 174px;
  655. height: 182px;
  656. border-radius: 4px;
  657. margin: 0 20px 20px 0;
  658. overflow: hidden;
  659. }
  660. .item_cont {
  661. border-color: #dcdde3;
  662. img {
  663. width: 100%;
  664. height: 148px;
  665. }
  666. .radio_img {
  667. width: 100%;
  668. height: 148px;
  669. }
  670. }
  671. }
  672. .upload_layer {
  673. ::v-deep .el-dialog__body {
  674. padding: 0 20px 30px 20px;
  675. }
  676. }
  677. ::v-deep .el-table {
  678. .el-button {
  679. padding: 0 10px;
  680. height: 24px;
  681. &.upload_delt {
  682. background-color: #f76b6b;
  683. }
  684. }
  685. }
  686. .multi_handle {
  687. div {
  688. display: flex;
  689. }
  690. }
  691. </style>