index.tsx 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. import ColCropper from '@/components/col-cropper'
  2. import ColUpload from '@/components/col-upload'
  3. import request from '@/helpers/request'
  4. import { verifyNumberIntegerAndFloat } from '@/helpers/toolsValidate'
  5. import { getCodeBaseUrl } from '@/helpers/utils'
  6. import {
  7. ElButton,
  8. ElForm,
  9. ElFormItem,
  10. ElInput,
  11. ElOption,
  12. ElOptionGroup,
  13. ElRadioButton,
  14. ElRadioGroup,
  15. ElSelect,
  16. ElDialog,
  17. ElMessage
  18. } from 'element-plus'
  19. import { defineComponent } from 'vue'
  20. import styles from './index.module.less'
  21. export type BackgroundMp3 = {
  22. url?: string
  23. track?: string
  24. }
  25. export const validator = (rule, value, callback) => {
  26. console.log(value)
  27. if (value == '') {
  28. callback(new Error('请输入收费价格'))
  29. } else if (Number(value) <= 0) {
  30. callback(new Error('收费金额必须大于0'))
  31. } else {
  32. callback()
  33. }
  34. }
  35. export default defineComponent({
  36. name: 'music-operation',
  37. data() {
  38. const query = this.$route.query
  39. return {
  40. type: query.type || 'create',
  41. subjectList: [],
  42. tagList: [],
  43. submitLoading: false,
  44. reason: '',
  45. form: {
  46. titleImg: '',
  47. accompanimentType: 'HOMEMODE',
  48. audioType: 'MP3',
  49. xmlFileUrl: '',
  50. hasBeat: 0,
  51. mp3Url: '',
  52. bgmp3Url: '',
  53. midiUrl: '',
  54. musicSheetName: '',
  55. composer: '',
  56. musicSubject: null as any,
  57. tags: [] as string[],
  58. notation: 0,
  59. canEvaluate: 1,
  60. showFingering: 1,
  61. chargeType: 0,
  62. musicPrice: '',
  63. backgroundMp3s: [
  64. {
  65. url: '',
  66. track: ''
  67. }
  68. ] as BackgroundMp3[]
  69. },
  70. radioList: [], // 选中的人数
  71. tagStatus: false,
  72. music_sheet_service_fee: 0
  73. }
  74. },
  75. async mounted() {
  76. document.title = this.type === 'create' ? '新建曲谱' : '编辑曲谱'
  77. try {
  78. await request
  79. .get('/api-website/sysConfig/queryByParamName', {
  80. params: {
  81. paramName: 'music_sheet_service_fee'
  82. }
  83. })
  84. .then(res => (this.music_sheet_service_fee = res.data.paramValue))
  85. await request.get('/api-website/open/subject/subjectSelect').then(res => {
  86. this.subjectList = res.data || []
  87. })
  88. await request.get('/api-website/open/MusicTag/tree').then(res => {
  89. this.tagList = res.data || []
  90. })
  91. if (this.$route.query.id) {
  92. this.setDetail(this.$route.query.id as string)
  93. }
  94. } catch {}
  95. },
  96. methods: {
  97. async setDetail(id: string) {
  98. try {
  99. const res = await request.get(
  100. '/api-website/open/music/sheet/detail/' + id
  101. )
  102. this.form.chargeType = res.data.chargeType === 'FREE' ? 0 : 2
  103. this.form.showFingering = res.data.showFingering
  104. this.form.notation = res.data.notation
  105. this.form.canEvaluate = res.data.canEvaluate
  106. if (this.form.chargeType) {
  107. this.form.musicPrice = res.data.musicPrice
  108. }
  109. this.form.composer = res.data.composer
  110. this.form.musicSheetName = res.data.musicSheetName
  111. this.form.audioType = res.data.audioType
  112. this.form.musicSubject = Number(res.data.musicSubject)
  113. const musicTag = res.data.musicTag.split(',')
  114. const filterMusicTag = musicTag.filter((el: any) => {
  115. return el != ''
  116. })
  117. this.form.tags = filterMusicTag.map((item: any) => {
  118. return Number(item)
  119. })
  120. this.radioList = musicTag.map((item: any) => {
  121. return Number(item)
  122. })
  123. this.form.xmlFileUrl = res.data.xmlFileUrl
  124. this.form.accompanimentType = res.data.accompanimentType
  125. this.form.titleImg = res.data.titleImg
  126. // this.form.audioType = res.data.mp3Type
  127. if (this.form.audioType === 'MP3') {
  128. this.form.hasBeat = res.data.hasBeat || 0
  129. this.form.mp3Url = res.data.metronomeUrl || res.data.url
  130. } else {
  131. this.form.midiUrl = res.data.midiUrl
  132. }
  133. this.form.backgroundMp3s = (res.data.background || []).map(
  134. (item: any, index: any) => {
  135. if (index === 0) {
  136. this.form.bgmp3Url = item.metronomeUrl || item.audioFileUrl
  137. }
  138. return {
  139. url: this.form.hasBeat ? item.metronomeUrl : item.audioFileUrl,
  140. track: item.track
  141. }
  142. }
  143. )
  144. this.reason = res.data.reason
  145. // console.log(this.form.bgmp3Url)
  146. } catch (error) {
  147. console.log(error)
  148. }
  149. },
  150. createSubmitData() {
  151. const { form } = this
  152. const beatType = form.hasBeat ? 'MP3_METRONOME' : 'MP3'
  153. const mp3Type = form.audioType === 'MP3' ? beatType : 'MIDI'
  154. return {
  155. audioType: form.audioType,
  156. sourceType: 'TEACHER',
  157. mp3Type,
  158. accompanimentType: form.accompanimentType,
  159. titleImg: form.titleImg,
  160. hasBeat: Number(form.hasBeat),
  161. url: form.hasBeat ? '' : form.mp3Url,
  162. metronomeUrl: form.hasBeat ? form.mp3Url : '',
  163. showFingering: Number(form.showFingering),
  164. notation: Number(form.notation),
  165. musicTag: form.tags.join(','),
  166. musicSubject: form.musicSubject || undefined,
  167. musicSheetName: form.musicSheetName,
  168. midiUrl: form.midiUrl,
  169. xmlFileUrl: form.xmlFileUrl,
  170. canEvaluate: Number(form.canEvaluate),
  171. chargeType: form.chargeType === 0 ? 'FREE' : 'CHARGE',
  172. composer: form.composer,
  173. musicPrice: form.chargeType === 0 ? 0 : form.musicPrice,
  174. background: form.backgroundMp3s.map(item => ({
  175. audioFileUrl: form.hasBeat ? '' : form.bgmp3Url,
  176. track: item.track,
  177. metronomeUrl: form.hasBeat ? form.bgmp3Url : ''
  178. }))
  179. }
  180. },
  181. onFormatter(e: any) {
  182. e.target.value = verifyNumberIntegerAndFloat(e.target.value)
  183. },
  184. onSubmit() {
  185. ;(this as any).$refs.form.validate(async (valid: any) => {
  186. if (valid) {
  187. this.submitLoading = true
  188. console.log(this.createSubmitData(), 'createSubmitData')
  189. try {
  190. if (this.$route.query.id) {
  191. await request.post('/api-website/music/sheet/update', {
  192. data: {
  193. ...this.createSubmitData(),
  194. id: this.$route.query.id
  195. }
  196. })
  197. } else {
  198. await request.post('/api-website/music/sheet/create', {
  199. data: this.createSubmitData()
  200. })
  201. }
  202. this.submitLoading = false
  203. ElMessage.success('上传成功')
  204. sessionStorage.setItem('musicActiveName', 'DOING')
  205. this.$router.back()
  206. } catch (error) {
  207. this.submitLoading = false
  208. }
  209. } else {
  210. this.$nextTick(() => {
  211. const isError = document.getElementsByClassName('is-error')
  212. isError[0].scrollIntoView({
  213. block: 'center',
  214. behavior: 'smooth'
  215. })
  216. })
  217. return false
  218. }
  219. })
  220. },
  221. onDetail(type: string) {
  222. let url = `${getCodeBaseUrl('/teacher')}/#/registerProtocol`
  223. if (type === 'question') {
  224. url = `${getCodeBaseUrl('/teacher')}/muic-standard/question.html`
  225. } else if (type === 'music') {
  226. url = `${getCodeBaseUrl('/teacher')}/muic-standard/index.html`
  227. }
  228. window.open(url)
  229. }
  230. },
  231. render() {
  232. return (
  233. <div class={styles.form}>
  234. <div class="text-2xl font-semibold text-black leading-none px-6 py-5 ">
  235. {this.type === 'create' ? '新建曲谱' : '编辑曲谱'}
  236. </div>
  237. <ElForm
  238. size="large"
  239. labelPosition="left"
  240. labelWidth={'150px'}
  241. model={this.form}
  242. ref="form"
  243. class="px-7 py-5"
  244. >
  245. <div class={styles.tips}>
  246. <div class={styles.tipsTitle}>注意事项:</div>
  247. <div class={styles.tipsContent}>
  248. 1、必须是上传人自己参与制作的作品。
  249. <br />
  250. 2、歌曲及歌曲信息中请勿涉及政治、宗教、广告、涉毒、犯罪、色情、低俗、暴力、血腥、消极等违规内容,违反者直接删除内容。多次违反将封号。
  251. <br />
  252. 3、点击查看{' '}
  253. <span onClick={() => this.onDetail('protocol')}>
  254. 《用户注册协议》
  255. </span>
  256. ,如果您上传了文件,即认为您完全同意并遵守该协议的内容;
  257. </div>
  258. </div>
  259. <ElFormItem
  260. label="上传XML"
  261. prop="xmlFileUrl"
  262. rules={[{ required: true, message: '请选择MusicXML文件' }]}
  263. >
  264. <ColUpload
  265. v-model:modelValue={this.form.xmlFileUrl}
  266. bucket={'cloud-coach'}
  267. accept={'application/xml'}
  268. uploadType={'file'}
  269. extraTips="文件最大不能超过5MB"
  270. />
  271. </ElFormItem>
  272. <div class={styles.tips}>
  273. <div class={styles.tipsTitle}>曲谱审核标准:</div>
  274. <div class={styles.tipsContent}>
  275. 1、文件大小不要超过5MB,不符合版面规范的乐谱,审核未通过的不予上架,详情参考
  276. <span onClick={() => this.onDetail('music')}>
  277. 《曲谱排版规范》
  278. </span>
  279. ; 1、必须是上传人自己参与制作的作品。
  280. <br />
  281. 2、XML与MIDI文件内容必须一致,推荐使用Sibelius打谱软件。导出设置:导出XML-未压缩(*.xml)/导出MIDI:音色-其他回放设备General
  282. MIDI、MIDI、MIDI文件类型-类型0、不要勾选“将弱拍小节导出为具有休止符的完整小节”。点击查看
  283. <span onClick={() => this.onDetail('question')}>
  284. 《常见问题》
  285. </span>
  286. </div>
  287. </div>
  288. <ElFormItem
  289. label="播放类型"
  290. prop="audioType"
  291. rules={[{ required: true, message: '请选择播放类型' }]}
  292. >
  293. <ElRadioGroup v-model={this.form.audioType}>
  294. <ElRadioButton label={'MIDI'} class="mr-3 w-24">
  295. MIDI
  296. </ElRadioButton>
  297. <ElRadioButton label={'MP3'} class="w-24">
  298. MP3
  299. </ElRadioButton>
  300. </ElRadioGroup>
  301. </ElFormItem>
  302. {this.form.audioType === 'MP3' ? (
  303. <>
  304. <ElFormItem
  305. label="是否带节拍器"
  306. prop="hasBeat"
  307. rules={[{ required: true, message: '请选择是否带节拍器' }]}
  308. >
  309. <ElRadioGroup v-model={this.form.hasBeat}>
  310. <ElRadioButton label={0} class="mr-3 w-24">
  311. </ElRadioButton>
  312. <ElRadioButton label={1} class="w-24">
  313. </ElRadioButton>
  314. </ElRadioGroup>
  315. </ElFormItem>
  316. <ElFormItem
  317. label="伴奏类型"
  318. prop="accompanimentType"
  319. rules={[{ required: true, message: '请选择伴奏类型' }]}
  320. >
  321. <ElRadioGroup v-model={this.form.accompanimentType}>
  322. <ElRadioButton label={'HOMEMODE'} class="mr-3 w-24">
  323. 自制伴奏
  324. </ElRadioButton>
  325. <ElRadioButton label={'COMMON'} class="w-24">
  326. 普通伴奏
  327. </ElRadioButton>
  328. </ElRadioGroup>
  329. </ElFormItem>
  330. <ElFormItem label="伴奏文件" prop="mp3Url">
  331. <ColUpload
  332. v-model:modelValue={this.form.mp3Url}
  333. bucket={'cloud-coach'}
  334. accept={'.mp3'}
  335. uploadType={'file'}
  336. size={8}
  337. extraTips="文件最大不能超过8MB"
  338. />
  339. </ElFormItem>
  340. </>
  341. ) : (
  342. <>
  343. <ElFormItem
  344. label="伴奏类型"
  345. prop="accompanimentType"
  346. rules={[{ required: true, message: '请选择伴奏类型' }]}
  347. >
  348. <ElRadioGroup v-model={this.form.accompanimentType}>
  349. <ElRadioButton label={'HOMEMODE'} class="mr-3 w-24">
  350. 自制伴奏
  351. </ElRadioButton>
  352. <ElRadioButton label={'COMMON'} class="w-24">
  353. 普通伴奏
  354. </ElRadioButton>
  355. </ElRadioGroup>
  356. </ElFormItem>
  357. <ElFormItem
  358. label="MIDI文件"
  359. prop="midiUrl"
  360. rules={[{ required: true, message: '请选择MIDI文件' }]}
  361. >
  362. <ColUpload
  363. v-model:modelValue={this.form.midiUrl}
  364. bucket={'cloud-coach'}
  365. accept={'.midi'}
  366. uploadType={'file'}
  367. size={8}
  368. extraTips="文件最大不能超过8MB"
  369. />
  370. </ElFormItem>
  371. </>
  372. )}
  373. <div class={styles.tips}>
  374. <div class={styles.tipsContent}>
  375. 1、推荐上传自制伴奏,伴奏和谱面必须对齐。自制伴奏可以设置更高的收费标准。
  376. <br />
  377. 2、普通伴奏如果涉及到版权纠纷,根据
  378. <span onClick={() => this.onDetail('protocol')}>
  379. 《用户注册协议》
  380. </span>
  381. 平台有权进行下架处理。
  382. </div>
  383. </div>
  384. {this.form.audioType === 'MP3' && (
  385. <ElFormItem
  386. label="原音文件"
  387. prop="bgmp3Url"
  388. rules={[{ required: true, message: '请选择原音文件' }]}
  389. >
  390. <ColUpload
  391. v-model:modelValue={this.form.bgmp3Url}
  392. bucket={'cloud-coach'}
  393. accept={'.mp3'}
  394. uploadType={'file'}
  395. extraTips="文件最大不能超过8MB"
  396. />
  397. </ElFormItem>
  398. )}
  399. <ElFormItem
  400. label="曲目名称"
  401. prop="musicSheetName"
  402. rules={[{ required: true, message: '请输入曲目名称' }]}
  403. >
  404. <ElInput
  405. v-model={this.form.musicSheetName}
  406. placeholder="请选择曲目名称"
  407. />
  408. </ElFormItem>
  409. <div class={styles.tips}>
  410. <div class={styles.tipsContent}>
  411. 1、同一首曲目不可重复上传,如有不同版本统一用“()”补充。举例:人生的旋转木马(长笛二重奏版)。
  412. <br />
  413. 2、曲目名后可添加曲目信息备注,包含但不限于曲目类型等。曲目名《xxxx》,举例:人生的旋转木马《哈尔的移动城堡》(长笛二重奏版)
  414. <br />
  415. 3、其他信息不要写在曲目名里,如歌手、上传人员昵称等。
  416. </div>
  417. </div>
  418. <ElFormItem
  419. label="曲谱封面"
  420. prop="titleImg"
  421. rules={[
  422. {
  423. required: true,
  424. message: '请上传曲谱封面'
  425. }
  426. ]}
  427. >
  428. <ColCropper
  429. modelValue={this.form.titleImg}
  430. bucket={'cloud-coach'}
  431. cropUploadSuccess={(data: any) => {
  432. this.form.titleImg = data
  433. }}
  434. domSize={{ height: '150px' }}
  435. options={{
  436. title: '曲谱封面',
  437. enlarge: 2,
  438. autoCropWidth: 300,
  439. autoCropHeight: 300
  440. }}
  441. />
  442. </ElFormItem>
  443. <ElFormItem
  444. label="艺术家"
  445. prop="composer"
  446. rules={[{ required: true, message: '请输入艺术家' }]}
  447. >
  448. <ElInput v-model={this.form.composer} placeholder="请输入艺术家" />
  449. </ElFormItem>
  450. <ElFormItem
  451. label="曲目声部"
  452. prop="musicSubject"
  453. rules={[
  454. { required: true, message: '请选择曲目声部', trigger: 'change' }
  455. ]}
  456. >
  457. <ElSelect
  458. filterable
  459. v-model={this.form.musicSubject}
  460. placeholder="请选择曲目声部"
  461. class="w-full"
  462. >
  463. {this.subjectList.map((group: any) => (
  464. <ElOptionGroup key={group.id} label={group.name}>
  465. {group.subjects &&
  466. group.subjects.map((item: any) => (
  467. <ElOption
  468. key={item.id}
  469. value={item.id}
  470. label={item.name}
  471. />
  472. ))}
  473. </ElOptionGroup>
  474. ))}
  475. </ElSelect>
  476. </ElFormItem>
  477. <div class={styles.tips}>
  478. <div class={styles.tipsContent}>
  479. XML文件中,选择的曲目声部需要在总谱的置顶位置。
  480. </div>
  481. </div>
  482. <ElFormItem
  483. label="曲目标签"
  484. prop="tags"
  485. rules={[{ required: true, message: '请选择曲目标签' }]}
  486. >
  487. <div class="w-full relative">
  488. <div
  489. class=" w-full block h-[42px] absolute top-0 left-0 z-10"
  490. onClick={() => {
  491. console.log(111)
  492. this.tagStatus = true
  493. }}
  494. ></div>
  495. <ElSelect
  496. multiple
  497. v-model={this.form.tags}
  498. placeholder="请选择曲目标签"
  499. class="w-full"
  500. >
  501. {this.tagList.map((group: any) => (
  502. <ElOptionGroup key={group.id} label={group.name}>
  503. {group.children &&
  504. group.children.map((item: any) => (
  505. <ElOption
  506. key={item.id}
  507. value={item.id}
  508. label={item.name}
  509. />
  510. ))}
  511. </ElOptionGroup>
  512. ))}
  513. </ElSelect>
  514. </div>
  515. </ElFormItem>
  516. <ElFormItem
  517. label="支持简谱"
  518. prop="notation"
  519. rules={[{ required: true, message: '请选择是否支持简谱' }]}
  520. >
  521. <ElRadioGroup v-model={this.form.notation}>
  522. <ElRadioButton label={0} class="mr-3 w-24">
  523. </ElRadioButton>
  524. <ElRadioButton label={1} class="w-24">
  525. </ElRadioButton>
  526. </ElRadioGroup>
  527. </ElFormItem>
  528. <ElFormItem
  529. label="是否评测"
  530. prop="canEvaluate"
  531. rules={[{ required: true, message: '请选择是否评测' }]}
  532. >
  533. <ElRadioGroup v-model={this.form.canEvaluate}>
  534. <ElRadioButton label={0} class="mr-3 w-24">
  535. </ElRadioButton>
  536. <ElRadioButton label={1} class="w-24">
  537. </ElRadioButton>
  538. </ElRadioGroup>
  539. </ElFormItem>
  540. <ElFormItem
  541. label="指法展示"
  542. prop="showFingering"
  543. rules={[{ required: true, message: '请选择指法展示' }]}
  544. >
  545. <ElRadioGroup v-model={this.form.showFingering}>
  546. <ElRadioButton label={0} class="mr-3 w-24">
  547. </ElRadioButton>
  548. <ElRadioButton label={1} class="w-24">
  549. </ElRadioButton>
  550. </ElRadioGroup>
  551. </ElFormItem>
  552. <ElFormItem
  553. label="是否收费"
  554. prop="chargeType"
  555. rules={[{ required: true, message: '请选择是否收费' }]}
  556. >
  557. <ElRadioGroup v-model={this.form.chargeType}>
  558. <ElRadioButton label={0} class="mr-3 w-24">
  559. </ElRadioButton>
  560. <ElRadioButton label={2} class="w-24">
  561. </ElRadioButton>
  562. </ElRadioGroup>
  563. </ElFormItem>
  564. {this.form.chargeType === 2 && (
  565. <>
  566. <ElFormItem
  567. label="收费价格"
  568. prop="musicPrice"
  569. rules={[{ required: true, validator }]}
  570. >
  571. <ElInput
  572. v-model={this.form.musicPrice}
  573. placeholder="请输入收费价格"
  574. // @ts-ignore
  575. maxlength={5}
  576. onKeyup={this.onFormatter}
  577. v-slots={{
  578. suffix: () => <span class="text-base text-[#999]">元</span>
  579. }}
  580. />
  581. </ElFormItem>
  582. <ElFormItem>
  583. <div class={styles.rule}>
  584. <p>扣除手续费后该曲目预计收入为:</p>
  585. <p>
  586. 每人:
  587. <span>
  588. {((parseFloat(this.form.musicPrice || '0') || 0) *
  589. (100 - this.music_sheet_service_fee)) /
  590. 100}
  591. </span>
  592. 元/人
  593. </p>
  594. <p>您的乐谱收入将在学员购买后结算到您的账户中</p>
  595. </div>
  596. </ElFormItem>
  597. </>
  598. )}
  599. </ElForm>
  600. <div class="text-center pt-6 pb-7">
  601. <ElButton
  602. class="!w-44 !h-[48px]"
  603. round
  604. onClick={() => {
  605. this.$router.back()
  606. }}
  607. >
  608. 取消
  609. </ElButton>
  610. <ElButton
  611. type="primary"
  612. class="!w-44 !h-[48px]"
  613. round
  614. onClick={this.onSubmit}
  615. loading={this.submitLoading}
  616. >
  617. 提交审核
  618. </ElButton>
  619. </div>
  620. <ElDialog
  621. modelValue={this.tagStatus}
  622. onUpdate:modelValue={val => (this.tagStatus = val)}
  623. width="35%"
  624. title="全部标签"
  625. >
  626. {this.tagList.map((item: any, index: number) => (
  627. <div class={[styles.tags, 'py-2']}>
  628. <div class="text-sm pb-2">{item.name}</div>
  629. {item.children.map((child: any) => (
  630. <ElRadioGroup v-model={this.radioList[index]} class="pb-2">
  631. <ElRadioButton label={child.id} class="mr-3">
  632. {child.name}
  633. </ElRadioButton>
  634. </ElRadioGroup>
  635. ))}
  636. </div>
  637. ))}
  638. <div class="text-center pt-2">
  639. <ElButton
  640. class="!w-36 !h-[48px]"
  641. round
  642. size="large"
  643. onClick={() => {
  644. this.radioList = []
  645. }}
  646. >
  647. 重置
  648. </ElButton>
  649. <ElButton
  650. class="!w-36 !h-[48px]"
  651. round
  652. size="large"
  653. type="primary"
  654. onClick={() => {
  655. this.form.tags = this.radioList.filter((el: any) => {
  656. return el != ''
  657. })
  658. this.tagStatus = false
  659. ;(this as any).$refs.form.clearValidate('tags')
  660. }}
  661. >
  662. 确认
  663. </ElButton>
  664. </div>
  665. </ElDialog>
  666. </div>
  667. )
  668. }
  669. })