index.tsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. import ColUpload from '@/components/col-upload'
  2. import request from '@/helpers/request'
  3. import {
  4. ElButton,
  5. ElForm,
  6. ElFormItem,
  7. ElInput,
  8. ElOption,
  9. ElOptionGroup,
  10. ElRadioButton,
  11. ElRadioGroup,
  12. ElSelect
  13. } from 'element-plus'
  14. import { defineComponent } from 'vue'
  15. import styles from './index.module.less'
  16. export default defineComponent({
  17. name: 'music-operation',
  18. data() {
  19. const query = this.$route.query
  20. return {
  21. type: query.type || 'create',
  22. subjectList: [],
  23. form: {
  24. xmlFileUrl: '',
  25. hasBeat: 0,
  26. mp3Url: '',
  27. bgmp3Url: '',
  28. musicSheetName: '',
  29. composer: '',
  30. vlewSubjectList: null as any,
  31. tags: [] as string[],
  32. canEvaluate: 1,
  33. showFingering: 1,
  34. chargeType: 0
  35. }
  36. }
  37. },
  38. async mounted() {
  39. try {
  40. await request.get('/api-website/open/subject/subjectSelect').then(res => {
  41. this.subjectList = res.data || []
  42. // console.log(this.subjectList)
  43. // this.subjectListNames = this.getSubjectListNames(teacherState.subjectList)
  44. })
  45. } catch {}
  46. },
  47. methods: {
  48. onSubmit() {
  49. ;(this as any).$refs.form.validate((valid: any) => {
  50. if (valid) {
  51. console.log(true)
  52. } else {
  53. this.$nextTick(() => {
  54. let isError = document.getElementsByClassName('is-error')
  55. isError[0].scrollIntoView({
  56. block: 'center',
  57. behavior: 'smooth'
  58. })
  59. })
  60. return false
  61. }
  62. })
  63. }
  64. },
  65. render() {
  66. return (
  67. <div class={styles.form}>
  68. <div class="text-base text-[#333] leading-none px-6 py-5 border-b border-b-[#E5E5E5]">
  69. {this.type === 'create' ? '新建乐谱' : '编辑乐谱'}
  70. </div>
  71. <ElForm
  72. size="large"
  73. labelPosition="left"
  74. labelWidth={'120px'}
  75. model={this.form}
  76. ref="form"
  77. class="px-52 py-5"
  78. >
  79. <ElFormItem
  80. label="MusicXML文件"
  81. prop="xmlFileUrl"
  82. rules={[{ required: true, message: '请选择MusicXML文件' }]}
  83. >
  84. <ColUpload
  85. v-model:modelValue={this.form.xmlFileUrl}
  86. bucket={'cloud-coach'}
  87. accept={'application/xml'}
  88. uploadType={'file'}
  89. extraTips="文件最大不能超过5MB"
  90. />
  91. </ElFormItem>
  92. <ElFormItem
  93. label="是否带节拍器"
  94. prop="hasBeat"
  95. rules={[{ required: true, message: '请选择是否带节拍器' }]}
  96. >
  97. <ElRadioGroup v-model={this.form.hasBeat}>
  98. <ElRadioButton label={0} class="mr-3 w-24">
  99. </ElRadioButton>
  100. <ElRadioButton label={1} class="w-24">
  101. </ElRadioButton>
  102. </ElRadioGroup>
  103. </ElFormItem>
  104. <ElFormItem label="伴奏文件" prop="mp3Url">
  105. <ColUpload
  106. v-model:modelValue={this.form.mp3Url}
  107. bucket={'cloud-coach'}
  108. accept={'.mp3'}
  109. uploadType={'file'}
  110. extraTips="文件最大不能超过5MB"
  111. />
  112. </ElFormItem>
  113. <ElFormItem
  114. label="原音文件"
  115. prop="bgmp3Url"
  116. rules={[{ required: true, message: '请选择原音文件' }]}
  117. >
  118. <ColUpload
  119. v-model:modelValue={this.form.bgmp3Url}
  120. bucket={'cloud-coach'}
  121. accept={'.mp3'}
  122. uploadType={'file'}
  123. extraTips="文件最大不能超过5MB"
  124. />
  125. </ElFormItem>
  126. <ElFormItem
  127. label="曲目名称"
  128. prop="musicSheetName"
  129. rules={[{ required: true, message: '请输入曲目名称' }]}
  130. >
  131. <ElInput
  132. v-model={this.form.musicSheetName}
  133. placeholder="请选择曲目名称"
  134. />
  135. </ElFormItem>
  136. <ElFormItem
  137. label="作曲人"
  138. prop="composer"
  139. rules={[{ required: true, message: '请输入作曲人' }]}
  140. >
  141. <ElInput v-model={this.form.composer} placeholder="请输入作曲人" />
  142. </ElFormItem>
  143. <ElFormItem
  144. label="曲目声部"
  145. prop="vlewSubjectList"
  146. rules={[
  147. { required: true, message: '请选择曲目声部', trigger: 'change' }
  148. ]}
  149. >
  150. <ElSelect
  151. filterable
  152. v-model={this.form.vlewSubjectList}
  153. placeholder="请选择曲目声部"
  154. class="w-full"
  155. >
  156. {this.subjectList.map((group: any) => (
  157. <ElOptionGroup key={group.id} label={group.name}>
  158. {group.subjects &&
  159. group.subjects.map((item: any) => (
  160. <ElOption
  161. key={item.id}
  162. value={item.id}
  163. label={item.name}
  164. />
  165. ))}
  166. </ElOptionGroup>
  167. ))}
  168. </ElSelect>
  169. </ElFormItem>
  170. <ElFormItem
  171. label="曲目标签"
  172. prop="tags"
  173. rules={[{ required: true, message: '请选择曲目标签' }]}
  174. >
  175. <ElInput v-model={this.form.tags} placeholder="请输入乐谱名称" />
  176. </ElFormItem>
  177. <ElFormItem
  178. label="是否评测"
  179. prop="canEvaluate"
  180. rules={[{ required: true, message: '请选择是否评测' }]}
  181. >
  182. <ElRadioGroup v-model={this.form.canEvaluate}>
  183. <ElRadioButton label={0} class="mr-3 w-24">
  184. </ElRadioButton>
  185. <ElRadioButton label={1} class="w-24">
  186. </ElRadioButton>
  187. </ElRadioGroup>
  188. </ElFormItem>
  189. <ElFormItem
  190. label="指法展示"
  191. prop="showFingering"
  192. rules={[{ required: true, message: '请选择指法展示' }]}
  193. >
  194. <ElRadioGroup v-model={this.form.showFingering}>
  195. <ElRadioButton label={0} class="mr-3 w-24">
  196. </ElRadioButton>
  197. <ElRadioButton label={1} class="w-24">
  198. </ElRadioButton>
  199. </ElRadioGroup>
  200. </ElFormItem>
  201. <ElFormItem
  202. label="是否收费"
  203. prop="chargeType"
  204. rules={[{ required: true, message: '请选择是否收费' }]}
  205. >
  206. <ElRadioGroup v-model={this.form.chargeType}>
  207. <ElRadioButton label={0} class="mr-3 w-24">
  208. </ElRadioButton>
  209. <ElRadioButton label={1} class="w-24">
  210. </ElRadioButton>
  211. </ElRadioGroup>
  212. </ElFormItem>
  213. </ElForm>
  214. <div class="border-t border-t-[#E5E5E5] text-center pt-6 pb-7">
  215. <ElButton
  216. class="!w-40 !h-[38px]"
  217. onClick={() => {
  218. this.$router.back()
  219. }}
  220. >
  221. 取消
  222. </ElButton>
  223. <ElButton
  224. type="primary"
  225. class="!w-40 !h-[38px]"
  226. onClick={this.onSubmit}
  227. >
  228. 提交审核
  229. </ElButton>
  230. </div>
  231. </div>
  232. )
  233. }
  234. })