detail.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="form" ref="form" :rules="rules" label-width="100px" :disabled="disabled">
  4. <el-form-item label="有效时间:" prop="date">
  5. <el-date-picker v-model="form.date" type="datetimerange" range-separator="至" start-placeholder="开始日期"
  6. end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss">
  7. </el-date-picker>
  8. </el-form-item>
  9. <el-form-item label="内容:" prop="audioName">
  10. <el-input v-model="form.audioName" placeholder="请选择内容" @focus="getDialog" />
  11. </el-form-item>
  12. <el-form-item label="封面模式:" prop="isCustom">
  13. <el-select v-model="form.isCustom" placeholder="请选择封面模式">
  14. <el-option v-for="item in coverOptions" :key="item.value" :value="item.value" :label="item.label" />
  15. </el-select>
  16. </el-form-item>
  17. <el-form-item v-if="form.isCustom === 0" label="内容封面:" prop="pic">
  18. <Upload listType="picture-card" :url="form.pic" @upload="upload" :disabled="disabled" />
  19. </el-form-item>
  20. </el-form>
  21. <div class="form-btn">
  22. <el-button @click="cancel">取消</el-button>
  23. <el-button v-if="!disabled" type="primary" @click="getSubmit">确定</el-button>
  24. </div>
  25. <!-- 弹窗 -->
  26. <el-dialog :visible.sync="dialogVisible" title="添加内容" width="1100px">
  27. <el-form inline size="mini" style="width: 100%">
  28. <el-form-item label="资源平台:">
  29. <el-select v-model="dialogForm.platformId" placeholder="请选择资源平台">
  30. <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
  31. :label="item.label" />
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item label="音频类型:">
  35. <el-select v-model="dialogForm.audioType" placeholder="请选择音频类型">
  36. <el-option v-for="item in audioTypeOptions" :key="item.value" :value="item.value"
  37. :label="item.label" />
  38. </el-select>
  39. </el-form-item>
  40. <el-form-item label="音频名称:">
  41. <el-input placeholder="请输入音频名称" />
  42. </el-form-item>
  43. <el-form-item>
  44. <el-button type="primary" icon="el-icon-search" @click="getSearch">搜索</el-button>
  45. <el-button icon="el-icon-refresh" @click="getRefresh">重置</el-button>
  46. </el-form-item>
  47. </el-form>
  48. <el-table :data="tableData" v-loading="loading">
  49. <el-table-column label="内容ID" prop="audioId" align="center" show-overflow-tooltip />
  50. <el-table-column label="音频名称" prop="audioName" align="center" show-overflow-tooltip />
  51. <el-table-column label="音频封面" align="center" width="100px">
  52. <template slot-scope="scope">
  53. <el-image :src="scope.row.audioPic" />
  54. </template>
  55. </el-table-column>
  56. <el-table-column label="音频类型" prop="audioType" align="center" :formatter="audioTypeFormatter" />
  57. <el-table-column label="音频数量" prop="programCount" align="center" />
  58. <el-table-column label="付费类型" prop="isFree" align="center" :formatter="freeFormatter" />
  59. <el-table-column label="操作" align="center">
  60. <template slot-scope="scope">
  61. <el-button type="text" @click="getChecked(scope.row)">选择</el-button>
  62. </template>
  63. </el-table-column>
  64. </el-table>
  65. <pagination v-show="total>0" :total="total" :page.sync="dialogForm.pageNum"
  66. :limit.sync="dialogForm.pageSize" @pagination="getList" />
  67. </el-dialog>
  68. </div>
  69. </template>
  70. <script>
  71. import Upload from '@/components/Upload/index.vue'
  72. import { radioList } from '@/api/operation/recommend'
  73. import { create, detail, edit } from '@/api/registration/content'
  74. import { platformMixin, audioMixin, isFreeMixin, coverMixin } from '@/mixin/index'
  75. export default {
  76. mixins: [platformMixin, audioMixin, isFreeMixin, coverMixin],
  77. components: {
  78. Upload
  79. },
  80. data() {
  81. return {
  82. // 遮罩层
  83. loading: false,
  84. // 表单
  85. form: {
  86. status: 0
  87. },
  88. // 弹窗
  89. dialogVisible: false,
  90. // 弹窗表单
  91. dialogForm: {
  92. pageNum: 1,
  93. pageSize: 10,
  94. platformId: 1,
  95. audioType: null
  96. },
  97. // 列表
  98. tableData: [],
  99. // 总数据
  100. total: 0,
  101. // 校验
  102. rules: {
  103. date: [{
  104. required: true, message: '请选择有效时间', trigger: 'change'
  105. }],
  106. audioName: [{
  107. required: true, message: '请选择内容', trigger: 'change'
  108. }],
  109. isCustom: [{
  110. required: true, message: '请选择封面模式', trigger: 'change'
  111. }],
  112. pic: [{
  113. required: true, message: '请上传内容封面', trigger: 'change'
  114. }]
  115. },
  116. // 只读
  117. disabled: false
  118. }
  119. },
  120. watch: {
  121. 'dialogForm.platformId': {
  122. async handler(val) {
  123. await this.getAudioType(val)
  124. this.dialogForm.audioType = this.audioTypeOptions[0].value
  125. this.getList()
  126. },
  127. deep: true
  128. },
  129. 'form.date': {
  130. handler(val) {
  131. if (val) {
  132. this.form.startTime = val[0]
  133. this.form.endTime = val[1]
  134. }
  135. },
  136. deep: true
  137. }
  138. },
  139. mounted() {
  140. if (this.$route.query.id) {
  141. this.form.id = this.$route.query.id
  142. this.disabled = Boolean(this.$route.query.disabled)
  143. this.getDetail()
  144. }
  145. },
  146. methods: {
  147. // 详情
  148. getDetail() {
  149. detail(this.form.id).then(res => {
  150. if (res.code === 0) {
  151. this.form = res.data
  152. this.form.date = [res.data.startTime, res.data.endTime]
  153. }
  154. })
  155. },
  156. // 打开弹窗
  157. async getDialog() {
  158. this.dialogVisible = true
  159. await this.getAudioType(this.dialogForm.platformId)
  160. this.dialogForm.audioType = this.audioTypeOptions[0].value
  161. this.getList()
  162. },
  163. // 音频列表
  164. getList() {
  165. this.loading = true
  166. radioList(this.dialogForm).then(res => {
  167. if (res.code === 0) {
  168. this.tableData = res.data.records
  169. this.total = res.data.total
  170. this.loading = false
  171. }
  172. })
  173. },
  174. // 搜索
  175. getSearch() {
  176. this.dialogForm.pageNum = 1
  177. this.getList()
  178. },
  179. // 重置
  180. getRefresh() {
  181. this.dialogForm = {
  182. pageNum: 1,
  183. pageSize: 10,
  184. audioType: this.audioTypeOptions[0].value,
  185. platformId: 1
  186. }
  187. this.getList()
  188. },
  189. // 选择
  190. getChecked(row) {
  191. this.form.audioId = row.audioId
  192. this.form.audioInfo = row.description
  193. this.form.audioName = row.audioName
  194. this.form.audioType = row.audioType
  195. this.form.platformId = row.platformId
  196. this.form.pic = row.audioPic
  197. },
  198. // 上传
  199. upload(e) {
  200. this.form.pic = e.file
  201. },
  202. // 取消
  203. cancel() {
  204. this.$tab.closeOpenPage('/registration/contentConfig')
  205. },
  206. // 确定
  207. getSubmit() {
  208. this.$refs.form.validate((valid) => {
  209. if (valid) {
  210. delete this.form.date
  211. if (this.form.id) {
  212. edit(this.form).then(res => {
  213. if (res.code === 0) {
  214. this.$message.success('编辑成功!')
  215. this.cancel()
  216. }
  217. })
  218. } else {
  219. create(this.form).then(res => {
  220. if (res.code === 0) {
  221. this.$message.success('新增成功!')
  222. this.cancel()
  223. }
  224. })
  225. }
  226. } else {
  227. return false
  228. }
  229. })
  230. },
  231. // 字典翻译
  232. audioTypeFormatter(row) {
  233. return this.selectDictLabel(this.audioOptions, row.audioType)
  234. },
  235. freeFormatter(row) {
  236. return this.selectDictLabel(this.freeOptions, row.isFree)
  237. }
  238. }
  239. }
  240. </script>
  241. <style lang="scss" scoped>
  242. .el-form {
  243. width: 500px;
  244. }
  245. </style>