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

1254 lines
40 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
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
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 class="app-container">
  3. <el-form ref="form" :model="form" size="small">
  4. <!-- 创建标题 -->
  5. <el-row class="in_release_item" type="flex" justify="space-between">
  6. <el-col :span="3" class="item_title">创建{{ publishType == 0 ? "即时发布" : "定时发布" }}</el-col>
  7. <el-col :span="18">
  8. <div class="input_wrap">
  9. <span class="input_label">名称</span>
  10. <el-form-item prop="relaase_name" :rules="[{ required: true, message: '请输入名称', trigger: 'blur' }]">
  11. <el-input v-model="form.relaase_name" :placeholder="changePlaceholder" class="input_name" />
  12. </el-form-item>
  13. </div>
  14. </el-col>
  15. <el-col :span="4" class="release_right">
  16. <el-button round class="release_btn" type="primary" @click="releaseSubmit('form')">发布</el-button>
  17. <el-button round type="primary">关闭</el-button>
  18. </el-col>
  19. </el-row>
  20. <!-- 第一步设置时间 -->
  21. <el-row class="in_release_item">
  22. <el-col class="step_1">第一步设置时间</el-col>
  23. <el-col class="step_form">
  24. <el-form-item
  25. label="发布时间"
  26. prop="release_start"
  27. :rules="[
  28. { required: true, message: '请选择发布时间', trigger: 'change' }
  29. ]"
  30. label-width="100px"
  31. >
  32. <el-date-picker v-if="publishType == 0" v-model="form.release_start" value-format="yyyy-MM-dd HH:mm:ss" type="date" placeholder="选择日期" />
  33. <el-date-picker v-else v-model="form.release_start" value-format="yyyy-MM-dd HH:mm:ss" type="daterange" range-separator="" start-placeholder="开始日期" end-placeholder="结束日期" />
  34. </el-form-item>
  35. <el-form-item
  36. v-if="publishType == 1"
  37. label="设置周期"
  38. prop="release_cycle"
  39. :rules="[
  40. { required: true, message: '请设置周期', trigger: 'change' },
  41. ]"
  42. :class="['set_weekly',{'no_margin': form.release_cycle == 2}]"
  43. label-width="100px"
  44. >
  45. <el-radio-group v-model="form.release_cycle" @change="clearCheckbox()">
  46. <el-radio :label="1">每天</el-radio>
  47. <el-radio :label="2">每周</el-radio>
  48. </el-radio-group>
  49. </el-form-item>
  50. <el-form-item v-if="form.release_cycle == 2" :class="{'weekly_margin': form.release_cycle == 2}" prop="release_weekly">
  51. <el-checkbox-group v-model="selectWeekly">
  52. <el-checkbox v-for="item in weeklyList" :key="item.id" :label="item.id" :value="item.id" name="type">{{ item.name }}</el-checkbox>
  53. </el-checkbox-group>
  54. </el-form-item>
  55. <!-- :rules="[
  56. { required: true, message: '请选择是否置顶', trigger: 'change' }
  57. ]" -->
  58. <el-form-item label="是否置顶" prop="is_topping" label-width="100px">
  59. <el-checkbox v-model="form.is_topping">置顶</el-checkbox>
  60. </el-form-item>
  61. </el-col>
  62. </el-row>
  63. <!-- 第二步选择内容 -->
  64. <el-row class="in_release_item">
  65. <el-col class="step_1">第二步选择内容</el-col>
  66. <el-col class="step_form">
  67. <div class="step_select">
  68. <div>已选内容 0</div>
  69. <div>内容总时长0.00s</div>
  70. <div>添加BGM<el-button class="step_select_audio" type="primary" round @click="selectAudioCont(0,-1)">选择文件</el-button>
  71. </div>
  72. </div>
  73. <div class="step_select_list">
  74. <div class="step_upload" @click="selectContVisible = true"></div>
  75. <draggable v-model="selectedMaterial" class="drag_list" @end="dragEnd">
  76. <div v-for="(item, index) in selectedMaterial" :key="'list-'+index" :class="['material_item', 'item_cont']" @click="clickMaterialItem(item.material_id,item)">
  77. <img v-if="item.img_path || item.material_type == 1" :src="item.img_path" :onerror="defaultImg" alt />
  78. <div v-if="!item.img_path && item.material_type == 2" class="radio_img"></div>
  79. <div class="item_format">
  80. <span class="item_type">{{ item.deposit_url | getFileFormat }}</span>
  81. <span v-if="item.material_type != '0'" class="item_time">{{ item.duration | getSeconds }}</span>
  82. </div>
  83. <div class="file_name">{{ item.material_name || item.name }}</div>
  84. <div v-if="contentIds.includes(item.material_id)" class="select_handle">
  85. <div class="select_delt" @click.stop="selectDelt(item.material_id,index)">
  86. <svg class="font-icon icon1" aria-hidden="true">
  87. <use xlink:href="#icon-guanbi2" />
  88. </svg>
  89. </div>
  90. <div class="select_edit" @click.stop="selectEdit()">
  91. <svg class="font-icon icon1" aria-hidden="true">
  92. <use xlink:href="#icon-bianji" />
  93. </svg>
  94. </div>
  95. </div>
  96. </div>
  97. </draggable>
  98. </div>
  99. </el-col>
  100. </el-row>
  101. <!-- 第三步-选择设备 -->
  102. <el-row class="in_release_item">
  103. <el-col class="step_1">第三步选择设备</el-col>
  104. <el-col class="step_form">
  105. <el-form-item
  106. label=""
  107. prop="release_device"
  108. :rules="[
  109. { required: true, message: '请选择设备', trigger: 'change' },
  110. ]"
  111. >
  112. <el-radio-group v-model="form.release_device" @change="clearDevice()">
  113. <el-radio :label="1">所有设备</el-radio>
  114. <el-radio :label="2">部分设备<i v-if="form.release_device == 2" class="radio_tip" @click="addDeviceTag()">添加</i></el-radio>
  115. </el-radio-group>
  116. </el-form-item>
  117. <div v-if="form.release_device == 1" class="select_all_tip">所有设备都将被发送</div>
  118. <div v-if="deviceTags.length > 0 && form.release_device == 2" class="select_other">
  119. <el-row>
  120. <el-col :span="10" class="other_tip">以下设备都将被发送<span>总计{{ deviceTags.length }}个设备</span></el-col>
  121. <el-col :span="4">
  122. <el-button round class="delt_btn" @click="clearDevice()">清空</el-button>
  123. </el-col>
  124. </el-row>
  125. <el-tag v-for="tag in deviceTags" :key="(tag.device_id || tag.deviceId)" closable :disable-transitions="true" :hit="false" color="#cbe3ff" @close="deltTags(tag)">
  126. {{ tag.device_name || tag.deviceName }}
  127. </el-tag>
  128. </div>
  129. </el-col>
  130. </el-row>
  131. </el-form>
  132. <!-- 第二步选择内容 - 选择素材 -->
  133. <div class="release_layer upload_layer">
  134. <el-dialog :close-on-click-modal="false" :show-close="false" :visible.sync="selectContVisible" width="1200px">
  135. <div slot="title" class="layer_tab_title">
  136. <span :class="{'active': activeIndex === 0}" @click="tabAll(0)">素材库</span>
  137. <span :class="{'active': activeIndex === 1}" @click="tabAll(1)">主题库</span>
  138. </div>
  139. <!-- 素材库 -->
  140. <div v-if="activeIndex === 0">
  141. <ul class="tab_item">
  142. <li v-for="(item, index) in materialTabItem" :key="index" :class="{'active': activeItemIndex === index}" @click="tabItem(index)">{{ item.name }}<span>{{ item.num }}</span>
  143. </li>
  144. </ul>
  145. <div class="material_list" style="min-height: 260px">
  146. <MaterialList ref="MaterialList" :is-multi-selected="isMultiSelected" :mulit-text="mulitText" :active-item-index="activeItemIndex" />
  147. </div>
  148. </div>
  149. <!-- 主题库 -->
  150. <div v-if="activeIndex === 1" class="theme_cont">
  151. <!-- 主题库list -->
  152. <ThemeGalleryList ref="ThemeGalleryList" :is-multi-selected="isMultiSelected" :mulit-text="mulitText" :show-item-info="false" />
  153. </div>
  154. <div class="upload_list_right">
  155. <div class="mulit_btn" @click="multiSelectBtn">{{ mulitText }}</div>
  156. </div>
  157. <div slot="footer" class="dialog-footer">
  158. <el-button type="primary" round @click="uploadSelected()"> </el-button>
  159. <el-button round @click="cancelContSelect"> </el-button>
  160. </div>
  161. </el-dialog>
  162. </div>
  163. <!-- 编辑播放内容 -->
  164. <div class="upload_layer">
  165. <el-dialog title="请选择播放内容" :close-on-click-modal="false" :visible.sync="listEditVisible">
  166. <div class="total_time">
  167. 内容总时长3m15s
  168. </div>
  169. <div v-for="(item, index) in selectedEditData" :key="index" class="edit_material">
  170. <div class="edit_img">
  171. <img v-if="item.img_path || item.material_type == 1" :src="item.img_path" :onerror="defaultImg" alt />
  172. <div v-if="!item.img_path && item.material_type == 2" class="radio_img"></div>
  173. <span class="">{{ index+1 }}</span>
  174. </div>
  175. <div class="edit_cont">
  176. <div class="edit_cont_base">
  177. <p>{{ item.material_name || item.name }}</p>
  178. <span>{{ item.deposit_url | getFileFormat }}</span>
  179. <span>{{ item.file_size | formatBytes }}</span>
  180. </div>
  181. <!-- <div v-if="item.material_type == 0" class="edit_cont_set"> -->
  182. <el-form v-if="item.material_type == 0" :ref="setMaterialForm" :model="setMaterialForm.form" class="edit_cont_set" size="small">
  183. <div class="set_time">
  184. <span>展示时长</span>
  185. <el-form-item :prop="'form.'+index+'.showTime'" style="width: 100px">
  186. <el-input v-model="item.showTime" type="text" placeholder="15" style="width: 66px" @input="$forceUpdate()" />
  187. </el-form-item>
  188. <em></em>
  189. </div>
  190. <div class="set_animation">
  191. <span class="set_item">切换动效</span>
  192. <el-form-item :prop="'form.'+index+'.showAnimation'" style="width: 100px">
  193. <el-select v-model="item.showAnimationName" size="small" class="filter-item" value-key="name" @change="selectAnimation($event, item)">
  194. <el-option v-for="items in animationData" :key="items.key" :label="items.name" :value="items" />
  195. </el-select>
  196. </el-form-item>
  197. </div>
  198. <div class="set_time set_audio">
  199. <span>音频</span>
  200. <p class="audio_name">{{ item.showAudioName }}</p>
  201. <!-- 主题库音频文件不可选择 -->
  202. <el-button type="primary" round @click="selectAudioCont(1,index)">选择文件</el-button>
  203. </div>
  204. </el-form>
  205. <!-- </div> -->
  206. <div v-else class="edit_cont_other">内容时长{{ item.duration | getSeconds }}</div>
  207. </div>
  208. </div>
  209. <div slot="footer" class="dialog-footer">
  210. <el-button type="primary" round @click="listEditVisible = false"> </el-button>
  211. <el-button round @click="listEditVisible = false"> </el-button>
  212. </div>
  213. </el-dialog>
  214. </div>
  215. <!-- 素材库 - 音频选择 -->
  216. <div class="release_layer upload_layer">
  217. <el-dialog :close-on-click-modal="false" :show-close="false" :visible.sync="selectAudioVisible" width="1200px">
  218. <div slot="title" class="layer_tab_title">
  219. <span class="active">素材库</span>
  220. </div>
  221. <div>
  222. <ul class="tab_item">
  223. <li>音频<span>{{ audioListData.length }}</span></li>
  224. </ul>
  225. <div class="material_list">
  226. <div v-for="(item, index) in audioListData" :key="index" :class="['material_item', 'item_cont',{ 'item_multi': audioChecked == index }]" @click="audioCheckedHandle(index)">
  227. <img v-if="item.img_path" :src="item.img_path" alt />
  228. <div v-else class="radio_img"></div>
  229. <div class="item_format">
  230. <span class="item_type">mp3</span>
  231. <span class="item_time">{{ item.duration | getSeconds }}</span>
  232. </div>
  233. <div class="file_name">{{ item.material_name }}</div>
  234. <span v-if="audioChecked == index" class="checked_btn"></span>
  235. </div>
  236. </div>
  237. </div>
  238. <!-- <div class="upload_list_right">
  239. <div class="mulit_btn" @click="multiSelectBtn('audio')">{{ mulitText }}</div>
  240. </div> -->
  241. <div slot="footer" class="dialog-footer">
  242. <el-button type="primary" round @click="audioCheckedSubmit"> </el-button>
  243. <el-button round @click="cancelContSelect('audio')"> </el-button>
  244. </div>
  245. </el-dialog>
  246. </div>
  247. <!-- 添加发布的设备 -->
  248. <div class="add_device_layer">
  249. <el-dialog title="请选择设备" :close-on-click-modal="false" :visible.sync="selectDeviceVisible" width="400px">
  250. <el-tag v-for="tag in deviceAllTags" :key="tag.device_id" :disable-transitions="true" :hit="false" color="#cbe3ff" class="all_tags" @click="tagHandle(tag)">
  251. {{ tag.device_name }}
  252. </el-tag>
  253. </el-dialog>
  254. </div>
  255. </div>
  256. </template>
  257. <script>
  258. import draggable from 'vuedraggable'
  259. import ThemeGalleryList from '../components/ThemeGalleryList.vue'
  260. import MaterialList from '../components/MaterialCompontentList.vue'
  261. import { getMaterialByType, FetchFindMaterialById } from '@/api/material/material'
  262. import { ReqDeviceList } from '@/api/device/deviceList.js'
  263. import { FetchSaveRelease, FetchGetReleaseDetailsById } from '@/api/release/release.js'
  264. import { getSeconds, formatBytes, parseTime, getFileFormat } from '@/utils/index.js'
  265. export default {
  266. name: 'ImmediateRelease',
  267. components: {
  268. draggable,
  269. ThemeGalleryList,
  270. MaterialList
  271. },
  272. filters: {
  273. getSeconds(s) {
  274. return getSeconds(s)
  275. },
  276. formatBytes(bytes, decimals) {
  277. return formatBytes(bytes, decimals)
  278. },
  279. getFileFormat(str) {
  280. return getFileFormat(str)
  281. }
  282. },
  283. data() {
  284. return {
  285. isThemeOrMaterial: false,
  286. orga_id: '133221333123111',
  287. selectedMaterial: [], // 从其他页面选择带过来的素材
  288. publishType: 0, // 判断是定时发布还是即时发布页面
  289. themeType: null,
  290. page: 1,
  291. pageSize: 10,
  292. audioListData: [], // 音频list
  293. isMainBgm: null, // 是最外层的bgm还是里面的
  294. selectDeviceVisible: false, // 设备list - layer
  295. deviceAllTags: [], // 设备list
  296. deviceTags: [], // 已选择设备list
  297. selectContVisible: false, // 选择内容素材/主题 - layer
  298. selectAudioVisible: false, // 音频list-layer
  299. audioChecked: null, // 音频已选中的
  300. mulitText: '多选',
  301. isMultiSelected: false,
  302. form: {
  303. actual_end: '', // “实际结束时间 yyyy-MM-dd HH:mm:ss”,
  304. is_topping: false, // 是否置顶,
  305. orga_id: '', // "机构id"
  306. bgm_main: '',
  307. relaase_name: '', // 发布名称
  308. release_cycle: '', // 发布周期 0.无 1.每天 2.每周
  309. release_weekly: '', // 发布每周 如果设置为每天则为空
  310. release_device: '', // 发布设备 1.全部 2.部分
  311. release_deviceDTOs: [], // {"device_id": "设备id"}
  312. del_rmids: [], // 删除绑定素材关联集合id
  313. release_end: '', // “发布结束时间 yyyy-MM-dd HH:mm:ss”
  314. release_id: null, // 发布id 为null则为新增
  315. release_materialDTOs: [],
  316. release_start: null, // 发布开始时间 yyyy-MM-dd HH:mm:ss
  317. release_type: '' // 发布类型
  318. },
  319. contentIds: [],
  320. listEditVisible: false, // 可编辑list素材-layer
  321. selectedEditData: [], // 可编辑list内容 - 选择的item
  322. thisEditIndex: null, // 当前音乐选择的index
  323. setMaterialForm: [],
  324. animationData: [ // 图片素材切换动态 - 编辑动画
  325. {
  326. key: '0',
  327. name: '无动画'
  328. },
  329. {
  330. key: '1',
  331. name: '动画1'
  332. },
  333. {
  334. key: '2',
  335. name: '动画2'
  336. }
  337. ],
  338. selectWeekly: [],
  339. weeklyList: [
  340. {
  341. id: '1',
  342. name: '周一'
  343. },
  344. {
  345. id: '2',
  346. name: '周二'
  347. },
  348. {
  349. id: '3',
  350. name: '周三'
  351. },
  352. {
  353. id: '4',
  354. name: '周四'
  355. },
  356. {
  357. id: '5',
  358. name: '周五'
  359. },
  360. {
  361. id: '6',
  362. name: '周六'
  363. },
  364. {
  365. id: '7',
  366. name: '周七'
  367. }
  368. ],
  369. materialTabItem: [ // 素材库 - tab切换title
  370. {
  371. key: 1,
  372. name: '全部',
  373. num: '3'
  374. },
  375. {
  376. key: 2,
  377. name: '图片',
  378. num: '1'
  379. },
  380. {
  381. key: 3,
  382. name: '视频',
  383. num: '1'
  384. },
  385. {
  386. key: 4,
  387. name: '音频',
  388. num: '1'
  389. }
  390. ],
  391. activeIndex: 0,
  392. activeItemIndex: 0,
  393. release_id: null, // 发布编辑
  394. releaseInfo: null,
  395. isEditMaterial: []
  396. }
  397. },
  398. computed: {
  399. changePlaceholder() {
  400. return this.publishType == 0 ? '即时发布 2022-01-01' : '定时发布 2022-01-01'
  401. },
  402. defaultImg() {
  403. return 'this.src="' + require('@/assets/images/menu_bg_02.png') + '"'
  404. }
  405. },
  406. created() {
  407. this.selectedMaterial = []
  408. this.selectedMaterial = JSON.parse(localStorage.getItem('selectedMaterial'))
  409. },
  410. mounted() {
  411. if (this.$route.path === '/release') {
  412. this.materialTabItem.pop()
  413. }
  414. if (this.$route.query.tag) {
  415. this.publishType = this.$route.query.tag
  416. }
  417. // 设备list
  418. this.ReqDeviceList()
  419. if (localStorage.getItem('releaseId')) {
  420. this.editRelease()
  421. }
  422. },
  423. methods: {
  424. // 编辑带来 release_id
  425. editRelease() {
  426. const release_id = JSON.parse(localStorage.getItem('releaseId'))
  427. this.release_id = release_id
  428. const params = {
  429. release_id: release_id
  430. }
  431. FetchGetReleaseDetailsById(params).then(res => {
  432. if (res.code == 200) {
  433. const releaseInfo = res.data.release
  434. this.releaseInfo = releaseInfo
  435. this.form.orga_id = releaseInfo.orga_id
  436. this.form.relaase_name = releaseInfo.relaase_name
  437. this.form.release_cycle = releaseInfo.release_cycle
  438. if (this.form.release_cycle == 2) {
  439. if (releaseInfo.release_weekly) {
  440. this.selectWeekly = releaseInfo.release_weekly.split(',')
  441. }
  442. }
  443. this.form.is_topping = releaseInfo.is_topping
  444. if (releaseInfo.release_type == 1) {
  445. const arr = []
  446. arr.push(parseTime(releaseInfo.release_start))
  447. arr.push(parseTime(releaseInfo.release_end))
  448. this.form.release_start = arr
  449. } else {
  450. this.form.release_start = parseTime(releaseInfo.release_start)
  451. }
  452. this.form.bgm_main = releaseInfo.bgm_main
  453. this.form.release_deviceDTOs = res.data.release_devices
  454. // 获取素材list
  455. const materialIds = []
  456. this.isEditMaterial = res.data.release_materials
  457. res.data.release_materials.map((item) => {
  458. materialIds.push(item.material_id)
  459. })
  460. const params = {
  461. ids: materialIds
  462. }
  463. // 根据ID获取素材内容
  464. FetchFindMaterialById(params).then(res => {
  465. if (res.code == 200) {
  466. this.selectedMaterial = res.data
  467. // 判断拿ranking来排序
  468. this.selectedMaterial.filter((item, index) => {
  469. this.isEditMaterial.some(items => {
  470. if (item.material_id == items.material_id) {
  471. item.ranking = items.ranking
  472. }
  473. })
  474. })
  475. this.selectedMaterial.sort(this.compare('ranking'))
  476. // 获取图片设置的animation
  477. this.selectedMaterial.forEach((item, index) => {
  478. if (item.material_type == 0) {
  479. item.showTime = this.isEditMaterial[index].duration
  480. item.showAnimation = this.isEditMaterial[index].effect
  481. item.showAnimationName = this.animationData[item.showAnimation].name
  482. item.showAudioUrl = this.isEditMaterial[index].bgm_path
  483. item.showAudioName = this.isEditMaterial[index].bgm_name
  484. }
  485. })
  486. }
  487. })
  488. // 设备list
  489. this.form.release_device = releaseInfo.release_device
  490. this.deviceTags = res.data.release_devices
  491. } else {
  492. this.$message.error(res.msg)
  493. }
  494. })
  495. },
  496. compare(attr) {
  497. return function(a, b) {
  498. var val1 = a[attr]
  499. var val2 = b[attr]
  500. return val1 - val2
  501. }
  502. },
  503. // 发布提交
  504. releaseSubmit(formName) {
  505. this.$refs[formName].validate((valid) => {
  506. if (valid) {
  507. this.form.orga_id = this.orga_id
  508. // 发布类型
  509. this.form.release_type = this.publishType
  510. // 实际结束时间
  511. if (this.release_id) {
  512. if (this.releaseInfo.actual_end) {
  513. this.form.actual_end = this.releaseInfo.actual_end
  514. } else {
  515. this.form.actual_end = null
  516. }
  517. this.form.release_id = this.release_id
  518. } else {
  519. this.form.actual_end = null
  520. this.form.release_id = null
  521. }
  522. // 设备选择判断
  523. if (this.form.release_device) {
  524. if (this.form.release_device == 1) {
  525. this.form.release_deviceDTOs = []
  526. } else {
  527. if (this.deviceTags.length == 0) {
  528. this.$message.error('请选择设备 !')
  529. return
  530. }
  531. this.form.release_deviceDTOs = this.deviceTags.map(item => {
  532. const json = {}
  533. json.device_id = item.device_id || item.deviceId
  534. return json
  535. })
  536. }
  537. }
  538. // 根据发布类型 - 周期-时间
  539. if (this.publishType == 0) {
  540. this.form.release_cycle = 0
  541. this.form.release_weekly = null
  542. this.form.release_end = this.form.release_start
  543. }
  544. if (this.form.release_cycle == 2) {
  545. this.form.release_weekly = this.selectWeekly.join(',')
  546. }
  547. if (this.form.release_start instanceof Array) {
  548. const arrDate = this.form.release_start
  549. this.form.release_start = arrDate[0]
  550. this.form.release_end = arrDate[1]
  551. }
  552. // 判断是否有localstorage有相应的list数据
  553. if (this.selectedMaterial) {
  554. this.form.release_materialDTOs = this.selectedMaterial.map((item, index) => {
  555. const json = {}
  556. if (item.material_type == 0) {
  557. json.duration = (item.showTime || item.showAnimationName || item.showAnimation) ? item.showTime : 15
  558. json.effect = (item.showTime || item.showAnimationName || item.showAnimation) ? item.showAnimation : 0
  559. json.bgm_path = (item.showAudioName || item.showAudioUrl) ? item.showAudioUrl : null
  560. json.bgm_name = (item.showAudioName || item.showAudioUrl) ? item.showAudioName : null
  561. } else {
  562. json.duration = 0
  563. json.effect = 0
  564. json.bgm_path = null
  565. json.bgm_name = null
  566. }
  567. json.material_id = item.material_id
  568. json.material_name = item.material_name
  569. json.img_path = item.img_path
  570. json.file_size = item.file_size
  571. if (this.release_id) {
  572. if (this.isEditMaterial.length != 0) {
  573. if (!item.create_time || (!item.classes && item.material_type == 2)) {
  574. json.rm_id = null
  575. } else {
  576. json.rm_id = this.isEditMaterial[index].id
  577. }
  578. }
  579. } else {
  580. json.rm_id = null
  581. }
  582. json.ranking = index + 1
  583. return json
  584. })
  585. console.log(this.form.release_materialDTOs)
  586. // 判断最外层是否有bgm
  587. const isBgm = this.selectedMaterial.find(item => {
  588. return item.material_type == 2
  589. })
  590. if (isBgm) {
  591. this.form.bgm_main = isBgm.deposit_url
  592. } else {
  593. this.form.bgm_main = null
  594. }
  595. console.log(this.form)
  596. // 保存提交
  597. FetchSaveRelease(this.form).then(res => {
  598. if (res.code == 200) {
  599. this.$message.success('发布成功!')
  600. localStorage.removeItem('selectedMaterial')
  601. localStorage.removeItem('releaseId')
  602. this.$router.push({ path: '/publish' })
  603. } else {
  604. this.$message.error(res.msg)
  605. }
  606. })
  607. } else {
  608. this.$message.error('请选择发布内容!')
  609. }
  610. } else {
  611. console.log('error submit!!')
  612. return false
  613. }
  614. })
  615. },
  616. // 获取设备列表
  617. ReqDeviceList() {
  618. const params = {
  619. device_id: '',
  620. device_name: '',
  621. is_state: '',
  622. page: 1,
  623. size: 10
  624. }
  625. ReqDeviceList(params).then(res => {
  626. if (res.code == 200) {
  627. this.deviceAllTags = res.data.content
  628. } else {
  629. return this.$message.error('获取设备列表失败!')
  630. }
  631. })
  632. },
  633. // 设备list - show
  634. addDeviceTag() {
  635. this.selectDeviceVisible = true
  636. },
  637. // 设备选中list
  638. tagHandle(tag) {
  639. if (this.deviceTags.length == 0) {
  640. this.deviceTags.push(tag)
  641. } else {
  642. const result = this.deviceTags.find((item) => {
  643. return (item.device_id || item.deviceId) == tag.device_id
  644. })
  645. if (!result) {
  646. this.deviceTags.push(tag)
  647. } else {
  648. this.$message.error('已选择过了~')
  649. }
  650. }
  651. },
  652. // 删除已选择的设备
  653. deltTags(tag) {
  654. this.deviceTags.splice(this.deviceTags.indexOf(tag), 1)
  655. },
  656. // 清空已选择的设备
  657. clearDevice() {
  658. this.deviceTags = []
  659. },
  660. // 根据素材类型获取素材
  661. getMaterialByType() {
  662. const params = {
  663. 'theme_name': '',
  664. 'theme_type': this.themeType,
  665. 'theme_type_not': '',
  666. 'orga_id': this.orga_id,
  667. 'page': this.page,
  668. 'size': this.pageSize
  669. }
  670. getMaterialByType(params).then(res => {
  671. if (res.code == 200) {
  672. this.audioListData = res.data.content
  673. } else {
  674. this.$message({
  675. message: res.msg,
  676. type: 'error'
  677. })
  678. }
  679. })
  680. },
  681. // 删除选择的素材
  682. selectDelt(id, i) {
  683. const index = this.contentIds.indexOf(id)
  684. this.contentIds.splice(index, 1)
  685. this.selectedEditData.splice(index, 1)
  686. this.selectedMaterial.splice(i, 1)
  687. // 编辑的情况下
  688. if (this.release_id) {
  689. this.isEditMaterial.find(item => {
  690. if (item.material_id == id) {
  691. this.form.del_rmids.push(item.id)
  692. }
  693. })
  694. }
  695. // localStorage.setItem('selectedMaterial', JSON.stringify(this.selectedMaterial))
  696. },
  697. // 选中可编辑的
  698. clickMaterialItem(id, item) {
  699. const arr = this.contentIds
  700. if (arr.includes(id)) {
  701. const index = arr.indexOf(id)
  702. if (index > -1) {
  703. arr.splice(index, 1)
  704. this.selectedEditData.splice(index, 1)
  705. }
  706. } else {
  707. this.contentIds.push(id)
  708. this.selectedEditData.push(item)
  709. }
  710. },
  711. // 编辑-已选择的
  712. selectEdit() {
  713. this.listEditVisible = true
  714. const form = {
  715. showTime: '15',
  716. showAnimation: '',
  717. showAnimationName: ''
  718. }
  719. this.selectedEditData.map((item, index) => {
  720. if (item.material_type == 0) {
  721. this.setMaterialForm.push(form)
  722. }
  723. })
  724. },
  725. dragEnd() {
  726. // console.log(this.selectedEditData)
  727. // console.log(this.selectedMaterial)
  728. },
  729. // 选择音频
  730. selectAudioCont(type, index) {
  731. this.audioChecked = -1
  732. this.thisEditIndex = index
  733. this.isMultiSelected = false
  734. this.mulitText = '选择'
  735. this.selectAudioVisible = true
  736. // 根据类型获取素材 - audio - 2
  737. this.themeType = 2
  738. this.getMaterialByType()
  739. this.isMainBgm = type == 0 ? 0 : 1
  740. },
  741. // 音频选中-单选
  742. audioCheckedHandle(index) {
  743. if (index != this.audioChecked) {
  744. this.audioChecked = index
  745. } else {
  746. this.audioChecked = -1
  747. }
  748. },
  749. // 音频选中 - 提交
  750. audioCheckedSubmit() {
  751. this.selectAudioVisible = false
  752. if (this.audioChecked != -1) {
  753. const index = this.audioChecked
  754. if (!this.isMainBgm) {
  755. this.audioListData[index].material_type = 2
  756. const resultIndex = this.selectedMaterial.findIndex((item, key) => {
  757. return item.material_type == 2
  758. })
  759. if (resultIndex == -1) {
  760. this.selectedMaterial.push(this.audioListData[index])
  761. } else {
  762. this.selectedMaterial.splice(resultIndex, 1, this.audioListData[index])
  763. if (this.release_id) {
  764. // 编辑情况下 - 上传选择素材时,取消某一项选中状态-即删除该素材
  765. const editMaterialId = []
  766. this.isEditMaterial.map(item => {
  767. editMaterialId.push(item.material_id)
  768. })
  769. const selectedMaterialId = []
  770. this.selectedMaterial.map(item => {
  771. selectedMaterialId.push(item.material_id)
  772. })
  773. const newArr = editMaterialId.filter(item => selectedMaterialId.indexOf(item) == -1)
  774. this.isEditMaterial.filter(item => {
  775. if (newArr.indexOf(item.material_id) != -1) {
  776. this.form.del_rmids.push(item.id)
  777. }
  778. })
  779. }
  780. }
  781. // localStorage.setItem('selectedMaterial', JSON.stringify(this.selectedMaterial))
  782. } else {
  783. this.selectedEditData[this.thisEditIndex].showAudioName = this.audioListData[index].material_name
  784. this.selectedEditData[this.thisEditIndex].showAudioUrl = this.audioListData[index].deposit_url
  785. }
  786. } else {
  787. this.selectedEditData[this.thisEditIndex].showAudioName = ''
  788. this.selectedEditData[this.thisEditIndex].showAudioUrl = ''
  789. }
  790. },
  791. // 时间设置-切换到每天时
  792. clearCheckbox() {
  793. if (this.form.release_cycle == 2) {
  794. this.selectWeekly = []
  795. this.form.release_weekly = []
  796. }
  797. },
  798. // 动画切换
  799. selectAnimation(event, item) {
  800. this.$forceUpdate()
  801. item.showAnimationName = event.name
  802. item.showAnimation = event.key
  803. },
  804. // 选择内容-素材库/主题库 tab
  805. tabAll(index) {
  806. this.activeIndex = index
  807. this.activeItemIndex = 0
  808. this.isMultiSelected = false
  809. this.mulitText = '多选'
  810. },
  811. // 子菜单-tab
  812. tabItem(index) {
  813. this.activeItemIndex = index
  814. },
  815. // 多选btn
  816. multiSelectBtn(type) {
  817. this.isMultiSelected = !this.isMultiSelected
  818. if (this.isMultiSelected) {
  819. this.mulitText = '取消'
  820. console.log(this.activeItemIndex)
  821. if (this.activeIndex == 0) {
  822. this.$refs.MaterialList.selectedListId = []
  823. this.$refs.MaterialList.selectedMaterial = []
  824. // 已选择的内容中-list是否包含,包含即选中状态
  825. if (this.selectedMaterial) {
  826. this.selectedMaterial.forEach(item => {
  827. this.$refs.MaterialList.selectedListId.push(item.material_id)
  828. this.$refs.MaterialList.selectedMaterial.push(item)
  829. })
  830. }
  831. } else {
  832. this.$refs.ThemeGalleryList.selectedListId = []
  833. this.$refs.ThemeGalleryList.selectedMaterial = []
  834. // 已选择的内容中-list是否包含,包含即选中状态
  835. if (this.selectedMaterial) {
  836. this.selectedMaterial.forEach(item => {
  837. this.$refs.ThemeGalleryList.selectedListId.push(item.material_id)
  838. this.$refs.ThemeGalleryList.selectedMaterial.push(item)
  839. })
  840. }
  841. // this.selectedMaterial = this.$refs.ThemeGalleryList.selectedMaterial
  842. }
  843. } else {
  844. if (type == 'audio') {
  845. this.mulitText = '选择'
  846. this.audioChecked = -1
  847. } else {
  848. this.mulitText = '多选'
  849. }
  850. }
  851. },
  852. // 素材选择 - 确认按钮
  853. uploadSelected() {
  854. this.selectContVisible = false
  855. this.selectedMaterial = []
  856. if (this.activeIndex == 0) {
  857. this.selectedMaterial = this.$refs.MaterialList.selectedMaterial
  858. } else {
  859. this.selectedMaterial = this.$refs.ThemeGalleryList.selectedMaterial
  860. }
  861. if (this.release_id) {
  862. // 编辑情况下 - 上传选择素材时,取消某一项选中状态-即删除该素材
  863. const editMaterialId = []
  864. this.isEditMaterial.map(item => {
  865. editMaterialId.push(item.material_id)
  866. })
  867. const selectedMaterialId = []
  868. this.selectedMaterial.map(item => {
  869. selectedMaterialId.push(item.material_id)
  870. })
  871. const newArr = editMaterialId.filter(item => selectedMaterialId.indexOf(item) == -1)
  872. this.isEditMaterial.filter(item => {
  873. if (newArr.indexOf(item.material_id) != -1) {
  874. this.form.del_rmids.push(item.id)
  875. }
  876. })
  877. }
  878. // localStorage.setItem('selectedMaterial', JSON.stringify(this.selectedMaterial))
  879. this.mulitText = '多选'
  880. },
  881. // 素材选择 - 取消按钮
  882. cancelContSelect(type) {
  883. this.isMultiSelected = false
  884. if (type == 'audio') {
  885. this.selectAudioVisible = false
  886. } else {
  887. this.selectContVisible = false
  888. this.mulitText = '多选'
  889. }
  890. }
  891. }
  892. }
  893. </script>
  894. <style lang="scss" scoped>
  895. .app-container {
  896. background: none;
  897. padding: 0;
  898. }
  899. .in_release_item {
  900. padding: 16px 24px;
  901. margin-bottom: 10px;
  902. line-height: 34px;
  903. background: #fff;
  904. border-radius: 6px;
  905. .item_title {
  906. font-size: 16px;
  907. font-weight: bold;
  908. color: #3a8aeb;
  909. }
  910. .input_wrap {
  911. display: flex;
  912. width: 282px;
  913. height: 34px;
  914. padding: 0 24px;
  915. font-size: 14px;
  916. background: #f5f6fa;
  917. line-height: 34px;
  918. border-radius: 34px;
  919. .input_label {
  920. &::after {
  921. content: "|";
  922. padding-left: 8px;
  923. color: #ccc;
  924. }
  925. }
  926. .input_name {
  927. width: 194px;
  928. ::v-deep .el-input__inner {
  929. border: none;
  930. background: #f5f6fa;
  931. }
  932. }
  933. }
  934. .release_right {
  935. text-align: right;
  936. .el-button {
  937. font-size: 14px;
  938. padding: 8px 24px;
  939. border: none !important;
  940. }
  941. .release_btn {
  942. color: #fff;
  943. background: linear-gradient(to right, #fc8c6f, #fa544e) !important;
  944. }
  945. }
  946. }
  947. .step_1 {
  948. font-size: 16px;
  949. line-height: 54px;
  950. border-bottom: 1px solid #eee;
  951. }
  952. .set_weekly {
  953. ::v-deep .el-form-item__label {
  954. line-height: 40px;
  955. }
  956. }
  957. .no_margin {
  958. margin: 0;
  959. }
  960. .weekly_margin {
  961. margin: 0 0 6px 100px;
  962. ::v-deep .el-form-item__error {
  963. top: 70%;
  964. }
  965. }
  966. .step_select {
  967. display: flex;
  968. font-size: 14px;
  969. margin-bottom: 20px;
  970. div {
  971. margin-right: 30px;
  972. }
  973. .step_select_audio {
  974. margin-left: 5px;
  975. padding: 5px;
  976. }
  977. }
  978. .step_select_list {
  979. display: flex;
  980. .step_upload {
  981. width: 164px;
  982. height: 172px;
  983. margin-right: 16px;
  984. border: 1px dashed #dcdde3;
  985. background: url(~@/assets/images/t-sc.png) #f2f7ff no-repeat center center;
  986. background-size: 36px 29px;
  987. border-radius: 6px;
  988. }
  989. }
  990. .material_item {
  991. position: relative;
  992. .select_delt {
  993. position: absolute;
  994. top: 12px;
  995. right: 12px;
  996. .font-icon {
  997. width: 19px;
  998. height: 19px;
  999. }
  1000. }
  1001. .select_edit {
  1002. position: absolute;
  1003. bottom: 0;
  1004. left: 0;
  1005. width: 100%;
  1006. height: 44px;
  1007. background: rgba(0, 0, 0, 0.5);
  1008. text-align: center;
  1009. .font-icon {
  1010. width: 16px;
  1011. height: 17px;
  1012. margin-top: 12px;
  1013. }
  1014. }
  1015. }
  1016. .step_form {
  1017. padding-top: 30px;
  1018. .select_all_tip {
  1019. margin: -20px 0 0 0;
  1020. }
  1021. .select_other {
  1022. margin: -20px 0 0 0;
  1023. }
  1024. }
  1025. .drag_list {
  1026. display: flex;
  1027. flex-wrap: wrap;
  1028. }
  1029. .upload_return {
  1030. color: #8ebcfe;
  1031. }
  1032. .total_time {
  1033. position: absolute;
  1034. top: 72px;
  1035. right: 24px;
  1036. font-size: 14px;
  1037. color: #000;
  1038. }
  1039. .edit_material {
  1040. display: flex;
  1041. padding: 12px 0;
  1042. border-bottom: 1px solid #f2f6fd;
  1043. &:nth-last-child(2) {
  1044. border-bottom: none;
  1045. }
  1046. .edit_img {
  1047. position: relative;
  1048. width: 58px;
  1049. height: 77px;
  1050. border-radius: 4px;
  1051. overflow: hidden;
  1052. img {
  1053. display: block;
  1054. width: 100%;
  1055. height: 100%;
  1056. }
  1057. .radio_img {
  1058. width: 58px;
  1059. height: 77px;
  1060. background: url(~@/assets/images/t-yp.png) no-repeat #b3e8fa center;
  1061. background-size: 40px 40px;
  1062. }
  1063. span {
  1064. position: absolute;
  1065. top: -1px;
  1066. left: -1px;
  1067. display: block;
  1068. width: 20px;
  1069. height: 14px;
  1070. font-size: 12px;
  1071. text-align: center;
  1072. color: #fff;
  1073. line-height: 14px;
  1074. }
  1075. }
  1076. &:nth-child(odd) {
  1077. .edit_img {
  1078. span {
  1079. background: url(~@/assets/images/num_bg2.png) no-repeat;
  1080. background-size: 20px 14px;
  1081. }
  1082. }
  1083. }
  1084. &:nth-child(even) {
  1085. .edit_img {
  1086. span {
  1087. background: url(~@/assets/images/num_bg1.png) no-repeat;
  1088. background-size: 20px 14px;
  1089. }
  1090. }
  1091. }
  1092. .edit_cont {
  1093. display: flex;
  1094. flex-direction: column;
  1095. justify-content: space-between;
  1096. flex: 1;
  1097. padding: 10px 0 8px 0;
  1098. font-size: 14px;
  1099. margin-left: 25px;
  1100. .edit_cont_base {
  1101. display: flex;
  1102. p {
  1103. margin-right: 14px;
  1104. color: #000;
  1105. }
  1106. span {
  1107. display: inline-block;
  1108. padding: 0 5px;
  1109. margin-right: 8px;
  1110. font-size: 12px;
  1111. line-height: 16px;
  1112. color: #3a8aeb;
  1113. background: #cde4ff;
  1114. border-radius: 2px;
  1115. }
  1116. }
  1117. .edit_cont_set {
  1118. display: flex;
  1119. font-size: 12px;
  1120. color: #666;
  1121. height: 30px;
  1122. line-height: 30px;
  1123. .set_time {
  1124. display: flex;
  1125. margin-right: 30px;
  1126. span {
  1127. margin-right: 8px;
  1128. }
  1129. em {
  1130. display: block;
  1131. margin-left: 8px;
  1132. font-style: normal;
  1133. }
  1134. }
  1135. .set_animation {
  1136. display: flex;
  1137. margin-right: 30px;
  1138. span.set_item {
  1139. margin-right: 8px;
  1140. }
  1141. ::v-deep .el-form-item__content {
  1142. height: 28px;
  1143. }
  1144. ::v-deep .el-input__suffix {
  1145. height: 26px;
  1146. }
  1147. }
  1148. .set_audio {
  1149. flex: 1;
  1150. .audio_name {
  1151. margin-right: 10px;
  1152. }
  1153. ::v-deep .el-button--small {
  1154. padding: 0 15px;
  1155. border: none;
  1156. }
  1157. }
  1158. ::v-deep .el-input__inner {
  1159. text-align: center;
  1160. height: 27px;
  1161. line-height: 27px;
  1162. }
  1163. ::v-deep .el-input__icon {
  1164. line-height: 27px;
  1165. }
  1166. }
  1167. .edit_cont_other {
  1168. line-height: 27px;
  1169. font-size: 12px;
  1170. color: #666;
  1171. }
  1172. }
  1173. }
  1174. .release_layer {
  1175. ::v-deep .el-dialog__header {
  1176. padding: 0;
  1177. height: 60px;
  1178. }
  1179. .layer_tab_title {
  1180. display: flex;
  1181. span {
  1182. position: relative;
  1183. display: block;
  1184. margin-right: 32px;
  1185. line-height: 60px;
  1186. font-size: 18px;
  1187. color: #666;
  1188. cursor: pointer;
  1189. &.active {
  1190. color: #333;
  1191. }
  1192. &.active::after {
  1193. content: "";
  1194. position: absolute;
  1195. left: 0;
  1196. bottom: 0;
  1197. width: 100%;
  1198. height: 3px;
  1199. background: #3a8aeb;
  1200. }
  1201. }
  1202. }
  1203. .tab_item {
  1204. display: flex;
  1205. font-size: 14px;
  1206. color: #666;
  1207. margin: -14px 0 16px 0;
  1208. li {
  1209. margin-right: 30px;
  1210. cursor: pointer;
  1211. span {
  1212. display: inline-block;
  1213. margin-left: 4px;
  1214. }
  1215. &.active {
  1216. color: #3a8aeb;
  1217. }
  1218. }
  1219. }
  1220. .material_list {
  1221. display: flex;
  1222. flex-wrap: wrap;
  1223. .item_cont {
  1224. margin: 0 24px 20px 0;
  1225. }
  1226. }
  1227. }
  1228. .theme_cont {
  1229. ::v-deep .el-tabs__header {
  1230. padding: 0;
  1231. margin-bottom: 0;
  1232. }
  1233. }
  1234. .release_layer {
  1235. ::v-deep .el-tabs {
  1236. margin: -26px 0 8px 0;
  1237. }
  1238. ::v-deep .el-tabs__nav-wrap::after {
  1239. display: none;
  1240. }
  1241. ::v-deep .el-tabs__active-bar {
  1242. display: none;
  1243. }
  1244. }
  1245. </style>