detail.vue 5.7 KB

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