detail.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. <template>
  2. <div class='app-container'>
  3. <el-form class="form" label-width="auto" :disabled="disabled">
  4. <el-form-item label="文章标题:">
  5. <el-input v-model="form.title" placeholder="请输入文章标题" />
  6. </el-form-item>
  7. <el-form-item label="模板类型:">
  8. <el-select v-model="form.templateType" placeholder="请选择模板类型">
  9. <el-option v-for="item in typeOptions" :key="item.value" :value="item.value" :label="item.label" />
  10. </el-select>
  11. </el-form-item>
  12. <el-form-item label="背景图片:">
  13. <Upload listType="picture-card" :url="form.backgroundImage" @upload="upload($event, 'backgroundImage')"
  14. :disabled="disabled" />
  15. </el-form-item>
  16. <el-form-item v-if="form.templateType == 1" label="音频组件背景:">
  17. <Upload listType="picture-card" :url="form.audioBackgroundImage" @upload="upload($event, 'audioBackgroundImage')"
  18. :disabled="disabled" />
  19. </el-form-item>
  20. <el-form-item v-if="form.templateType == 1" label="页面排版:" style="min-width: 50%">
  21. <el-button type="primary" icon="el-icon-plus" size="mini" @click="getAdd">添加</el-button>
  22. <el-table :data="form.contentShareLayoutList">
  23. <el-table-column label="布局类型" align="center">
  24. <template slot-scope="scope">
  25. <el-select v-model="scope.row.layoutType" placeholder="请选择布局类型">
  26. <el-option v-for="item in layoutOptions" :key="item.value" :value="item.value" :label="item.label" />
  27. </el-select>
  28. </template>
  29. </el-table-column>
  30. <el-table-column label="内容" align="center">
  31. <template slot-scope="scope">
  32. <Upload v-if="scope.row.layoutType === 0" listType="picture-card" :url="scope.row.contentPic"
  33. @upload="upload($event, `contentPic`, scope.$index)" :disabled="disabled" />
  34. <el-input v-else v-model="scope.row.contentName" placeholder="请选择内容" readonly
  35. @focus="getDialog(scope.row.layoutType, scope.$index)" :title="scope.row.contentName" />
  36. </template>
  37. </el-table-column>
  38. <el-table-column label="排序" align="center">
  39. <template slot-scope="scope">
  40. <el-input-number v-model="scope.row.sort" :min="1" step-strictly />
  41. </template>
  42. </el-table-column>
  43. <el-table-column label="操作" align="center" width="100px">
  44. <template slot-scope="scope">
  45. <el-button type="delete" @click="getDelete(scope.$index)">删除</el-button>
  46. </template>
  47. </el-table-column>
  48. </el-table>
  49. </el-form-item>
  50. <el-form-item label="分享标题:">
  51. <el-input v-model="form.shareTitle" placeholder="请输入分享标题" />
  52. </el-form-item>
  53. <el-form-item label="分享描述:">
  54. <el-input v-model="form.shareDescription" type="textarea" :rows="5" placeholder="请输入分享描述" />
  55. </el-form-item>
  56. <el-form-item label="分享图片:">
  57. <Upload listType="picture-card" :url="form.shareIcon" @upload="upload($event, 'shareIcon')"
  58. :disabled="disabled" />
  59. </el-form-item>
  60. <el-form-item label="是否开启按钮:">
  61. <el-switch v-model="form.isButton" :active-value="1" :inactive-value="0" />
  62. </el-form-item>
  63. <el-form-item v-if="form.isButton == 1" label="按钮交互:">
  64. <el-select v-model="form.buttonFixType" placeholder="请选择按钮交互">
  65. <el-option v-for="item in buttonOptions" :key="item.value" :value="item.value" :label="item.label" />
  66. </el-select>
  67. </el-form-item>
  68. <el-row v-if="form.isButton == 1" style="width: 100%">
  69. <el-col :span="8">
  70. <el-form-item label="左按钮文案:">
  71. <el-input v-model="form.leftButtonText" placeholder="请输入按钮文案" />
  72. </el-form-item>
  73. <el-form-item label="左按钮图片:">
  74. <Upload listType="picture-card" :url="form.leftButtonImg" @upload="upload($event, 'leftButtonImg')"
  75. :disabled="disabled" />
  76. </el-form-item>
  77. <el-form-item label="跳转方式:">
  78. <el-select v-model="form.leftButtonForwardType" placeholder="请选择跳转方式">
  79. <el-option v-for="item in changeOptions" :key="item.value" :value="item.value" :label="item.label" />
  80. </el-select>
  81. </el-form-item>
  82. <el-form-item v-if="form.leftButtonForwardType === 1" label="内容添加:">
  83. <el-input v-model="form.leftButtonContentName" readonly placeholder="请选择内容" @focus="getDialog(2, -1)" />
  84. </el-form-item>
  85. <el-form-item v-if="form.leftButtonForwardType === 0" label="跳转链接:">
  86. <el-input v-model="form.leftButtonForwardUrl" placeholder="请输入跳转链接" />
  87. </el-form-item>
  88. </el-col>
  89. <el-col :span="8">
  90. <el-form-item label="右按钮文案:">
  91. <el-input v-model="form.rightButtonText" placeholder="请输入按钮文案" />
  92. </el-form-item>
  93. <el-form-item label="右按钮图片:">
  94. <Upload listType="picture-card" :url="form.rightButtonImg" @upload="upload($event, 'rightButtonImg')"
  95. :disabled="disabled" />
  96. </el-form-item>
  97. <el-form-item label="跳转方式:">
  98. <el-select v-model="form.rightButtonForwardType" placeholder="请选择跳转方式">
  99. <el-option v-for="item in changeOptions" :key="item.value" :value="item.value" :label="item.label" />
  100. </el-select>
  101. </el-form-item>
  102. <el-form-item v-if="form.rightButtonForwardType === 1" label="内容添加:">
  103. <el-input v-model="form.rightButtonContentName" readonly placeholder="请选择内容" @focus="getDialog(2, -2)" />
  104. </el-form-item>
  105. <el-form-item v-if="form.rightButtonForwardType === 0" label="跳转链接:">
  106. <el-input v-model="form.rightButtonForwardUrl" placeholder="请输入跳转链接" />
  107. </el-form-item>
  108. </el-col>
  109. </el-row>
  110. </el-form>
  111. <div style="margin-left: 110px;">
  112. <el-button @click="close">取消</el-button>
  113. <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
  114. </div>
  115. <!-- 弹出 -->
  116. <el-dialog :visible.sync="dialogVisible" title="选择音频" width="1000px">
  117. <el-form inline size="mini">
  118. <el-form-item label="音频ID:">
  119. <el-input v-model="dialogForm.id" placeholder="请输入音频ID" clearable />
  120. </el-form-item>
  121. <el-form-item label="内容名称:">
  122. <el-input v-model="dialogForm.name" placeholder="请输入内容名称" clearable />
  123. </el-form-item>
  124. <el-form-item label="音频类型:">
  125. <el-select v-model="dialogForm.audioType" placeholder="请选择音频类型">
  126. <el-option v-for="item in audioOptions" :key="item.value" :value="item.value" :label="item.label" />
  127. </el-select>
  128. </el-form-item>
  129. <el-form-item label="资源平台:">
  130. <el-select v-model="dialogForm.platformId" placeholder="请选择资源平台" clearable>
  131. <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label" />
  132. </el-select>
  133. </el-form-item>
  134. <el-form-item label="付费类型:">
  135. <el-select v-model="dialogForm.isFree" placeholder="请选择付费类型" clearable>
  136. <el-option v-for="item in freeOptions" :key="item.value" :value="item.value" :label="item.label" />
  137. </el-select>
  138. </el-form-item>
  139. <el-form-item>
  140. <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
  141. <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
  142. </el-form-item>
  143. </el-form>
  144. <el-table :data="tableData">
  145. <el-table-column label="音频ID" prop="audioId" align="center" show-overflow-tooltip />
  146. <el-table-column label="音频名称" prop="audioName" align="center" show-overflow-tooltip />
  147. <el-table-column label="音频封面" align="center" width="100px">
  148. <template slot-scope="scope">
  149. <el-image :src="scope.row.audioPic" />
  150. </template>
  151. </el-table-column>
  152. <el-table-column label="音频作者" prop="singerName" align="center" show-overflow-tooltip />
  153. <el-table-column label="专辑名称" prop="songName" align="center" show-overflow-tooltip />
  154. <el-table-column label="音频类型" prop="audioType" align="center" :formatter="audioTypeFormatter" />
  155. <el-table-column label="音频数量" prop="programCount" align="center" />
  156. <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
  157. <el-table-column label="资源平台" prop="platformId" align="center" :formatter="platformFormatter" />
  158. <el-table-column label="操作" align="center">
  159. <template slot-scope="scope">
  160. <el-button type="text" @click="getChecked(scope.row)">选择</el-button>
  161. </template>
  162. </el-table-column>
  163. </el-table>
  164. <div slot="footer">
  165. <pagination v-show="total > 0" :total="total" :page.sync="dialogForm.pageNum" :limit.sync="dialogForm.pageSize"
  166. @pagination="getList" />
  167. </div>
  168. </el-dialog>
  169. </div>
  170. </template>
  171. <script>
  172. import { platformMixin, isFreeMixin } from '@/mixin/index'
  173. import { detail, submit } from '@/api/content/article'
  174. import { list } from '@/api/operation/channel'
  175. export default {
  176. mixins: [platformMixin, isFreeMixin],
  177. data() {
  178. return {
  179. // 遮罩层
  180. loading: false,
  181. // 表单
  182. form: {
  183. id: this.$route.query.id,
  184. contentShareLayoutList: []
  185. },
  186. // 模板类型
  187. typeOptions: [{
  188. value: 0,
  189. label: '图片模板'
  190. }, {
  191. value: 1,
  192. label: '图片音频模板'
  193. }],
  194. // 布局类型
  195. layoutOptions: [{
  196. value: 0,
  197. label: '图片'
  198. }, {
  199. value: 1,
  200. label: '单音频'
  201. }, {
  202. value: 2,
  203. label: '音频合集'
  204. }],
  205. // 按钮交互
  206. buttonOptions: [{
  207. value: 0,
  208. label: '底部固定'
  209. }, {
  210. value: 1,
  211. label: '文章固定'
  212. }],
  213. // 跳转方式
  214. changeOptions: [{
  215. value: 0,
  216. label: 'H5内链'
  217. }, {
  218. value: 1,
  219. label: 'App跳转音频合集'
  220. }, {
  221. value: 2,
  222. label: '分享'
  223. }],
  224. // 音频类型
  225. audioOptions: [],
  226. // 弹窗
  227. dialogVisible: false,
  228. // 弹窗表单
  229. dialogForm: {
  230. pageNum: 1,
  231. pageSize: 10
  232. },
  233. // 总数据
  234. total: 0,
  235. // 弹窗列表
  236. tableData: [],
  237. // 页面排版索引
  238. index: -1,
  239. // 只读
  240. disabled: Boolean(this.$route.query.boolean)
  241. }
  242. },
  243. watch: {
  244. async 'dialogForm.audioType'(val) {
  245. if (val) {
  246. await this.getPlatform({
  247. audioType: val
  248. })
  249. this.dialogForm.platformId = this.platformOptions[0].value
  250. this.getList()
  251. }
  252. }
  253. },
  254. mounted() {
  255. if (this.form.id) {
  256. this.getDetail()
  257. }
  258. },
  259. methods: {
  260. // 详情
  261. getDetail() {
  262. detail(this.form.id).then(res => {
  263. if (res.code === 0) {
  264. this.form = res.data
  265. }
  266. })
  267. },
  268. // 添加
  269. getAdd() {
  270. this.form.contentShareLayoutList.push({})
  271. },
  272. // 上传图片
  273. upload(e, key, index) {
  274. if (index !== undefined) {
  275. this.form.contentShareLayoutList[index][key] = e.file
  276. } else {
  277. this.form[key] = e.file
  278. }
  279. },
  280. // 弹窗
  281. getDialog(e, index) {
  282. this.audioOptions = e == 1 ? [{
  283. value: 2,
  284. label: '广播电台'
  285. }, {
  286. value: 6,
  287. label: '节目'
  288. }, {
  289. value: 11,
  290. label: '歌曲'
  291. }] : [{
  292. value: 8,
  293. label: '播客专辑'
  294. }, {
  295. value: 10,
  296. label: '歌单'
  297. }, {
  298. value: 15,
  299. label: '音乐专辑'
  300. }]
  301. this.$set(this.dialogForm, 'audioType', this.audioOptions[0].value)
  302. this.dialogVisible = true
  303. this.index = index
  304. },
  305. // 列表
  306. getList() {
  307. this.loading = true
  308. list(this.dialogForm).then(res => {
  309. if (res.code === 0) {
  310. this.tableData = res.data.records
  311. this.total = res.data.total
  312. this.loading = false
  313. }
  314. })
  315. },
  316. // 搜索
  317. getSearch() {
  318. this.dialogForm.pageNum = 1
  319. this.getList()
  320. },
  321. // 重置
  322. getRefresh() {
  323. this.dialogForm = {
  324. pageNum: 1,
  325. pageSize: 10,
  326. audioType: this.audioOptions[0].value,
  327. platformId: this.platformOptions[0].value
  328. }
  329. this.getList()
  330. },
  331. // 选择
  332. getChecked(row) {
  333. if (this.index >= 0) {
  334. let e = this.form.contentShareLayoutList[this.index]
  335. this.$set(e, 'contentId', row.audioId)
  336. this.$set(e, 'contentName', row.audioName)
  337. this.$set(e, 'contentPic', row.audioPic)
  338. this.$set(e, 'contentType', row.audioType)
  339. this.$set(e, 'platformId', row.platformId)
  340. } else {
  341. let e = this.index == -1 ? 'left' : 'right'
  342. this.$set(this.form, `${e}ButtonContentId`, row.audioId)
  343. this.$set(this.form, `${e}ButtonContentName`, row.audioName)
  344. this.$set(this.form, `${e}ButtonContentType`, row.audioType)
  345. this.$set(this.form, `${e}ButtonPlatformId`, row.platformId)
  346. }
  347. this.$message.success('选择成功!')
  348. this.dialogVisible = false
  349. },
  350. // 删除排版
  351. getDelete(index) {
  352. this.form.contentShareLayoutList.splice(index, 1)
  353. },
  354. // 关闭
  355. close() {
  356. this.$tab.closeOpenPage('/content/articleList')
  357. },
  358. // 提交
  359. getSubmit() {
  360. submit(this.form).then(res => {
  361. if (res.code === 0) {
  362. this.$message.success('提交成功!')
  363. this.close()
  364. }
  365. })
  366. },
  367. // 字典翻译
  368. audioTypeFormatter(row) {
  369. return this.selectDictLabel(this.audioOptions, row.audioType)
  370. },
  371. freeFormatter(row) {
  372. return this.selectDictLabel(this.freeOptions, row.isFree)
  373. },
  374. platformFormatter(row) {
  375. return this.selectDictLabel(this.platformOptions, row.platformId)
  376. }
  377. }
  378. }
  379. </script>
  380. <style lang="scss" scoped>
  381. .form {
  382. .el-form-item {
  383. width: 500px;
  384. }
  385. }
  386. </style>