detail.vue 17 KB

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