Bläddra i källkod

更新曲目选择

lex-xin 3 år sedan
förälder
incheckning
493d243182

+ 2 - 2
src/main.js

@@ -10,7 +10,7 @@ import { Button, Icon, Tag, Swipe, SwipeItem, Popup, Picker,
     Circle, Field, DatetimePicker, Image, Loading,
     ActionSheet, RadioGroup, Radio, Checkbox, CheckboxGroup,
     CountDown, Panel, Dialog, Sticky, Rate, Switch, ImagePreview, NoticeBar, NavBar, Divider,
-    Grid, GridItem, Calendar} from 'vant'
+    Grid, GridItem, Calendar, Empty} from 'vant'
 Vue.use(Button).use(Icon).use(Tag).use(Swipe).use(SwipeItem)
    .use(Popup).use(Picker).use(DropdownMenu).use(DropdownItem).use(Search)
    .use(PullRefresh).use(Toast).use(List).use(Collapse).use(CollapseItem)
@@ -18,7 +18,7 @@ Vue.use(Button).use(Icon).use(Tag).use(Swipe).use(SwipeItem)
    .use(Circle).use(Field).use(DatetimePicker).use(Image).use(Loading)
    .use(ActionSheet).use(RadioGroup).use(Radio).use(Checkbox).use(CheckboxGroup)
    .use(CountDown).use(Panel).use(Dialog).use(Sticky).use(Rate).use(Switch).use(ImagePreview).use(NoticeBar)
-   .use(NavBar).use(Divider).use(Grid).use(GridItem).use(Calendar)
+   .use(NavBar).use(Divider).use(Grid).use(GridItem).use(Calendar).use(Empty)
 
 Vue.config.productionTip = false
 

+ 2 - 2
src/views/activeProgram/program.vue

@@ -551,11 +551,11 @@ export default {
                 }
             }
             let onlineNums = form.onlineClassesNums || 0
