|
@@ -1,32 +1,13 @@
|
|
|
-import {
|
|
|
- NForm,
|
|
|
- NFormItem,
|
|
|
- NInput,
|
|
|
- NSelect,
|
|
|
- NSpace,
|
|
|
- NButton,
|
|
|
- useMessage,
|
|
|
- NRadioGroup,
|
|
|
- NRadio,
|
|
|
- NGrid,
|
|
|
- NFormItemGi,
|
|
|
- NInputNumber,
|
|
|
- NGi,
|
|
|
- useDialog,
|
|
|
- NCascader,
|
|
|
- NAlert,
|
|
|
- NInputGroup,
|
|
|
- NInputGroupLabel, NCheckbox
|
|
|
-} from 'naive-ui'
|
|
|
import type {SelectOption} from 'naive-ui'
|
|
|
+import {NAlert, NButton, NCascader, NCheckbox, NForm, NFormItemGi, NGi, NGrid, NInput, NInputNumber, NRadio, NRadioGroup, NSelect, NSpace, useDialog, useMessage} from 'naive-ui'
|
|
|
import {defineComponent, onMounted, PropType, reactive, ref} from 'vue'
|
|
|
import {musicSheetDetail, musicSheetSave, musicSheetUpdate} from '../../api'
|
|
|
import UploadFile from '@/components/upload-file'
|
|
|
import styles from './index.module.less'
|
|
|
import deepClone from '@/utils/deep.clone'
|
|
|
import axios from 'axios'
|
|
|
-import {Checkbox, CheckboxGroup} from "vant";
|
|
|
-import {releaseCandidate} from "@/utils/constant";
|
|
|
+import {CheckboxGroup} from "vant";
|
|
|
+import {musicSheetSourceType, musicSheetType} from "@/utils/constant";
|
|
|
import {getSelectDataFromObj} from "@/utils/objectUtil";
|
|
|
|
|
|
/**
|
|
@@ -99,8 +80,7 @@ export const onlyVisible = (xml: any, partIndex: any) => {
|
|
|
break
|
|
|
}
|
|
|
}
|
|
|
- const nextNoteDuration = nextNote?.getElementsByTagName('duration')[0]
|
|
|
- return nextNoteDuration
|
|
|
+ return nextNote?.getElementsByTagName('duration')[0]
|
|
|
}
|
|
|
Array.from(notes).forEach((note, i) => {
|
|
|
const graces = note.getElementsByTagName('grace')
|
|
@@ -270,35 +250,35 @@ export default defineComponent({
|
|
|
setup(props, {slots, attrs, emit}) {
|
|
|
const forms = reactive({
|
|
|
graduals: {} as any, // 渐变速度
|
|
|
- audioType: 'MP3', // 播放类型
|
|
|
- mp3Type: 'MP3', // 是否含节拍器
|
|
|
+ playMode: 'MP3', // 播放类型
|
|
|
xmlFileUrl: null, // XML
|
|
|
midiUrl: null, // mid
|
|
|
metronomeUrl: null, // 伴奏 根据mp3Type 是否是为包含节拍器
|
|
|
- musicSheetName: null, // 曲目名称
|
|
|
+ name: null, // 曲目名称
|
|
|
musicTag: [] as any, // 曲目标签
|
|
|
composer: null, // 音乐人
|
|
|
playSpeed: null, // 曲谱速度
|
|
|
showFingering: null as any, // 是否显示指法
|
|
|
canEvaluate: null as any, // 是否评测
|
|
|
- musicSubject: null as any, // 可用声部
|
|
|
+ subjectIds: null as any, // 可用声部
|
|
|
notation: null as any, // 能否转和简谱
|
|
|
auditVersion: null as any, // 审核版本
|
|
|
- accompanimentType: 1, // 伴奏类型
|
|
|
+ audioType: 'HOMEMODE', // 伴奏类型
|
|
|
sortNumber: null, // 排序
|
|
|
- titleImg: null, // 曲谱封面
|
|
|
+ musicCover: null, // 曲谱封面
|
|
|
remark: null, // 曲谱描述
|
|
|
background: [] as any, // 原音
|
|
|
musicSheetCategoriesId: null,
|
|
|
status: false,
|
|
|
- musicSheetType: 'SINGLE' as 'SINGLE' | 'CONCERT',
|
|
|
- author: null, //音乐人
|
|
|
- authorFrom: undefined,
|
|
|
- belongTo: undefined,
|
|
|
- speed: undefined,
|
|
|
- playMetronome: 1,
|
|
|
+ musicSheetType: null, // 曲目类型
|
|
|
+ sourceType: undefined,
|
|
|
+ userId: null, // 所属人
|
|
|
+ isPlayBeat: 1, // 是否播放节拍器
|
|
|
playStyle: undefined, // 播放方式
|
|
|
- releaseCandidate: 'NO' // 是否审核版本
|
|
|
+ appAuditFlag: false, // 是否审核版本
|
|
|
+ midiFileUrl: null, // 伴奏文件
|
|
|
+ musicalInstrumentIds: null, //可用乐器
|
|
|
+ musicCategoryId: null, //曲目分类
|
|
|
})
|
|
|
const state = reactive({
|
|
|
tagList: [...props.tagList] as any, // 标签列表
|
|
@@ -460,22 +440,20 @@ export default defineComponent({
|
|
|
try {
|
|
|
const {data} = await musicSheetDetail({id: detail.id})
|
|
|
forms.audioType = data.audioType
|
|
|
- forms.mp3Type = data.mp3Type
|
|
|
+ forms.playMode = data.playMode
|
|
|
forms.xmlFileUrl = data.xmlFileUrl
|
|
|
forms.midiUrl = data.midiUrl
|
|
|
forms.metronomeUrl = data.metronomeUrl
|
|
|
- forms.musicSheetName = data.musicSheetName
|
|
|
+ forms.name = data.name
|
|
|
forms.musicTag = data.musicTag?.split(',')
|
|
|
forms.composer = data.composer
|
|
|
forms.playSpeed = data.playSpeed
|
|
|
forms.showFingering = Number(data.showFingering)
|
|
|
forms.canEvaluate = Number(data.canEvaluate)
|
|
|
- forms.musicSubject = data.musicSubject ? Number(data.musicSubject) : null
|
|
|
forms.notation = Number(data.notation)
|
|
|
forms.auditVersion = Number(data.auditVersion)
|
|
|
- forms.accompanimentType = data.accompanimentType
|
|
|
forms.sortNumber = data.sortNumber
|
|
|
- forms.titleImg = data.titleImg
|
|
|
+ forms.musicCover = data.musicCover
|
|
|
forms.remark = data.remark
|
|
|
forms.status = data.status
|
|
|
forms.musicSheetCategoriesId = data.musicSheetCategoriesId
|
|
@@ -510,11 +488,11 @@ export default defineComponent({
|
|
|
label-placement="left"
|
|
|
label-width="130"
|
|
|
>
|
|
|
- <NAlert showIcon={false} style={{marginBottom:"12px" }}>曲目信息</NAlert>
|
|
|
+ <NAlert showIcon={false} style={{marginBottom: "12px"}}>曲目信息</NAlert>
|
|
|
<NGrid cols={2}>
|
|
|
<NFormItemGi
|
|
|
label="曲目名称"
|
|
|
- path="musicSheetName"
|
|
|
+ path="name"
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
@@ -522,11 +500,16 @@ export default defineComponent({
|
|
|
}
|
|
|
]}
|
|
|
>
|
|
|
- <NInput v-model:value={forms.musicSheetName} placeholder="请输入曲目名称"/>
|
|
|
+ <NInput
|
|
|
+ v-model:value={forms.name}
|
|
|
+ placeholder="请输入曲目名称"
|
|
|
+ maxlength={120}
|
|
|
+ showCount
|
|
|
+ />
|
|
|
</NFormItemGi>
|
|
|
<NFormItemGi
|
|
|
label="音乐人"
|
|
|
- path="author"
|
|
|
+ path="composer"
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
@@ -534,7 +517,8 @@ export default defineComponent({
|
|
|
}
|
|
|
]}
|
|
|
>
|
|
|
- <NInput v-model:value={forms.author} placeholder="请输入音乐人"
|
|
|
+ <NInput v-model:value={forms.composer}
|
|
|
+ placeholder="请输入音乐人名称"
|
|
|
showCount
|
|
|
maxlength={14}
|
|
|
/>
|
|
@@ -551,7 +535,7 @@ export default defineComponent({
|
|
|
v-model:value={forms.remark}
|
|
|
/>
|
|
|
</NFormItemGi>
|
|
|
- <NFormItemGi label="曲谱封面" path="titleImg"
|
|
|
+ <NFormItemGi label="曲目封面" path="musicCover"
|
|
|
rule={[
|
|
|
{
|
|
|
required: true
|
|
@@ -559,10 +543,11 @@ export default defineComponent({
|
|
|
]}>
|
|
|
<UploadFile
|
|
|
accept=".jpg,.jpeg,.png"
|
|
|
- tips="请上传大小2M以内的JPG、PNG图片"
|
|
|
- v-model:fileList={forms.titleImg}
|
|
|
+ tips="请上传大小1M以内的JPG、PNG图片"
|
|
|
+ size={1}
|
|
|
+ v-model:fileList={forms.musicCover}
|
|
|
cropper
|
|
|
- bucketName="cloud-coach"
|
|
|
+ bucketName="cbs"
|
|
|
options={{
|
|
|
autoCrop: true, //是否默认生成截图框
|
|
|
enlarge: 2, // 图片放大倍数
|
|
@@ -570,7 +555,7 @@ export default defineComponent({
|
|
|
fixedBox: true, //是否固定截图框大认生成截图框宽度
|
|
|
autoCropHeight: 200, //默认生成截图小 不允许改变
|
|
|
previewsCircle: false, //预览图是否是原圆形
|
|
|
- title: '曲谱封面'
|
|
|
+ title: '曲目封面'
|
|
|
}}
|
|
|
/>
|
|
|
</NFormItemGi>
|
|
@@ -586,15 +571,17 @@ export default defineComponent({
|
|
|
}
|
|
|
]}
|
|
|
>
|
|
|
- <NRadioGroup v-model:value={forms.musicSheetType}>
|
|
|
- <NRadio value="SINGLE">独奏</NRadio>
|
|
|
- <NRadio value="CONCERT">合奏</NRadio>
|
|
|
- </NRadioGroup>
|
|
|
+ <NSelect
|
|
|
+ placeholder="请选择曲目类型"
|
|
|
+ v-model:value={forms.musicSheetType}
|
|
|
+ options={getSelectDataFromObj(musicSheetType)}
|
|
|
+ clearable
|
|
|
+ />
|
|
|
</NFormItemGi>
|
|
|
|
|
|
<NFormItemGi
|
|
|
label="作者属性"
|
|
|
- path="authorFrom"
|
|
|
+ path="sourceType"
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
@@ -603,24 +590,8 @@ export default defineComponent({
|
|
|
]}
|
|
|
>
|
|
|
<NSelect
|
|
|
- v-model:value={forms.authorFrom}
|
|
|
- options={
|
|
|
- [
|
|
|
- {
|
|
|
- label: '平台',
|
|
|
- value: 'PALTFORM'
|
|
|
- },
|
|
|
- {
|
|
|
- label: '机构',
|
|
|
- value: 'TENANT'
|
|
|
- },
|
|
|
- {
|
|
|
- label: '个人',
|
|
|
- value: 'SELF'
|
|
|
- }
|
|
|
- ] as any
|
|
|
- }
|
|
|
- filterable
|
|
|
+ v-model:value={forms.sourceType}
|
|
|
+ options={getSelectDataFromObj(musicSheetSourceType)}
|
|
|
clearable
|
|
|
placeholder="请选择作者属性"
|
|
|
/>
|
|
@@ -630,7 +601,7 @@ export default defineComponent({
|
|
|
<NGrid cols={2}>
|
|
|
<NFormItemGi
|
|
|
label="所属人"
|
|
|
- path="belongTo"
|
|
|
+ path="userId"
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
@@ -639,12 +610,12 @@ export default defineComponent({
|
|
|
]}
|
|
|
>
|
|
|
<NSelect
|
|
|
- v-model:value={forms.belongTo}
|
|
|
+ v-model:value={forms.userId}
|
|
|
options={
|
|
|
[
|
|
|
{
|
|
|
label: '小A',
|
|
|
- value: '小A'
|
|
|
+ value: '小B'
|
|
|
}
|
|
|
] as any
|
|
|
}
|
|
@@ -653,25 +624,47 @@ export default defineComponent({
|
|
|
placeholder="请选择曲目所属人"
|
|
|
/>
|
|
|
</NFormItemGi>
|
|
|
- <NFormItemGi label="速度" path="speed">
|
|
|
+ <NFormItemGi label="速度" path="playSpeed">
|
|
|
<NInputNumber
|
|
|
placeholder="请输入速度"
|
|
|
- v-model:value={forms.speed}
|
|
|
+ v-model:value={forms.playSpeed}
|
|
|
+ style="width:100%"
|
|
|
/>
|
|
|
</NFormItemGi>
|
|
|
</NGrid>
|
|
|
<NGrid cols={2}>
|
|
|
<NFormItemGi label="审核版本" path="speed">
|
|
|
<NSelect
|
|
|
- options={getSelectDataFromObj(releaseCandidate)}
|
|
|
- v-model:value={forms.releaseCandidate}
|
|
|
- defaultValue={'NO'}
|
|
|
+ options={
|
|
|
+ [
|
|
|
+ {
|
|
|
+ label: '是',
|
|
|
+ value: true
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '否',
|
|
|
+ value: false
|
|
|
+ }
|
|
|
+ ] as any
|
|
|
+ }
|
|
|
+ v-model:value={forms.appAuditFlag}
|
|
|
+ />
|
|
|
+ </NFormItemGi>
|
|
|
+ <NFormItemGi label="曲目分类" path="musicSheetCategories">
|
|
|
+ <NCascader
|
|
|
+ valueField="id"
|
|
|
+ labelField="name"
|
|
|
+ children-field="musicSheetCategoriesList"
|
|
|
+ placeholder="请选择分类"
|
|
|
+ v-model:value={forms.musicSheetCategoriesId}
|
|
|
+ options={state.musicSheetCategories}
|
|
|
+ clearable
|
|
|
/>
|
|
|
</NFormItemGi>
|
|
|
</NGrid>
|
|
|
- <NAlert showIcon={false} style={{marginBottom:"12px" }}>曲目上传</NAlert>
|
|
|
+ <NAlert showIcon={false} style={{marginBottom: "12px"}}>曲目上传</NAlert>
|
|
|
<NGrid cols={2}>
|
|
|
- <NFormItemGi label="播放模式" path="audioType"
|
|
|
+ <NFormItemGi label="播放模式" path="playMode"
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
@@ -680,12 +673,12 @@ export default defineComponent({
|
|
|
]}
|
|
|
>
|
|
|
<NRadioGroup
|
|
|
- v-model:value={forms.audioType}
|
|
|
+ v-model:value={forms.playMode}
|
|
|
onUpdateValue={(value: string | number | boolean) => {
|
|
|
if (value === 'MP3') {
|
|
|
- forms.mp3Type = 'MP3'
|
|
|
+ forms.playMode = 'MP3'
|
|
|
} else {
|
|
|
- forms.mp3Type = 'MIDI'
|
|
|
+ forms.playMode = 'MIDI'
|
|
|
}
|
|
|
}}
|
|
|
>
|
|
@@ -693,7 +686,7 @@ export default defineComponent({
|
|
|
<NRadio value="MIDI">MIDI</NRadio>
|
|
|
</NRadioGroup>
|
|
|
</NFormItemGi>
|
|
|
- {forms.mp3Type === 'MP3' && (
|
|
|
+ {forms.playMode === 'MP3' && (
|
|
|
<NFormItemGi
|
|
|
label="伴奏类型"
|
|
|
path="audioType"
|
|
@@ -704,19 +697,19 @@ export default defineComponent({
|
|
|
]}
|
|
|
>
|
|
|
<NRadioGroup
|
|
|
- v-model:value={forms.accompanimentType}
|
|
|
+ v-model:value={forms.audioType}
|
|
|
>
|
|
|
- <NRadio value={1}>自制伴奏</NRadio>
|
|
|
- <NRadio value={2}>普通伴奏</NRadio>
|
|
|
+ <NRadio value={'HOMEMODE'}>自制伴奏</NRadio>
|
|
|
+ <NRadio value={'COMMON'}>普通伴奏</NRadio>
|
|
|
</NRadioGroup>
|
|
|
</NFormItemGi>
|
|
|
)}
|
|
|
</NGrid>
|
|
|
<NGrid cols={2}>
|
|
|
- {forms.mp3Type === 'MP3' && (
|
|
|
+ {forms.playMode === 'MP3' && (
|
|
|
<NFormItemGi
|
|
|
label="上传伴奏"
|
|
|
- path="xmlFileUrl"
|
|
|
+ path="midiFileUrl"
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
@@ -726,7 +719,7 @@ export default defineComponent({
|
|
|
>
|
|
|
<UploadFile
|
|
|
size={10}
|
|
|
- v-model:fileList={forms.xmlFileUrl}
|
|
|
+ v-model:fileList={forms.midiFileUrl}
|
|
|
tips="仅支持上传.mp3/.aac格式文件"
|
|
|
listType="image"
|
|
|
accept=".mp3,.aac"
|
|
@@ -736,10 +729,10 @@ export default defineComponent({
|
|
|
/>
|
|
|
</NFormItemGi>
|
|
|
)}
|
|
|
- {forms.mp3Type === 'MIDI' && (
|
|
|
+ {forms.playMode === 'MIDI' && (
|
|
|
<NFormItemGi
|
|
|
label="上传MIDI"
|
|
|
- path="xmlFileUrl"
|
|
|
+ path="midiFileUrl"
|
|
|
rule={[
|
|
|
{
|
|
|
required: true,
|
|
@@ -749,7 +742,7 @@ export default defineComponent({
|
|
|
>
|
|
|
<UploadFile
|
|
|
size={10}
|
|
|
- v-model:fileList={forms.xmlFileUrl}
|
|
|
+ v-model:fileList={forms.midiFileUrl}
|
|
|
tips="仅支持上传.MIDI格式文件"
|
|
|
listType="image"
|
|
|
accept=".mp3,.aac"
|
|
@@ -792,7 +785,7 @@ export default defineComponent({
|
|
|
]}
|
|
|
>
|
|
|
<NSelect
|
|
|
- v-model:value={forms.musicSubject}
|
|
|
+ v-model:value={forms.subjectIds}
|
|
|
options={props.subjectList}
|
|
|
multiple
|
|
|
filterable
|
|
@@ -800,7 +793,7 @@ export default defineComponent({
|
|
|
placeholder="请选择可用声部"
|
|
|
/>
|
|
|
</NFormItemGi>
|
|
|
- { (forms.mp3Type === 'MP3' || forms.musicSheetType === 'SINGLE') && (
|
|
|
+ {(forms.playMode === 'MP3' || forms.musicSheetType === 'SINGLE') && (
|
|
|
<NFormItemGi
|
|
|
label="页面渲染声轨"
|
|
|
path="audioType"
|
|
@@ -819,7 +812,7 @@ export default defineComponent({
|
|
|
</CheckboxGroup>
|
|
|
</NFormItemGi>
|
|
|
)}
|
|
|
- {forms.mp3Type === 'MIDI' && forms.musicSheetType === 'CONCERT' && (
|
|
|
+ {forms.playMode === 'MIDI' && forms.musicSheetType === 'CONCERT' && (
|
|
|
<NFormItemGi
|
|
|
label="用户可切换声轨"
|
|
|
path="audioType"
|
|
@@ -842,6 +835,23 @@ export default defineComponent({
|
|
|
</NGrid>
|
|
|
|
|
|
<NGrid cols={2}>
|
|
|
+ <NFormItemGi label="可用乐器" path="audioType"
|
|
|
+ rule={[
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: '请选择可用乐器'
|
|
|
+ }
|
|
|
+ ]}
|
|
|
+ >
|
|
|
+ <NSelect
|
|
|
+ options={
|
|
|
+ [] as any
|
|
|
+ }
|
|
|
+ v-model:value={forms.musicalInstrumentIds}
|
|
|
+ />
|
|
|
+ </NFormItemGi>
|
|
|
+ </NGrid>
|
|
|
+ <NGrid cols={2}>
|
|
|
<NFormItemGi label="是否播放节拍器" path="audioType"
|
|
|
rule={[
|
|
|
{
|
|
@@ -851,13 +861,13 @@ export default defineComponent({
|
|
|
]}
|
|
|
>
|
|
|
<NRadioGroup
|
|
|
- v-model:value={forms.playMetronome}
|
|
|
+ v-model:value={forms.isPlayBeat}
|
|
|
>
|
|
|
<NRadio value={1}>是</NRadio>
|
|
|
<NRadio value={0}>否</NRadio>
|
|
|
</NRadioGroup>
|
|
|
</NFormItemGi>
|
|
|
- {forms.playMetronome && (
|
|
|
+ {forms.isPlayBeat && (
|
|
|
<NFormItemGi label="播放方式" path="audioType"
|
|
|
rule={[
|
|
|
{
|
|
@@ -876,7 +886,7 @@ export default defineComponent({
|
|
|
)}
|
|
|
</NGrid>
|
|
|
{/* 只有播放类型为mp3时才会有原音 */}
|
|
|
- {forms.audioType === 'MP3' && (
|
|
|
+ {forms.playMode === 'MP3' && (
|
|
|
<>
|
|
|
{forms.background.map((item: any, index: number) => (
|
|
|
<>
|
|
@@ -954,7 +964,7 @@ export default defineComponent({
|
|
|
|
|
|
{props.type !== 'preview' &&
|
|
|
(
|
|
|
- <NSpace justify="end">
|
|
|
+ <NSpace justify="end" style="padding-top:12px">
|
|
|
<NButton type="default" onClick={() => emit('close')}>
|
|
|
取消
|
|
|
</NButton>
|