detail.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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="name">
  5. <el-input v-model="form.name" placeholder="请输入节目名称" />
  6. </el-form-item>
  7. <el-form-item label="节目介绍:" prop="description">
  8. <el-input v-model="form.description" type="textarea" :autosize="{ minRows: 5, maxRows: 10}"
  9. placeholder="请输入节目介绍" />
  10. </el-form-item>
  11. <el-form-item label="资源平台:" prop="platformId">
  12. <el-select v-model="form.platformId" placeholder="请选择资源平台">
  13. <el-option v-for="item in platformOptions" :key="item.value" :value="item.value"
  14. :label="item.label" />
  15. </el-select>
  16. </el-form-item>
  17. <el-form-item label="付费类型:" prop="isFree">
  18. <el-select v-model="form.isFree" placeholder="请选择付费类型">
  19. <el-option v-for="item in freeOptions" :key="item.value" :value="item.value" :label="item.label" />
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item v-if="form.isFree === 0" label="原价:" prop="price">
  23. <el-input v-model="form.price" placeholder="请输入原价" />
  24. </el-form-item>
  25. <el-form-item v-if="form.isFree === 0" label="折扣价:" prop="discountedPrice">
  26. <el-input v-model="form.discountedPrice" placeholder="请输入折扣价" />
  27. </el-form-item>
  28. <el-form-item label="节目封面:" prop="cover">
  29. <Upload listType="picture-card" :url="form.cover" @upload="upload($event, 'cover')"
  30. :disabled="disabled" />
  31. </el-form-item>
  32. <el-form-item label="音频文件:" prop="fullUrl">
  33. <Upload listType="audio" @upload="upload($event, 'fullUrl')" />
  34. <div style="color:#909399">单个上传音频文件不超过500MB</div>
  35. </el-form-item>
  36. </el-form>
  37. <div class="form-btn">
  38. <el-button @click="cancel">取消</el-button>
  39. <el-button v-if="!disabled" type="primary" @click="getSubmit">提交</el-button>
  40. </div>
  41. </div>
  42. </template>
  43. <script>
  44. import { submit, detail } from '@/api/music/program'
  45. import { platformMixin, isFreeMixin } from '@/mixin/index'
  46. import Upload from "@/components/Upload/index"
  47. export default {
  48. mixins: [platformMixin, isFreeMixin],
  49. components: {
  50. Upload,
  51. },
  52. data() {
  53. // 小数点后两位 正则
  54. var str = /^\d+.?\d{0,2}$/
  55. // 判断原价是否大于折扣价
  56. var checkPrice = (rule, value, callback) => {
  57. if (!value) {
  58. return callback(new Error('请输入原价'))
  59. } else if (!str.test(value)) {
  60. return callback(new Error('小数点后最多输入两位'))
  61. } else if (this.form.discountedPrice) {
  62. Number(value) > Number(this.form.discountedPrice) ? this.$refs.form.clearValidate('discountedPrice') : callback(new Error('原价必须大于折扣价'))
  63. }
  64. }
  65. // 判断折扣价是否小于原价
  66. var checkDiscount = (rule, value, callback) => {
  67. if (value) {
  68. if (!str.test(value)) {
  69. return callback(new Error('小数点后最多输入两位'))
  70. } else if (this.form.price) {
  71. Number(value) < Number(this.form.price) ? this.$refs.form.clearValidate('price') : callback(new Error('折扣价必须小于原价'))
  72. }
  73. }
  74. }
  75. return {
  76. // 音频类型
  77. audioType: 6,
  78. // 表单
  79. form: {
  80. status: 1
  81. },
  82. // 校验
  83. rules: {
  84. name: [{
  85. required: true, message: '请输入节目名称', trigger: 'blur'
  86. }],
  87. description: [{
  88. required: true, message: '请输入节目简介', trigger: 'blur'
  89. }],
  90. platformId: [{
  91. required: true, message: '请选择资源平台', trigger: 'change'
  92. }],
  93. isFree: [{
  94. required: true, message: '请选择付费类型', trigger: 'change'
  95. }],
  96. price: [{
  97. required: true, validator: checkPrice, trigger: 'blur'
  98. }],
  99. discountedPrice: [{
  100. validator: checkDiscount, trigger: 'blur'
  101. }],
  102. cover: [{
  103. required: true, message: '请上传节目封面', trigger: 'change'
  104. }],
  105. fullUrl: [{
  106. required: true, message: '请上传音频文件', trigger: 'change'
  107. }]
  108. },
  109. // 只读
  110. disabled: false
  111. };
  112. },
  113. mounted() {
  114. if (this.$route.query.id) {
  115. this.form.id = this.$route.query.id
  116. this.disabled = Boolean(this.$route.query.disabled)
  117. this.getList()
  118. }
  119. },
  120. methods: {
  121. // 详情
  122. getList() {
  123. detail(this.form.id).then(res => {
  124. if (res.code === 0) {
  125. this.form = res.data
  126. }
  127. })
  128. },
  129. // 上传
  130. upload(e, key) {
  131. if (key === 'cover') {
  132. this.form.cover = e.file
  133. } else {
  134. this.form.fullUrl = e.file.url
  135. this.form.fullDuration = e.file.time
  136. }
  137. },
  138. // 确定
  139. getSubmit() {
  140. this.$refs.form.validate((valid) => {
  141. if (valid) {
  142. let title = this.form.id ? `编辑成功!` : `新增成功!`
  143. submit(this.form).then(res => {
  144. if (res.code === 0) {
  145. this.$message.success(`${title}`)
  146. this.cancel()
  147. }
  148. })
  149. } else {
  150. return false
  151. }
  152. })
  153. },
  154. // 取消
  155. cancel() {
  156. this.$tab.closeOpenPage("/music/program");
  157. },
  158. },
  159. };
  160. </script>
  161. <style lang="scss" scoped>
  162. .el-form {
  163. width: 500px;
  164. }
  165. </style>