-            if(form.onlineClassesNums > 0) {
+            if(form.onlineClassesNums && form.onlineClassesNums.length > 0) {
                 onlineNums = Number(form.onlineClassesNums)
             }
             let offlineNums = form.offlineClassesNums || 0
-            if(form.offlineClassesNums > 0) {
+            if(form.offlineClassesNums && form.offlineClassesNums.length > 0) {
                 offlineNums = Number(form.offlineClassesNums)
             }
             let onlineClassesStatus = onlineNums === "" ? true : false;

+ 3 - 3
src/views/app/Account.vue

@@ -22,9 +22,9 @@
             </van-cell>
         </van-cell-group>
         <van-cell-group>
-            <van-cell title="课时兑换" is-link to="periodExchange" >
+            <!-- <van-cell title="课时兑换" is-link to="periodExchange" >
                 <i class="icon icon_change" slot="icon"></i>
-            </van-cell>
+            </van-cell> -->
             <van-cell title="兑换记录" is-link to="exchangeRecord" >
                 <i class="icon icon_record" slot="icon"></i>
             </van-cell>
@@ -161,7 +161,7 @@ export default {
     &::after {
         border-width: 0;;
     }
-    /deep/.van-cell {
+    .van-cell {
         padding: .16rem;
         align-items: center;
     }

+ 1 - 1
src/views/app/ExchangeRecord.vue

@@ -55,7 +55,6 @@ export default {
             localStorage.setItem('Authorization', decodeURI(params.Authorization))
             localStorage.setItem('userInfo', decodeURI(params.Authorization))
         }
-        
         document.title = '兑换记录'
         if(browser().android || browser().iPhone) {
             this.headerStatus = false
@@ -95,6 +94,7 @@ export default {
 @import url("../../assets/commonLess/variable.less");
 .periodExchange {
     min-height: 100vh;
+    overflow: hidden;
     .exchangeText {
         font-size: .17rem;
         color: #1A1A1A;

+ 1 - 0
src/views/app/PeriodRecord.vue

@@ -89,6 +89,7 @@ export default {
 @import url("../../assets/commonLess/variable.less");
 .periodExchange {
     min-height: 100vh;
+    overflow: hidden;
     .exchangeText {
         font-size: .17rem;
         color: #1A1A1A;

+ 8 - 37
src/views/audition/ArrangeWork.vue

@@ -84,10 +84,12 @@
       <!-- <van-sticky>
         <m-header name="作业曲目" :backUrl="backUrl" />
       </van-sticky> -->
-      <accompaniment-modal @onSelectMusic="onSelectMusic" ref="accompaniment" style="margin-bottom: 0.8rem;" :searchSubjectId="tabActive" />
-      <div class="button-group-popup">
+      <!-- <accompaniment-modal @onSelectMusic="onSelectMusic" ref="accompaniment" style="margin-bottom: 0.8rem;" :searchSubjectId="tabActive" /> -->
+       <!-- style="margin-bottom: 0.8rem;" -->
+      <workModel  @onSelectMusic="onSelectMusic" @close="accompanimentStatus = false" ref="accompaniment" :searchSubjectId="tabActive" />
+      <!-- <div class="button-group-popup">
         <span class="btn" @click="accompanimentStatus = false">关闭</span>
-      </div>
+      </div> -->
     </van-popup>
 
     <van-popup
@@ -100,9 +102,6 @@
         <m-header name="学员列表" :backUrl="backUrlStudent" />
       </van-sticky> -->
       <student-list-model :dataList="dataList" style="margin-bottom: 0.8rem;" :dataSubjectList="dataSubjectList"></student-list-model>
-      <div class="button-group-popup">
-        <span class="btn" @click="studentStatus = false">关闭</span>
-      </div>
     </van-popup>
   </div>
 </template>
@@ -112,13 +111,14 @@ import { browser, _throttle }  from '@/common/common'
 import dayjs from "dayjs";
 import { addHomeWork } from '@/api/audition'
 import { getCourseStudents } from '@/api/teacher'
-import AccompanimentModal from './modal/accompanimentModal'
+// import AccompanimentModal from './modal/accompanimentModal'
+import workModel from './modal/workModel'
 import StudentListModel from './modal/studentList'
 import cleanDeep from 'clean-deep'
 import deepClone from '@/helpers/deep-clone'
 export default {
   name: "teacherList",
-  components: { MHeader, AccompanimentModal, StudentListModel },
+  components: { MHeader, workModel, StudentListModel },
   data() {
     let tempDate = new Date() // 默认显示T+3
     tempDate.setDate(tempDate.getDate() + 3)
@@ -227,10 +227,6 @@ export default {
   },
   methods: {
     onSelectAccompany(item, index) {
-      if(this.tabActive != this.tabOriginActive && this.$refs.accompaniment) {
-        this.tabOriginActive = JSON.parse(JSON.stringify(this.tabActive))
-        this.$refs.accompaniment.onSearch()
-      }
       this.accompanimentStatus = true
       this.tabActiveList = item
       this.tabActiveIndex = index
@@ -461,29 +457,4 @@ export default {
   color: #666666;
 }
 
-.button-group-popup {
-  position: fixed;
-  bottom: 0;
-  padding: 0.1rem 0;
-  width: 100%;
-  text-align: center;
-  background-color: #ffffff;
-  .btn {
-    line-height: 0.5rem;
-    display: inline-block;
-    border: 1px solid @mColor;
-    border-radius: 0.4rem;
-    color: @mColor;
-    background: #fff;
-    font-size: 0.18rem;
-    width: 90%;
-    &.primary {
-      color: #fff;
-      background: @mColor;
-    }
-  }
-  .btn + .btn {
-    margin-left: 0.1rem;
-  }
-}
 </style>

+ 293 - 234
src/views/audition/modal/accompanimentModal.vue

@@ -1,262 +1,321 @@
 <template>
-    <div class="accompanimentModal">
-        <van-sticky :offset-top="isHead ? '.46rem' : 0">
-            <van-dropdown-menu class="cateDropDown" active-color="#01C1B5">
-                <van-dropdown-item v-model="levelId" :options="levelOptions" @change="levelChange" />
-                <van-dropdown-item v-model="subjectId" :options="subjectOptions" @change="subjectChange" />
-            </van-dropdown-menu>
-            <van-search
-                v-model="search"
-                show-action
-                placeholder="请输入搜索关键词"
-                shape="round"
-            >
-                <template #label>
-                    <van-dropdown-menu class="headDropDown" active-color="#01C1B5">
-                        <van-dropdown-item v-model="typeId" :options="typeOptions" @change="typeChange" />
-                    </van-dropdown-menu>
-                </template>
-                <template #action>
-                    <div @click="onSearch">搜索</div>
-                </template>
-            </van-search>
-        </van-sticky>
+  <div class="accompanimentModal">
+    <van-sticky :offset-top="isHead ? '.46rem' : 0">
+      <van-dropdown-menu class="cateDropDown" active-color="#01C1B5">
+        <van-dropdown-item
+          v-if="levelOptions && levelOptions.length > 0"
+          v-model="levelId"
+          :options="levelOptions"
+          @change="levelChange"
+        />
+        <van-dropdown-item
+          v-model="subjectId"
+          :options="subjectOptions"
+          @change="subjectChange"
+        />
+      </van-dropdown-menu>
+      <van-search
+        v-model="search"
+        show-action
+        placeholder="请输入搜索关键词"
+        shape="round"
+      >
+        <template #label>
+          <van-dropdown-menu
+            v-if="typeOptions && typeOptions.length > 0"
+            class="headDropDown"
+            active-color="#01C1B5"
+          >
+            <van-dropdown-item
+              v-model="typeId"
+              :options="typeOptions"
+              @change="typeChange"
+            />
+          </van-dropdown-menu>
+        </template>
+        <template #action>
+          <div @click="onSearch">搜索</div>
+        </template>
+      </van-search>
+    </van-sticky>
 
-        <van-list
-            v-model="loading"
-            v-if="show"
-            key="data"
-            :finished="finished"
-            finished-text="没有更多数据了"
-            :immediate-check="false"
-            @load="FetchList"
+    <van-list
+      v-model="loading"
+      v-if="show"
+      key="data"
+      :finished="finished"
+      finished-text="没有更多数据了"
+      :immediate-check="false"
+      @load="FetchList"
+    >
+      <van-cell-group>
+        <van-cell
+          v-for="(item, index) in list"
+          :key="index"
+          class="input-cell"
+          clickable
+          @click="onSelect(item)"
+          :center="true"
         >
-            <van-cell-group>
-                <van-cell
-                    v-for="(item, index) in list"
-                    :key="index"
-                    class="input-cell"
-                    clickable
-                    @click="onSelect(item)"
-                    :center="true"
-                >
-                    <template slot="icon">
-                        <van-icon class="iconMusic" :name="MusicIcon" />
-                        <div class='icon' v-if="item.rankIds">
-                            <img src='./icons/vip_icon.png' />
-                        </div>
-                    </template>
-                    <template slot="title">
-                        <!-- {{ item.examSongName }} -->
-                        <van-notice-bar
-                            background="none"
-                            :style="{ paddingLeft: (item.rankIds ? '.04rem' : '.15rem') + '!important' }"
-                            color="#444"
-                            :scrollable="false"
-                            :text="item.examSongName"
-                        />
-                    </template>
-                </van-cell>
-            </van-cell-group>
-        </van-list>
-        <m-empty class="empty" v-else key="data" />
-    </div>
+          <template slot="icon">
+            <van-icon class="iconMusic" :name="MusicIcon" />
+            <div class="icon" v-if="item.rankIds">
+              <img src="./icons/vip_icon.png" />
+            </div>
+          </template>
+          <template slot="title">
+            <!-- {{ item.examSongName }} -->
+            <van-notice-bar
+              background="none"
+              :style="{
+                paddingLeft:
+                  (item.rankIds ? '.04rem' : '.15rem') + '!important',
+              }"
+              color="#444"
+              :scrollable="false"
+              :text="item.examSongName"
+            />
+          </template>
+        </van-cell>
+      </van-cell-group>
+    </van-list>
+    <!-- <m-empty class="empty" v-else key="data" /> -->
+    <van-empty v-else description="暂无数据" key="data" />
+  </div>
 </template>
 
 <script>
-import { find } from 'lodash'
-import { sysMusicScoreCategoriesTree, queryPageLimit, querySubjectIds } from './api'
-import MusicIcon from './icons/music.png'
+import { find } from "lodash";
+import {
+  sysMusicScoreCategoriesTree,
+  queryPageLimit,
+  querySubjectIds,
+} from "./api";
+import MusicIcon from "./icons/music.png";
 export default {
-    props: {
-        isHead: {
-            type: Boolean,
-            default() {
-                return false
+  props: {
+    isHead: {
+      type: Boolean,
+      default() {
+        return false;
+      },
+    },
+    id: {
+      type: [Number, String],
+    },
+    searchSubjectId: {
+      type: [Number, String],
+      default: 0,
+    },
+  },
+  data() {
+    return {
+      MusicIcon,
+      levelId: 0,
+      tempSubjectId: 0,
+      levelOptions: [
+        // { text: '全部等级', value: 0 },
+      ],
+      subjectOptions: [{ text: "全部声部", value: 0 }],
+      typeId: 0,
+      typeOptions: [],
+      search: null,
+      loading: false,
+      finished: false,
+      show: true,
+      params: {
+        page: 1,
+        rows: 20,
+      },
+      list: [],
+    };
+  },
+  computed: {
+    subjectId() {
+      return this.tempSubjectId || Number(this.searchSubjectId);
+    },
+    parentId() {
+      return this.id || 1;
+    },
+  },
+  async mounted() {
+    await this.FetchLevel();
+    await this.FetchList();
+  },
+  methods: {
+    async FetchLevel() {
+      try {
+        const musicScoreList = sessionStorage.getItem("musicScoreList");
+        const musicList = musicScoreList ? JSON.parse(musicScoreList) : [];
+        let childClass = [];
+        for (let music of musicList) {
+          if (music.id == this.parentId) {
+            childClass = music.sysMusicScoreCategoriesList || [];
+          }
+        }
+        this.levelOptions = [
+          ...childClass.map((item) => ({
+            value: item.id,
+            text: item.name,
+            childs: item.sysMusicScoreCategoriesList,
+          })),
+        ];
+        if (this.levelOptions.length && !this.levelId) {
+          this.levelId = this.levelOptions[0].value;
+          const active = find(this.levelOptions, { value: this.levelId });
+          if (active) {
+            if (active.childs) {
+              this.typeOptions = [
+                { value: 0, text: "全部练习" },
+                ...active.childs.map((item) => ({
+                  value: item.id,
+                  text: item.name,
+                })),
+              ];
+            } else {
+              this.typeOptions = null;
             }
-        },
-        searchSubjectId: {
-            type: [Number, String],
-            default: 0
+          }
         }
+        console.log(this.levelOptions, 'levelOptions')
+        console.log(this.typeOptions, 'typeOptions')
+      } catch (error) {}
+    },
+    async FetchCats() {
+      try {
+        const res = await querySubjectIds();
+        this.subjectOptions = [
+          ...this.subjectOptions,
+          ...res.data
+            .filter((item) => !!item)
+            .map((item) => ({ value: item.id, text: item.name })),
+        ];
+      } catch (error) {
+        //
+      }
     },
-    data() {
-        return {
-            MusicIcon,
-            levelId: 0,
-            tempSubjectId: 0,
-            levelOptions: [
-                // { text: '全部等级', value: 0 },
-            ],
-            subjectOptions: [
-                { text: '全部声部', value: 0 }
-            ],
-            typeId: 0,
-            typeOptions: [],
-            search: null,
-            loading: false,
-            finished: false,
-            show: true,
-            params: {
-                page: 1,
-                rows: 20,
-            },
-            list: [],
+    async FetchList() {
+      if (this.subjectOptions.length === 1) {
+        await this.FetchCats();
+      }
+      try {
+        let params = this.params;
+        let categoriesId = ((this.levelId || this.typeId) === 0 ? undefined : this.typeId || this.levelId) || this.parentId
+        console.log(categoriesId, 'categoriesId')
+        const res = await queryPageLimit({
+          ...params,
+          clientType: "SMART_PRACTICE",
+          subjectId: this.subjectId === 0 ? undefined : this.subjectId,
+          categoriesId,
+          search: this.search,
+        });
+        this.loading = false;
+        const { data } = res;
+        this.list = [...this.list, ...data.rows];
+        if (params.page >= Math.ceil(data.totalPage)) {
+          this.finished = true;
+          // Toast('列表加载完成')
         }
+        this.params.page = data.nextPage;
+        if (this.list.length <= 0) {
+          this.show = false;
+        }
+      } catch(e) {
+        //
+        console.log(e)
+      }
     },
-    computed: {
-        subjectId() {
-            return this.tempSubjectId || Number(this.searchSubjectId)
+    levelChange(val) {
+      this.levelId = val;
+      this.typeId = 0;
+      const active = find(this.levelOptions, { value: val });
+      if (active) {
+        if (active.childs) {
+          this.typeOptions = [
+            { value: 0, text: "全部练习" },
+            ...active.childs.map((item) => ({
+              value: item.id,
+              text: item.name,
+            })),
+          ];
+        } else {
+          this.typeOptions = null;
         }
+      }
+      this.onSearch();
     },
-    async mounted() {
-        await this.FetchLevel()
-        await this.FetchList()
+    subjectChange(val) {
+      this.tempSubjectId = val;
+      this.onSearch();
     },
-    methods: {
-        async FetchLevel() {
-            try {
-                const res = await sysMusicScoreCategoriesTree({ parentId: 1 })
-                // console.log(res)
-                this.levelOptions = [...res.data.map((item) => ({value: item.id, text: item.name, childs: item.sysMusicScoreCategoriesList}))]
-                if (this.levelOptions.length && !this.levelId) {
-                    // console.log(this.levelOptions)
-                    this.levelId = this.levelOptions[0].value
-                    const active = find(this.levelOptions, {value: this.levelId})
-                    if (active) {
-                        if (active.childs) {
-                            this.typeOptions = [{value: 0, text: '全部练习'}, ...active.childs.map((item) => ({value: item.id, text: item.name}))]
-                        } else {
-                            this.typeOptions = null
-                        }
-                    }
-                }
-            } catch(error) {
-                //
-            }
-        },
-        async FetchCats() {
-            try {
-                const res = await querySubjectIds()
-                this.subjectOptions = [...this.subjectOptions, ...res.data.filter((item) => !!item).map((item) => ({value: item.id, text: item.name}))]
-            } catch (error) {
-                //
-            }
-        },
-        async FetchList() {
-            if (this.subjectOptions.length === 1) {
-                await this.FetchCats()
-            }
-            try {
-                let params = this.params
-                const res = await queryPageLimit({
-                    ...params,
-                    clientType: 'SMART_PRACTICE',
-                    subjectId: this.subjectId === 0 ? undefined : this.subjectId,
-                    categoriesId: (this.levelId || this.typeId) === 0 ? undefined : this.typeId || this.levelId,
-                    search: this.search
-                })
-                this.loading = false;
-                const { data } = res
-                this.list = [...this.list, ...data.rows]
-                if(params.page >= Math.ceil(data.totalPage)) {
-                    this.finished = true
-                    // Toast('列表加载完成')
-                }
-                this.params.page = data.nextPage
-                if(this.list.length <= 0) {
-                    this.show = false
-                }
-            } catch {
-                //
-            }
-        },
-        levelChange(val) {
-            this.levelId = val
-            this.typeId = 0
-            const active = find(this.levelOptions, {value: val})
-            if (active) {
-                if (active.childs) {
-                    this.typeOptions = [{value: 0, text: '全部练习'}, ...active.childs.map((item) => ({value: item.id, text: item.name}))]
-                } else {
-                    this.typeOptions = null
-                }
-            }
-            this.onSearch()
-        },
-        subjectChange(val) {
-            this.tempSubjectId = val
-            this.onSearch()
-        },
-        typeChange(val) {
-            this.typeId = val
-            this.onSearch()
-        },
-        onSearch() {
-            this.params.page = 1
-            this.list = []
-            this.show = true
-            this.finished = false
-            this.FetchList()
-        },
-        onSelect(item) {
-            this.$emit('onSelectMusic', item)
-        }
-    }
-}
+    typeChange(val) {
+      this.typeId = val;
+      this.onSearch();
+    },
+    onSearch() {
+      this.params.page = 1;
+      this.list = [];
+      this.show = true;
+      this.finished = false;
+      this.FetchList();
+    },
+    onSelect(item) {
+      this.$emit("onSelectMusic", item);
+    },
+  },
+};
 </script>
 
 <style lang="less" scoped>
 .accompanimentModal {
-    background-color: #f5f5f5;
-    min-height: 100vh;
-
-    /deep/.van-search {
-        .van-cell {
-            font-size: 0.14rem;
-            padding: 0.05rem 0.08rem;
-            line-height: 0.24rem;
-        }
-        .van-dropdown-menu__bar {
-            height: .36rem;
-            background: transparent;
-            box-shadow: none;
-        }
-    }
+  background-color: #f5f5f5;
+  min-height: 100vh;
 
-    .headDropDown {
-        height: .36rem;
-        background: transparent;
-        /deep/.van-dropdown-menu__title {
-            font-size: .14rem;
-        }
-    }
-    /deep/.van-field__control {
-        font-size: .14rem;
+  /deep/.van-search {
+    .van-cell {
+      font-size: 0.14rem;
+      padding: 0.05rem 0.08rem;
+      line-height: 0.24rem;
     }
-    /deep/.van-dropdown-item .van-cell {
-        padding: 0.12rem 0.16rem;
+    .van-dropdown-menu__bar {
+      height: 0.36rem;
+      background: transparent;
+      box-shadow: none;
     }
+  }
 
-    .iconMusic {
-        /deep/.van-icon__image {
-            width: .38rem;
-            height: .38rem;
-            margin: auto;
-            vertical-align: middle;
-            // padding-right: .1rem;
-        }
+  .headDropDown {
+    height: 0.36rem;
+    background: transparent;
+    /deep/.van-dropdown-menu__title {
+      font-size: 0.14rem;
     }
+  }
+  /deep/.van-field__control {
+    font-size: 0.14rem;
+  }
+  /deep/.van-dropdown-item .van-cell {
+    padding: 0.12rem 0.16rem;
+  }
 
-    .icon{
-        display: flex;
-        align-items: center;
-        margin-left: .15rem;
-        img{
-            width: .4rem;
-            // margin-top: -.02rem;
-        }
+  .iconMusic {
+    /deep/.van-icon__image {
+      width: 0.38rem;
+      height: 0.38rem;
+      margin: auto;
+      vertical-align: middle;
+      // padding-right: .1rem;
     }
+  }
 
+  .icon {
+    display: flex;
+    align-items: center;
+    margin-left: 0.15rem;
+    img {
+      width: 0.4rem;
+      // margin-top: -.02rem;
+    }
+  }
 }
-</style>
+</style>

+ 91 - 0
src/views/audition/modal/baseList.vue

@@ -0,0 +1,91 @@
+<template>
+  <div class="container">
+      <div class="content">
+        <div class="items" v-if="show">
+            <div v-for="item in list" :key="item.id" @click="toDetail(item)">
+              <div class="inner">
+                <img :src="item.coverImg" class="img"/>
+              </div>
+            </div>
+        </div>
+        <van-empty v-else description="暂无数据" />
+      </div>
+    </div>
+</template>
+
+<script>
+import { sysMusicScoreCategoriesTree } from './api'
+export default {
+  name: 'baseList',
+  data() {
+    return {
+      list: [],
+      show: false,
+    }
+  },
+  async mounted() {
+    try {
+      const res = await sysMusicScoreCategoriesTree()
+      this.list = res.data || []
+      this.show = this.list.length > 0 ? true : false
+    } catch(e) { }
+  },
+  methods: {
+    toDetail(item) {
+      const childLength = item.sysMusicScoreCategoriesList ? item.sysMusicScoreCategoriesList.length : 0
+      // 如果二级分类只有一个分类,则直接跳转到曲目列表
+      sessionStorage.setItem('musicScoreList', JSON.stringify(item.sysMusicScoreCategoriesList))
+      if(childLength > 1) {
+        this.$emit('onDetail', {
+          path: 'classify',
+          parentId: item.id // 父级元素编号
+        })
+      } else {
+        this.$emit('onDetail', {
+          path: 'list',
+          id: (childLength == 1 ? item.sysMusicScoreCategoriesList[0].id : item.id)
+        })
+      }
+    },
+  }
+}
+</script>
+
+
+<style lang="less" scoped>
+.container{
+  min-height: 100vh;
+  display: flex;
+  flex-direction: column;
+  .content{
+    flex: 1;
+    background-color: #F5F5F5;
+    padding: 12px;
+    .items{
+      display: flex;
+      align-items: center;
+      flex-wrap: wrap;
+      align-items: space-around;
+      >div{
+        margin-bottom: .15rem;
+        text-align: center;
+        .inner {
+          width: 100%;
+          margin: 0 auto;
+        }
+        .img{
+          margin-top: 0;
+          width: 100%;
+        }
+        :global {
+          .van-image, .van-image__error,.van-image__loading {
+            width: 100%;
+            min-height: 1.4rem;
+          }
+        }
+      }
+    }
+  }
+}
+
+</style>

+ 105 - 0
src/views/audition/modal/classify.vue

@@ -0,0 +1,105 @@
+<template>
+  <div class="container">
+    <div class="content">
+      <div class="title">教材</div>
+      <div class="items" v-if="show">
+        <div v-for="item in list" :key="item.id" @click="toDetail(item)">
+          <div class="inner">
+            <img :src="item.coverImg" class="img" />
+            <div>{{ item.name }}</div>
+          </div>
+        </div>
+      </div>
+      <van-empty v-else description="暂无数据" />
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: "baseList",
+  data() {
+    return {
+      list: [],
+      show: true,
+    };
+  },
+  async mounted() {
+    const musicScoreList = sessionStorage.getItem('musicScoreList')
+    if(musicScoreList) {
+      this.list = JSON.parse(musicScoreList) // 从上面页面获取分类信息
+    }
+    this.show = this.list.length > 0 ? true : false
+  },
+  methods: {
+    toDetail(item) {
+      this.$emit('onDetail', {
+        path: 'list',
+        id: item.id
+      })
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.container{
+  min-height: 100vh;
+  display: flex;
+  flex-direction: column;
+  .content{
+    flex: 1;
+    background-color: #F5F5F5;
+    padding: 12px;
+
+    .title{
+      color: #333333;
+      font-size: 18px;
+      font-weight: 500;
+      display: flex;
+      align-items: center;
+      &::before{
+        content: '';
+        display: block;
+        width: 4px;
+        height: 18px;
+        border-radius: 2px;
+        background-color: #01C1B5;
+        margin-right: 6px;
+      }
+    }
+    .items{
+      display: flex;
+      align-items: center;
+      flex-wrap: wrap;
+      >div{
+        margin-top: 20px;
+        width: 33.333%;
+        text-align: center;
+        .inner {
+          width: 1.05rem;
+          margin: 0 auto;
+        }
+        .img{
+          margin-top: 0;
+          width: 100%;
+        }
+        :global {
+          .van-image, .van-image__error,.van-image__loading {
+            width: 1.05rem;
+            min-height: 1.34rem;
+          }
+        }
+        >div{
+          margin-top: 7px;
+          font-size: 14px;
+          font-weight: 500;
+          color: #1A1A1A;
+          line-height: 20px;
+        }
+      }
+    }
+  }
+}
+
+</style>

+ 90 - 0
src/views/audition/modal/workModel.vue

@@ -0,0 +1,90 @@
+<template>
+  <div class="workModel">
+    <van-sticky>
+      <van-nav-bar
+        title="训练曲目"
+        left-arrow
+        @click-left="close"
+      />
+    </van-sticky>
+    <base-list @onDetail="onDetail" v-if="index == 1" />
+    <classify @onDetail="onDetail" v-if="index == 2" />
+    <accompaniment-modal v-if="index == 3" :id="id" @onSelectMusic="onSelectMusic" :searchSubjectId="searchSubjectId" />
+
+    <!-- <div class="button-group-popup">
+      <span class="btn" @click="close">关闭</span>
+    </div> -->
+  </div>
+</template>
+
+<script>
+import BaseList from './baseList'
+import Classify from './classify'
+import AccompanimentModal from './accompanimentModal'
+export default {
+  props: ["searchSubjectId"],
+  name: 'workModel',
+  components: { BaseList, Classify, AccompanimentModal },
+  data() {
+    return {
+      index: 1,
+      id: null,
+    }
+  },
+  methods: {
+    onDetail(option) {
+      if(option.path == 'classify') {
+        this.index = 2
+      } else if(option.path == 'list') {
+        this.index = 3
+        this.id = option.id
+      }
+    },
+    onSelectMusic(item) {
+      this.index = 1
+      this.close()
+      this.$emit('onSelectMusic', item)
+    },
+    close() {
+      if(this.index == 1) {
+        this.$emit('close')
+      } else {
+        this.index = 1
+      }
+      document.querySelector('.van-popup').scrollTop = 0
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+@import url("../../../assets/commonLess/variable.less");
+.button-group-popup {
+  position: fixed;
+  bottom: 0;
+  padding: 0.1rem 0;
+  width: 100%;
+  text-align: center;
+  background-color: #ffffff;
+  .btn {
+    line-height: 0.5rem;
+    display: inline-block;
+    border: 1px solid @mColor;
+    border-radius: 0.4rem;
+    color: @mColor;
+    background: #fff;
+    font-size: 0.18rem;
+    width: 90%;
+    &.primary {
+      color: #fff;
+      background: @mColor;
+    }
+  }
+  .btn + .btn {
+    margin-left: 0.1rem;
+  }
+}
+/deep/.van-nav-bar .van-icon {
+  color: #212121
+}
+</style>