detail.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. <template>
  2. <div class="app-container">
  3. <el-form class="form" :model="form" ref="form" :rules="rules" label-width="100px" :disabled="disabled">
  4. <el-form-item label="播客名称:" prop="name">
  5. <el-input v-model="form.name" placeholder="请输入播客名称" />
  6. </el-form-item>
  7. <el-form-item label="主播名称:" prop="podcasterIds">
  8. <el-select v-model="form.podcasterIds" multiple filterable remote reserve-keyword placeholder="请输入主播名称"
  9. :remote-method="getSelect" no-data-text="请新增主播">
  10. <el-option v-for="item in anchorOptions" :key="item.value" :value="item.value" :label="item.label" />
  11. </el-select>
  12. </el-form-item>
  13. <el-form-item label="播客分类:" prop="categoryIds">
  14. <el-select v-model="form.categoryIds" multiple placeholder="请选择播客分类">
  15. <el-option v-for="item in classifyOptions" :key="item.value" :value="item.value.toString()"
  16. :label="item.label" />
  17. </el-select>
  18. </el-form-item>
  19. <el-form-item label="播客介绍:" prop="description">
  20. <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10 }" maxlength="300"
  21. show-word-limit placeholder=" 请输入播客介绍" />
  22. </el-form-item>
  23. <el-form-item label="资源平台:" prop="platformId">
  24. <el-select v-model="form.platformId" placeholder="请选择资源平台" :disabled="disabledPlatformId(form.platformId)">
  25. <el-option v-for="item in platformOptions" :key="item.value" :value="item.value" :label="item.label"
  26. :disabled="disabledJoinType(item.joinType)" />
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item label="付费类型:" prop="charging">
  30. <el-select v-model="form.charging" placeholder="请选择付费类型">
  31. <el-option v-for="item in payTypeOptions" :key="item.value" :value="item.value" :label="item.label" />
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item v-if="form.charging !== 1" label="原价:" prop="price">
  35. <el-input-number v-model="form.price" placeholder="请输入原价" :min="1" :precision="2" :controls="false" />
  36. </el-form-item>
  37. <el-form-item v-if="form.charging !== 1" label="折扣价:" prop="discountedPrice">
  38. <el-input-number v-model="form.discountedPrice" placeholder="请输入折扣价" :min="1" :precision="2" :controls="false" />
  39. </el-form-item>
  40. <el-form-item label="播客封面" prop="thumb">
  41. <Upload listType="picture-card" :url="form.thumb" @upload="upload" :disabled="disabled" />
  42. </el-form-item>
  43. <el-form-item label="关联节目:" prop="adminPodCastProgramDetailResp">
  44. <el-button type="primary" @click="getDialog">关联节目</el-button>
  45. <el-button @click="getDelete" :disabled="ids.length > 0 ? false : true">解除关联</el-button>
  46. </el-form-item>
  47. <el-form-item style="width: 100%">
  48. <el-table :data="form.adminPodCastProgramDetailResp" height="497" @selection-change="handleSelect">
  49. <el-table-column type="selection" align="center" />
  50. <el-table-column label="ID" prop="id" align="center" show-overflow-tooltip />
  51. <el-table-column label="节目名称" prop="name" align="center" show-overflow-tooltip />
  52. <el-table-column label="资源平台" prop="platformId" align="center" :formatter="platformFormatter" />
  53. <el-table-column label="当前状态" prop="status" align="center" :formatter="statusFormatter" />
  54. </el-table>
  55. </el-form-item>
  56. </el-form>
  57. <div class="form-btn">
  58. <el-button @click="cancel">取消</el-button>
  59. <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
  60. </div>
  61. <!-- 弹窗 -->
  62. <el-dialog :visible.sync="dialogVisible" title="关联节目" width="1200px">
  63. <el-form inline size="mini" style="width: 100%">
  64. <el-form-item label="节目ID:">
  65. <el-input v-model="dialogForm.id" placeholder="请输入节目ID" clearable />
  66. </el-form-item>
  67. <el-form-item label="节目名称:">
  68. <el-input v-model="dialogForm.name" placeholder="请输入节目名称" clearable />
  69. </el-form-item>
  70. <el-form-item label="付费类型:">
  71. <el-select v-model="dialogForm.isFree" placeholder="请选择付费类型" clearable>
  72. <el-option v-for="item in freeOptions" :key="item.value" :value="item.value" :label="item.label" />
  73. </el-select>
  74. </el-form-item>
  75. <el-form-item label="资源平台:">
  76. <el-select v-model="dialogForm.platformId" placeholder="请选择资源平台">
  77. <el-option v-for="item in platformOptions.filter(i => !i.joinType.includes('1'))" :key="item.value"
  78. :value="item.value" :label="item.label" />
  79. </el-select>
  80. </el-form-item>
  81. <el-form-item>
  82. <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
  83. <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
  84. </el-form-item>
  85. </el-form>
  86. <el-table :data="dialogTableData" v-loading="loading">
  87. <el-table-column label="ID" prop="id" align="center" />
  88. <el-table-column label="节目名称" prop="name" align="center" show-overflow-tooltip />
  89. <el-table-column label="资源平台" prop="platformId" align="center" :formatter="platformFormatter" />
  90. <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
  91. <el-table-column label="当前状态" prop="status" align="center" :formatter="statusFormatter" />
  92. <el-table-column label="操作" align="center">
  93. <template slot-scope="scope">
  94. <el-button type="text" @click="getChecked(scope.row)"
  95. :disabled="form.adminPodCastProgramDetailResp.findIndex(i => i.id === scope.row.id) === -1 ? false : true">
  96. 选择
  97. </el-button>
  98. </template>
  99. </el-table-column>
  100. </el-table>
  101. <pagination v-show="total > 0" :total="total" :page.sync="dialogForm.pageNum" :limit.sync="dialogForm.pageSize"
  102. @pagination="getList" />
  103. </el-dialog>
  104. </div>
  105. </template>
  106. <script>
  107. import { classifyMixin, platformMixin, payTypeMixin, onOrOffMixin, isFreeMixin } from '@/mixin/index'
  108. import { selectAnchor } from '@/api/music/anchor'
  109. import { detail, submit, relieve, checkList } from '@/api/music/blog'
  110. export default {
  111. mixins: [classifyMixin, platformMixin, payTypeMixin, onOrOffMixin, isFreeMixin],
  112. data() {
  113. // 判断原价是否大于折扣价
  114. var checkPrice = (rule, value, callback) => {
  115. if (!value) {
  116. callback(new Error('请输入原价'))
  117. } else {
  118. if (this.form.discountedPrice && value <= this.form.discountedPrice) {
  119. callback(new Error('原价必须大于折扣价'))
  120. }
  121. callback()
  122. }
  123. }
  124. // 判断折扣价是否小于原价
  125. var checkDiscount = (rule, value, callback) => {
  126. if (this.form.price && value >= this.form.price) {
  127. callback(new Error('折扣价必须小于原价'))
  128. } else {
  129. callback()
  130. }
  131. }
  132. return {
  133. // 遮罩层
  134. loading: false,
  135. // 表单
  136. form: {
  137. adminPodCastProgramDetailResp: [],
  138. podcastProgramIds: [],
  139. categoryIds: [],
  140. status: 1
  141. },
  142. // 主播
  143. anchorOptions: [],
  144. // 弹窗
  145. dialogVisible: false,
  146. // 弹窗表单
  147. dialogForm: {
  148. pageNum: 1,
  149. pageSize: 10,
  150. status: 1,
  151. platformId: null
  152. },
  153. // 总数据
  154. total: 0,
  155. // 弹窗列表
  156. dialogTableData: [],
  157. // 只读
  158. disabled: false,
  159. // 校验
  160. rules: {
  161. name: [{
  162. required: true, message: '请输入播客专辑名称', trigger: 'blur'
  163. }],
  164. podcasterIds: [{
  165. required: true, message: '请输入主播名称', trigger: 'blur'
  166. }],
  167. categoryIds: [{
  168. required: true, message: '请选择播客分类', trigger: 'change'
  169. }],
  170. platformId: [{
  171. required: true, message: '请选择资源平台', trigger: 'change'
  172. }],
  173. charging: [{
  174. required: true, message: '请选择付费类型', trigger: 'change'
  175. }],
  176. price: [{
  177. required: true, validator: checkPrice, trigger: 'blur'
  178. }],
  179. discountedPrice: [{
  180. validator: checkDiscount, trigger: 'blur'
  181. }],
  182. thumb: [{
  183. required: true, message: '请上传播客封面', trigger: 'change'
  184. }],
  185. adminPodCastProgramDetailResp: [{
  186. required: true, message: '请关联节目', trigger: 'change'
  187. }]
  188. },
  189. // 解除关联
  190. ids: [],
  191. // 是否已选
  192. disabledChecked: false
  193. }
  194. },
  195. mounted() {
  196. // 获取资源平台
  197. this.getPlatform({
  198. audioType: 8
  199. })
  200. // 分类
  201. this.getClassify(8)
  202. if (this.$route.query.id) {
  203. this.form.id = this.$route.query.id
  204. this.disabled = Boolean(this.$route.query.disabled)
  205. this.getDetail()
  206. }
  207. },
  208. methods: {
  209. // 详情
  210. getDetail() {
  211. detail(this.form.id).then(res => {
  212. if (res.code === 0) {
  213. this.form = res.data
  214. this.anchorOptions = []
  215. res.data.adminPrdCasterResp.map(i => {
  216. this.anchorOptions.push({
  217. value: i.podcasterId,
  218. label: i.podcasterName
  219. })
  220. })
  221. this.form.podcasterIds = res.data.podcasterIds.split(',')
  222. }
  223. })
  224. },
  225. // 查询主播
  226. getSelect(e) {
  227. if (e) {
  228. setTimeout(() => {
  229. this.anchorOptions = []
  230. selectAnchor(e).then(res => {
  231. if (res.code === 0) {
  232. res.data.map(i => {
  233. this.anchorOptions.push({
  234. value: i.id,
  235. label: i.nickname
  236. })
  237. })
  238. }
  239. }, 500)
  240. })
  241. }
  242. },
  243. // 上传
  244. upload(e) {
  245. this.form.thumb = e.file
  246. },
  247. // 弹窗
  248. getDialog() {
  249. this.dialogVisible = true
  250. this.dialogForm.platformId = this.platformOptions.filter(i => !i.joinType.includes('1'))[0].value
  251. this.getList()
  252. },
  253. // 节目列表
  254. getList() {
  255. this.loading = true
  256. checkList(this.dialogForm).then(res => {
  257. if (res.code === 0) {
  258. this.dialogTableData = res.data.records
  259. this.total = res.data.total
  260. this.loading = false
  261. }
  262. })
  263. },
  264. // 搜索
  265. getSearch() {
  266. this.dialogForm.pageNum = 1
  267. this.getList()
  268. },
  269. // 重置
  270. getRefresh() {
  271. this.dialogForm = {
  272. pageNum: 1,
  273. pageSize: 10,
  274. status: 1,
  275. platformId: this.platformOptions[0].value
  276. }
  277. this.getList()
  278. },
  279. // 选择
  280. getChecked(row) {
  281. this.form.adminPodCastProgramDetailResp.push(row)
  282. this.$message.success('选择成功!')
  283. },
  284. // 解除关联
  285. getDelete() {
  286. if (this.form.id) {
  287. relieve({
  288. id: this.form.id,
  289. podcastProgramIds: this.ids
  290. }).then(res => {
  291. if (res.code === 0) {
  292. this.$message.success('解除成功!')
  293. this.getDetail()
  294. }
  295. })
  296. } else {
  297. this.ids.map(i => {
  298. this.form.adminPodCastProgramDetailResp.map((j, index) => {
  299. if (j.id === i) {
  300. this.form.adminPodCastProgramDetailResp.splice(index, 1)
  301. this.$message.success('解除成功!')
  302. }
  303. })
  304. })
  305. }
  306. },
  307. // 确定
  308. getSubmit() {
  309. this.$refs.form.validate((valid) => {
  310. if (valid) {
  311. let title = this.form.id ? '编辑成功!' : '新增成功!'
  312. this.form.podcastProgramIds = []
  313. this.form.adminPodCastProgramDetailResp.map(i => {
  314. this.form.podcastProgramIds.push(i.id)
  315. })
  316. submit(this.form).then(res => {
  317. if (res.code === 0) {
  318. this.$message.success(`${title}`)
  319. if (this.form.id) {
  320. delete this.form.adminPodCastProgramDetailResp
  321. this.getDetail()
  322. } else {
  323. this.cancel()
  324. }
  325. }
  326. })
  327. } else {
  328. return false
  329. }
  330. })
  331. },
  332. // 多选
  333. handleSelect(e) {
  334. this.ids = []
  335. e.map(i => {
  336. this.ids.push(i.id)
  337. })
  338. },
  339. // 取消
  340. cancel() {
  341. this.$tab.closeOpenPage('/music/blog')
  342. },
  343. // 字典翻译
  344. platformFormatter(row) {
  345. return this.selectDictLabel(this.platformOptions, row.platformId)
  346. },
  347. statusFormatter(row) {
  348. return this.selectDictLabel(this.onOrOffOptions, row.status)
  349. },
  350. freeFormatter(row) {
  351. return this.selectDictLabel(this.freeOptions, row.isFree)
  352. }
  353. }
  354. }
  355. </script>
  356. <style lang="scss" scoped>
  357. .form {
  358. .el-form-item {
  359. width: 500px;
  360. }
  361. }
  362. </style>