detail.vue 18 KB

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