|
@@ -2,45 +2,98 @@
|
|
|
<div>
|
|
|
<el-form ref="form" :model="form" label-width="100px">
|
|
|
<el-form-item
|
|
|
- prop="name"
|
|
|
- label="伴奏名称"
|
|
|
- :rules="[{required: true, message: '请输入伴奏名称'}]"
|
|
|
+ prop="sysMusicScore.name"
|
|
|
+ label="曲名"
|
|
|
+ :rules="[{required: true, message: '请输入曲名'}]"
|
|
|
>
|
|
|
- <el-input placeholder="请输入伴奏名称" v-model="form.name"/>
|
|
|
+ <el-input placeholder="请输入曲名" v-model="form.sysMusicScore.name"/>
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
- prop="subjectIds"
|
|
|
- label="伴奏声部"
|
|
|
- :rules="[{required: true, message: '请选择伴奏声部'}]"
|
|
|
+ prop="sysMusicScore.musicScoreCategoriesId"
|
|
|
+ label="分类"
|
|
|
+ :rules="[{required: true, message: '请选择分类'}]"
|
|
|
>
|
|
|
- <el-select style="width: 100%!important;" collapse-tags multiple v-model="form.subjectIds" placeholder="请选择伴奏声部">
|
|
|
- <el-option v-for="item in selects.subjects" :value="String(item.id)" :label="item.name" :key="item.id"></el-option>
|
|
|
- </el-select>
|
|
|
+ <el-cascader v-model="form.sysMusicScore.musicScoreCategoriesId"
|
|
|
+ style="width:100%"
|
|
|
+ :options="tree"
|
|
|
+ placeholder="请选择分类"
|
|
|
+ :props="treeProps"></el-cascader>
|
|
|
+ <!-- <el-select style="width: 100%!important;" v-model="form.sysMusicScore.musicScoreCategoriesId" placeholder="请选择声部">
|
|
|
+ <el-option
|
|
|
+ v-for="item in selects.subjects"
|
|
|
+ :value="item.id"
|
|
|
+ :label="item.name"
|
|
|
+ :key="item.id"
|
|
|
+ ></el-option>
|
|
|
+ </el-select> -->
|
|
|
</el-form-item>
|
|
|
<el-form-item
|
|
|
- prop="speed"
|
|
|
- label="伴奏速度"
|
|
|
- :rules="[{required: true, message: '请输入伴奏速度'}]"
|
|
|
+ label="原音"
|
|
|
+ prop="sysMusicScore.url"
|
|
|
>
|
|
|
- <el-input type="number" placeholder="请输入伴奏速度" v-model="form.speed"/>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item
|
|
|
- label="伴奏文件"
|
|
|
- prop="url"
|
|
|
- :rules="[{required: true, message: '请选择伴奏文件'}]"
|
|
|
- >
|
|
|
- <el-upload
|
|
|
- action="/api-web/uploadFile"
|
|
|
- :headers="headers"
|
|
|
- :on-success="success"
|
|
|
- :on-remove="remove"
|
|
|
- :limit="1"
|
|
|
- :file-list="filelist"
|
|
|
- accept=".mp3, .aac">
|
|
|
- <el-button size="small" type="primary" plain>点击上传</el-button>
|
|
|
- <div slot="tip" class="el-upload__tip">仅支持上传 mp3/aac 格式音频文件</div>
|
|
|
- </el-upload>
|
|
|
+ <singe-file-upload
|
|
|
+ tips="仅支持上传 mp3/aac 格式音频文件"
|
|
|
+ accept=".mp3, .aac"
|
|
|
+ v-model="form.sysMusicScore.url"
|
|
|
+ />
|
|
|
</el-form-item>
|
|
|
+ <div class="files" v-for="(song, index) in form.sysMusicScoreAccompaniments" :key="index">
|
|
|
+ <el-row>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item
|
|
|
+ :prop="`sysMusicScoreAccompaniments.${index}.subjectId`"
|
|
|
+ label="声部"
|
|
|
+ :rules="[{required: true, message: '请选择声部'}]"
|
|
|
+ >
|
|
|
+ <el-select style="width: 100%!important;" v-model="song.subjectId" placeholder="请选择声部">
|
|
|
+ <el-option
|
|
|
+ v-for="item in selects.subjects"
|
|
|
+ :value="item.id"
|
|
|
+ :label="item.name"
|
|
|
+ :key="item.id"
|
|
|
+ :disabled="hasSubjectId(item.id)"
|
|
|
+ ></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item
|
|
|
+ :prop="`sysMusicScoreAccompaniments.${index}.speed`"
|
|
|
+ label="速度"
|
|
|
+ :rules="[{required: true, message: '请输入速度'}]"
|
|
|
+ >
|
|
|
+ <el-input type="number" placeholder="请输入速度" v-model="song.speed"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item
|
|
|
+ label="mp3文件"
|
|
|
+ :prop="`sysMusicScoreAccompaniments.${index}.mp3Url`"
|
|
|
+ >
|
|
|
+ <singe-file-upload
|
|
|
+ tips="仅支持上传 mp3/aac 格式音频文件"
|
|
|
+ accept=".mp3, .aac"
|
|
|
+ v-model="song.mp3Url"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item
|
|
|
+ label="MusicXML"
|
|
|
+ :prop="`sysMusicScoreAccompaniments.${index}.xmlUrl`"
|
|
|
+ :rules="[{required: true, message: '请选择MusicXML文件'}]"
|
|
|
+ >
|
|
|
+ <singe-file-upload
|
|
|
+ tips="仅支持上传 xml 格式文件"
|
|
|
+ accept=".xml"
|
|
|
+ v-model="song.xmlUrl"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-button class="file-remove" type="text" @click="removeSys(index)" :disabled="form.sysMusicScoreAccompaniments.length == 1">删除</el-button>
|
|
|
+ </div>
|
|
|
+ <el-button @click="createSys" type="info" style="width: 100%;margin-bottom: 20px;" plain>添加伴奏</el-button>
|
|
|
<div class="btns">
|
|
|
<el-button type="primary" @click="submit">提交</el-button>
|
|
|
<el-button @click="$listeners.close">取消</el-button>
|
|
@@ -49,57 +102,101 @@
|
|
|
</div>
|
|
|
</template>
|
|
|
<script>
|
|
|
-import { getToken } from "@/utils/auth"
|
|
|
-import { Add, Update } from '../api'
|
|
|
+import { Add, Update, queryPageSysExam, queryTree } from '../api'
|
|
|
export default {
|
|
|
props: ['detail', 'type'],
|
|
|
data() {
|
|
|
return {
|
|
|
- headers: {
|
|
|
- Authorization: getToken()
|
|
|
- },
|
|
|
- filelist: [],
|
|
|
+ tree: [],
|
|
|
form: {
|
|
|
- name: '',
|
|
|
- subjectIds: [],
|
|
|
- speed: '',
|
|
|
- url: ''
|
|
|
+ sysMusicScore: {
|
|
|
+ name: '',
|
|
|
+ url: '',
|
|
|
+ musicScoreCategoriesId: [],
|
|
|
+ },
|
|
|
+ sysMusicScoreAccompaniments: [
|
|
|
+ {
|
|
|
+ subjectId: '',
|
|
|
+ speed: '',
|
|
|
+ mp3Url: '',
|
|
|
+ xmlUrl: ''
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ delExamSongAccompanimentIds: []
|
|
|
+ },
|
|
|
+ treeProps: {
|
|
|
+ value: 'id',
|
|
|
+ label: 'name',
|
|
|
+ children: 'sysMusicScoreCategoriesList',
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
- mounted() {
|
|
|
+ async mounted() {
|
|
|
this.$store.dispatch('setSubjects')
|
|
|
+ await this.FetchTree()
|
|
|
if (this.detail) {
|
|
|
- for (const key in this.form) {
|
|
|
- if (this.form.hasOwnProperty(key)) {
|
|
|
- if (key === 'subjectIds') {
|
|
|
- this.$set(this.form, 'subjectIds', (this.detail[key] || '').split(','))
|
|
|
- } else {
|
|
|
- this.$set(this.form, key, this.detail[key])
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- this.filelist = [{
|
|
|
- name: this.detail.url,
|
|
|
+ this.$set(this.form, 'sysMusicScore', {
|
|
|
+ name: this.detail.name,
|
|
|
url: this.detail.url,
|
|
|
- }]
|
|
|
+ musicScoreCategoriesId: this.detail.categoriesId ? this.formatParentId(this.detail.categoriesId, this.tree) : [],
|
|
|
+ })
|
|
|
+ this.FeatchDetailList()
|
|
|
}
|
|
|
},
|
|
|
methods: {
|
|
|
- remove() {
|
|
|
- this.filelist = []
|
|
|
- this.$set(this.form, 'url', '')
|
|
|
+ formatParentId(id, list, ids = []) {
|
|
|
+ for (const item of list) {
|
|
|
+ if (item.sysMusicScoreCategoriesList) {
|
|
|
+ return this.formatParentId(id, item.sysMusicScoreCategoriesList, [...ids, item.id])
|
|
|
+ }
|
|
|
+ if (item.id === id) {
|
|
|
+ return [...ids, id]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return ids
|
|
|
+ },
|
|
|
+ async FetchTree() {
|
|
|
+ try {
|
|
|
+ const res = await queryTree()
|
|
|
+ this.tree = res.data
|
|
|
+ } catch (error) {
|
|
|
+ console.log(error)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ async FeatchDetailList() {
|
|
|
+ try {
|
|
|
+ const res = await queryPageSysExam({
|
|
|
+ sysMusicScoreId: this.detail.id
|
|
|
+ })
|
|
|
+ this.$set(this.form, 'sysMusicScoreAccompaniments', res.data)
|
|
|
+ } catch (error) {}
|
|
|
+ },
|
|
|
+ createSys() {
|
|
|
+ this.form.sysMusicScoreAccompaniments.push({
|
|
|
+ subjectId: '',
|
|
|
+ speed: '',
|
|
|
+ mp3Url: '',
|
|
|
+ xmlUrl: ''
|
|
|
+ })
|
|
|
+ },
|
|
|
+ async removeSys(index) {
|
|
|
+ try {
|
|
|
+ await this.$confirm('是否确认删除此伴奏?', '提示', {
|
|
|
+ type: 'warning'
|
|
|
+ })
|
|
|
+ if (this.form.sysMusicScoreAccompaniments[index]) {
|
|
|
+ this.form.delExamSongAccompanimentIds.push(this.form.sysMusicScoreAccompaniments[index].id)
|
|
|
+ }
|
|
|
+
|
|
|
+ this.form.sysMusicScoreAccompaniments.splice(index, 1)
|
|
|
+ } catch (error) {}
|
|
|
},
|
|
|
- success(res) {
|
|
|
- if (res.code == 200) {
|
|
|
- this.filelist = [{
|
|
|
- name: res.data.url,
|
|
|
- url: res.data.url,
|
|
|
- }]
|
|
|
- this.$set(this.form, 'url', res.data.url)
|
|
|
- } else {
|
|
|
- this.$message.error(res.msg || '上传失败')
|
|
|
+ hasSubjectId(id) {
|
|
|
+ const ids = []
|
|
|
+ for (const item of this.form.sysMusicScoreAccompaniments) {
|
|
|
+ ids.push(item.subjectId)
|
|
|
}
|
|
|
+ return ids.includes(id)
|
|
|
},
|
|
|
async submit() {
|
|
|
this.$refs.form.validate(async (valid) => {
|
|
@@ -107,16 +204,22 @@ export default {
|
|
|
if (!this.detail) {
|
|
|
await Add({
|
|
|
...this.form,
|
|
|
- subjectIds: this.form.subjectIds.join(','),
|
|
|
- type: 'COMMON',
|
|
|
+ sysMusicScore: {
|
|
|
+ ...this.form.sysMusicScore,
|
|
|
+ type: 'COMMON',
|
|
|
+ musicScoreCategoriesId: (this.form.sysMusicScore.musicScoreCategoriesId || []).pop(),
|
|
|
+ }
|
|
|
})
|
|
|
this.$message.success('提交成功')
|
|
|
} else {
|
|
|
await Update({
|
|
|
...this.form,
|
|
|
- subjectIds: this.form.subjectIds.join(','),
|
|
|
- type: this.detail.type,
|
|
|
- id: this.detail.id
|
|
|
+ sysMusicScore: {
|
|
|
+ ...this.form.sysMusicScore,
|
|
|
+ type: 'COMMON',
|
|
|
+ id: this.detail.id,
|
|
|
+ musicScoreCategoriesId: (this.form.sysMusicScore.musicScoreCategoriesId || []).pop(),
|
|
|
+ }
|
|
|
})
|
|
|
this.$message.success('修改成功')
|
|
|
}
|
|
@@ -132,4 +235,17 @@ export default {
|
|
|
.btns{
|
|
|
text-align: right;
|
|
|
}
|
|
|
+ .files{
|
|
|
+ background-color: #f8f8f8;
|
|
|
+ padding: 20px 0;
|
|
|
+ padding-right: 20px;
|
|
|
+ margin-bottom: 20px;
|
|
|
+ border-radius: 5px;
|
|
|
+ position: relative;
|
|
|
+ .file-remove{
|
|
|
+ position: absolute;
|
|
|
+ right: 20px;
|
|
|
+ bottom: 10px;
|
|
|
+ }
|
|
|
+ }
|
|
|
</style>
|