lex-xin 4 роки тому
батько
коміт
8cef7245e2

Різницю між файлами не показано, бо вона завелика
+ 1 - 0
dist/app.19baf2bbb0e859c0f1d1.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/app.a78ae671674d4479c841.js


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/css/VIPApply~applyActive.ec9482b5.css


Різницю між файлами не показано, бо вона завелика
+ 1 - 0
dist/index.html


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
dist/js/VIPApply~applyActive.eba03621.js


+ 9 - 1
src/api/teacher.js

@@ -464,6 +464,13 @@ const getCourseStudents = (data) => {
   })
 }
 
+const queryUserById = (params) => {
+  return axios({
+    url: '/api-auth/user/queryUserById/' + params.userId,
+    method: 'get'
+  })
+}
+
 export {
   queryMyCreatedList,
   queryWaitList,
@@ -515,5 +522,6 @@ export {
   queryDouble11Students,
   newsQuery,
   newsList,
-  getCourseStudents
+  getCourseStudents,
+  queryUserById
 }

BIN
src/assets/images/icon_phone.png


+ 1 - 1
src/router/auditionRouter.js

@@ -60,7 +60,7 @@ let auditionRouter = [
         name: 'arrangeWork',
         component: () => import(/* webpackChunkName:'ArrangeWork'*/'@/views/audition/ArrangeWork.vue'),
         meta: {
-            descrition: '布置作业',
+            descrition: '布置训练',
             weight: 4 // 页面权重
         }
     }

+ 0 - 4
src/views/applyActive/components/vipCourse.vue

@@ -1454,8 +1454,6 @@ export default {
           }
           return false;
         }
-      } else {
-        return false;
       }
 
       if (statusList.hasOffline) {
@@ -1475,8 +1473,6 @@ export default {
           }
           return false;
         }
-      } else {
-        return false;
       }
       return true;
     },

+ 51 - 11
src/views/audition/ArrangeWork.vue

@@ -6,7 +6,7 @@
         <van-tag type="primary" plain style="background-color: #F1FCF9">课后训练</van-tag>
       </template>
     </van-cell>
-    <van-cell class="endTime" readonly is-link title-style="font-size: .16rem; color: #333333;">
+    <van-cell class="endTime" readonly is-link title-style="font-size: .16rem; color: #333333;" @click="studentStatus = true">
       <template #title>
         <span style="padding-right: .3rem">学员共<i style="font-style: normal; color: #01C1B5">{{ params.studentCount }}</i>人</span>
         <span>会员 <i style="font-style: normal; color: #FF802C">{{ params.studentMemberCount }}</i>人</span>
@@ -37,7 +37,10 @@
       <van-tab v-for="(item, i) in params.subjectList" :title="item.subjectName" :name="item.id" :key="i" class="van-hairline--bottom">
         <van-cell class="endTime" v-for="(music, index) in item.musicScoreIdList" :key="index" style="margin-top: 0;" title="训练曲目" @click="onSelectAccompany(item, index)" readonly is-link placeholder="请选择训练曲目" >
           <template #default>
-            {{ music.name }}
+            <template v-if="music.name">
+              {{ music.name }}
+            </template>
+            <span v-else style="color: #808080;">请选择</span>
           </template>
         </van-cell>
         <div class="addAccompaniment" v-if="item.musicScoreIdList.length < 3" @click="addCloud(item)">
@@ -69,6 +72,18 @@
       </van-sticky>
       <accompaniment-modal isHead @onSelectMusic="onSelectMusic" :searchSubjectId="tabActive" />
     </van-popup>
+
+    <van-popup
+      v-model="studentStatus"
+      :lock-scroll="true"
+      position="bottom"
+      :style="{ height: '180%' }"
+    >
+      <van-sticky>
+        <m-header name="学员列表" :backUrl="backUrlStudent" />
+      </van-sticky>
+      <student-list-model isHead :dataList="dataList" :dataSubjectList="dataSubjectList"></student-list-model>
+    </van-popup>
   </div>
 </template>
 <script>
@@ -78,11 +93,12 @@ import dayjs from "dayjs";
 import { addHomeWork } from '@/api/audition'
 import { getCourseStudents } from '@/api/teacher'
 import AccompanimentModal from './modal/accompanimentModal'
+import StudentListModel from './modal/studentList'
 import cleanDeep from 'clean-deep'
 import deepClone from '@/helpers/deep-clone'
 export default {
   name: "teacherList",
-  components: { MHeader, AccompanimentModal },
+  components: { MHeader, AccompanimentModal, StudentListModel },
   data() {
     let tempDate = new Date() // 默认显示T+3
     tempDate.setDate(tempDate.getDate() + 3)
@@ -95,6 +111,12 @@ export default {
           this.accompanimentStatus = false
         }
       },
+      backUrlStudent: {
+        status: true,
+        callBack: () => {
+          this.studentStatus = false
+        }
+      },
       classGroupName: query.classGroupName,
       courseId: query.courseId,
       dateSection: {
@@ -118,8 +140,10 @@ export default {
         studentMemberCount: 0, // 学员会员数
         subjectIdList: [],
         subjectList: []
-      }
-
+      },
+      dataList: [],
+      dataSubjectList: [],
+      studentStatus: false,
     };
   },
   async mounted() {
@@ -128,7 +152,7 @@ export default {
       localStorage.setItem("Authorization", decodeURI(params.Authorization));
       localStorage.setItem("userInfo", decodeURI(params.Authorization));
     }
-    document.title = '布置作业'
+    document.title = '布置训练'
     if(browser().android || browser().iPhone) {
       this.headerStatus = false
     }
@@ -136,6 +160,7 @@ export default {
       const result = res.data
       if(result.code != 200) { return }
       const tempData = result.data || []
+      this.dataList = tempData
       let params = {
         studentCount: tempData.length, // 学员总数
         studentMemberCount: 0, // 学员会员数
@@ -168,6 +193,7 @@ export default {
       });
       // 默认选中第1条数据
       this.tabActive = deepClone(params.subjectIdList[0])
+      this.dataSubjectList = deepClone(params.subjectList)
       this.params = params
     })
   },
@@ -206,7 +232,7 @@ export default {
     onEndTime() {
       this.dateSection.status = true
     },
-    onSubmit: _throttle(function() {
+    onSubmit: _throttle(function(type) {
       if(!this.title) {
         this.$toast('请输入训练标题')
         return
@@ -234,10 +260,20 @@ export default {
           userIdList: subject.userIdList
         })
       })
-      if(notAccompanySong.length - subjectLength < 0 && notAccompanySong != 0) {
-        console.log('选择曲目')
+      if(notAccompanySong.length - subjectLength <= 0 && notAccompanySong != 0 && type[0] != 1) {
+        // console.log('选择曲目')
+        this.$dialog.confirm({
+          message: notAccompanySong.join(',') + '声部未选择云教练训练曲目,是否继续布置作业?',
+          confirmButtonColor: '#01C1B5'
+        }).then(() => {
+          // on confirm
+          this.onSubmit(1)
+        })
+        .catch(() => {
+          // on cancel
+        });
+        return
       }
-      
       this.$toast.loading({
         message: '加载中...',
         duration: 10000,
@@ -352,10 +388,13 @@ export default {
   top: .15rem;
   left: 0.12rem;
 }
-
 /deep/.van-tab {
   font-size: 16px;
 }
+/deep/.van-popup--bottom {
+  border-radius: 0px 0px 0px 0px!important;
+  overflow: auto!important;
+}
 .accompanyHeader {
   font-size: .14rem;
   padding: .16rem .08rem .14rem;
@@ -377,4 +416,5 @@ export default {
   color: #666666;
 }
 
+
 </style>

+ 240 - 0
src/views/audition/modal/studentList.vue

@@ -0,0 +1,240 @@
+<template>
+    <div class="studentList">
+        <van-sticky :offset-top="isHead ? '.46rem' : 0">
+            <van-dropdown-menu active-color="#01C1B5">
+                <van-dropdown-item v-model="value1" @change="getList" :options="option1" />
+                <van-dropdown-item v-model="value2" @change="getList" :options="option2" />
+            </van-dropdown-menu>
+            <!-- <van-search
+            show-action
+            shape="round"
+            :left-icon="searchIcon"
+            @search="onSearch"
+            v-model="search"
+            placeholder="请输入学生名或手机号"
+            >
+                <template #action>
+                    <div @click="onSearch">搜索</div>
+                </template>
+            </van-search> -->
+        </van-sticky>
+        <div class="paddingB80 studentContainer">
+            <van-cell-group v-if="dataShow">
+            <van-cell
+                v-for="(item, index) in dataListArray"
+                :key="index"
+                class="input-cell"
+                :center="true"
+            >
+                <template slot="icon">
+                    <img class="logo" v-if="item.headUrl" :src="item.headUrl" alt="" />
+                    <img class="logo" v-else src="@/assets/images/icon_student.png" alt="" />
+                </template>
+                <template slot="title">
+                    <div class="studentName">
+                        {{ item.name }}
+                        <div class='icon' v-if="item.memberRankSettingId">
+                            <img src='./icons/vip_icon.png' />
+                        </div>
+                    </div>
+                </template>
+                <template slot="label">
+                    <span>{{ (item.subjectName) }}</span>
+                </template>
+            </van-cell>
+            </van-cell-group>
+            <m-empty class="empty" v-else key="data" />
+        </div>
+        <!-- <div class="button-group-popup">
+            <span class="btn">取消</span>
+        </div> -->
+    </div>
+</template>
+
+<script>
+import MEmpty from "@/components/MEmpty"
+import deepClone from '@/helpers/deep-clone'
+export default {
+    props: {
+        isHead: {
+            type: Boolean,
+            default() {
+                return false
+            }
+        },
+        dataList: {
+            type: Array,
+            default() {
+                return []
+            }
+        },
+        dataSubjectList: {
+            type: Array,
+            default() {
+                return []
+            }
+        }
+    },
+    components: { MEmpty },
+    watch: {
+        dataList(newVal) {
+            this.dataListArray = newVal
+        }
+    },
+    data() {
+        return {
+            search: null,
+            value1: 0,
+            value2: 0,
+            option1: [
+                { text: '全部声部', value: 0 },
+            ],
+            option2: [
+                { text: '全部学员', value: 0 },
+                { text: '会员学员', value: 'b' },
+                { text: '非会员学员', value: 'c' },
+            ],
+            dataShow: true,
+            dataListArray: [],
+            allArray: [],
+            searchIcon: require("@/assets/images/search.png"),
+        }
+    },
+    mounted() {
+        this.dataListArray = this.dataList
+        console.log(this.dataList)
+        this.allArray = deepClone(this.dataList)
+        this.dataSubjectList.forEach(subject => {
+            this.option1.push({
+                text: subject.subjectName,
+                value: subject.id
+            })
+        })
+    },
+    methods: {
+        onSearch() {
+            this.getList()
+        },
+        getList() {
+            this.dataShow = true
+            let search = this.search,
+                subject = this.value1 ? this.value1 : null,
+                student = this.value2 ? this.value2 : null
+            let tempArray = []
+            let allArray = this.allArray
+            for(let i = 0; i < allArray.length; i++) {
+                if(search && allArray[i].name.indexOf(search) < 0) {
+                    break
+                }
+                if(subject && allArray[i].subjectIdList != subject) {
+                    break
+                }
+                if(student) {
+                    if(student == 'a' && !allArray[i].memberRankSettingId) {
+                        break
+                    } else if(student == 'c' && allArray[i].memberRankSettingId) {
+                        break
+                    }
+                }
+                tempArray.push(allArray[i])
+            }
+            this.dataListArray = tempArray
+            if(tempArray.length <= 0) {
+                this.dataShow = false
+            }
+        }
+    }
+}
+</script>
+
+<style lang="less" scoped>
+@import url("../../../assets/commonLess/variable.less");
+/deep/.van-search .van-cell {
+  padding: 5px 8px 5px 0 !important;
+}
+.paddingB80 {
+  padding-bottom: 0.8rem;
+}
+.studentName {
+  font-size: 0.16rem;
+  color: #1a1a1a;
+  line-height: 0.22rem;
+  display: flex;
+}
+.studentContainer {
+  /deep/.van-cell__title {
+    font-size: 0.14rem;
+    color: @mFontColor;
+    // flex: 1 auto;
+  }
+
+  .logo {
+    width: 0.42rem;
+    height: 0.42rem;
+    margin-right: 0.12rem;
+    border-radius: 100%;
+  }
+
+  .input-cell {
+    padding: 0.2rem 0.16rem;
+
+    .van-radio {
+      justify-content: flex-end;
+    }
+  }
+
+  /deep/.van-cell__value {
+    height: 0.2rem;
+  }
+
+  /deep/.van-radio__icon .van-icon {
+    border-color: #d3d3d3;
+  }
+
+  /deep/.van-radio__icon--checked {
+    .van-icon {
+      border-color: @mColor;
+      background: @mColor;
+    }
+  }
+
+  .icon{
+        display: flex;
+        align-items: center;
+        margin-left: .15rem;
+        img{
+            width: .4rem;
+            // margin-top: -.02rem;
+        }
+    }
+
+  .van-tag {
+    margin-left: 0.08rem;
+  }
+}
+.button-group-popup {
+  position: fixed;
+  bottom: 0;
+  padding: 0.2rem 0;
+  width: 100%;
+  text-align: center;
+  background-color: #ffffff;
+  .btn {
+    line-height: 0.5rem;
+    display: inline-block;
+    border: 1px solid @mColor;
+    width: 1.65rem;
+    border-radius: 0.4rem;
+    color: @mColor;
+    background: #fff;
+    font-size: 0.18rem;
+    &.primary {
+      color: #fff;
+      background: @mColor;
+    }
+  }
+  .btn + .btn {
+    margin-left: 0.1rem;
+  }
+}
+</style>

+ 1 - 0
src/views/trainStatistics/index.vue

@@ -133,6 +133,7 @@ export default {
                 query: {
                     userId: item.userId,
                     username: item.username,
+                    phone: item.phone,
                     musicGroupName: item.musicGroupName,
                     avatar: item.avatar,
                     visitFlag: item.visitFlag

+ 43 - 7
src/views/visitManager/addVisit.vue

@@ -17,9 +17,13 @@
         v-model="studentName"
         readonly
         input-align="right"
-        :is-link="id || userId ? false : true"
+        :is-link="id || userId || studentId ? false : true"
         placeholder="请选择"
-      />
+      >
+        <template #right-icon>
+          <a v-if="studentPhone" @click.stop="() => {}" class="phone_section" :href="'tel:' + studentPhone"><img src="../../assets/images/icon_phone.png" class="iconPhone" alt=""></a>
+        </template>
+      </van-field>
       <van-field
         label="回访类型"
         @click="onChange('type')"
@@ -195,6 +199,7 @@ import {
   queryStudentsWithTeacher,
   visitAdd,
   visitGetInfo,
+  queryUserById
 } from "@/api/teacher";
 import { queryUserInfo } from "@/api/app";
 import setLoading from "@/utils/loading";
@@ -206,11 +211,12 @@ export default {
   },
   data() {
     const query = this.$route.query;
-    // 如果有userId的时候说明是从评测详情进来的
     return {
       id: query.id,
       name: query.name,
-      userId: query.userId,
+      userId: query.userId, // 如果有userId的时候说明是从评测详情进来的
+      studentId: query.studentId, // 这个参数是从原生传过来的,单独做了处理
+      inside: query.inside || 0,
       visitFlag: Number(query.visitFlag) || 0,
       dataForm: {
         // 时间下拉框
@@ -231,6 +237,7 @@ export default {
         data: [],
       },
       studentName: query.username || null,
+      studentPhone: query.phone || null,
       teacherName: null,
       form: {
         teacherId: null,
@@ -252,6 +259,7 @@ export default {
       dataShow: true, // 是否有数据
       radioSelect: null,
       radioSelectName: null,
+      radioSelectPhone: null,
       clickStatus: false,
       dataList: [],
       searchIcon: require("@/assets/images/search.png"),
@@ -266,7 +274,7 @@ export default {
     if (browser().android || browser().iPhone) {
       this.statusList.headerStatus = false;
     }
-    document.title = this.name;
+    document.title = this.name || '新增回访记录';
     this.__init();
   },
   methods: {
@@ -300,6 +308,14 @@ export default {
           this.$toast(res.msg);
         }
       }
+      let userId = this.userId || this.studentId
+      if(userId) {
+        await queryUserById({ userId }).then(res => {
+          let result = res.data
+          this.studentPhone = result.phone
+          this.studentName = result.username
+        })
+      }
     },
     async onSubmit() {
       let form = this.form;
@@ -340,7 +356,9 @@ export default {
       if (result.code == 200) {
         this.$toast("添加成功");
         setTimeout(() => {
-          if(this.userId) {
+          if(this.inside) {
+            this.onAppBack()
+          } else if(this.userId) {
             let { visitFlag ,...query } = this.$route.query
             visitFlag = 0
             this.$router.replace({
@@ -360,8 +378,17 @@ export default {
         return;
       }
     },
+    onAppBack() {
+      if (browser().android) {
+        DAYA.postMessage(JSON.stringify({ api: "back" }));
+      } else if (browser().iPhone) {
+        window.webkit.messageHandlers.DAYA.postMessage(
+          JSON.stringify({ api: "back" })
+        );
+      }
+    },
     onCheckStudent() {
-      if (this.id || this.userId) {
+      if (this.id || this.userId || this.studentId) {
         return;
       }
       this.statusList.studentStatus = true;
@@ -402,6 +429,7 @@ export default {
     onCheckboxSelect(item) {
       this.radioSelect = item.userId;
       this.radioSelectName = item.userName;
+      this.radioSelectPhone = item.phone
     },
     onPopupCancel() {
       this.statusList.studentStatus = false;
@@ -409,6 +437,7 @@ export default {
     onPopupSubmit() {
       this.form.studentId = this.radioSelect;
       this.studentName = this.radioSelectName;
+      this.studentPhone = this.radioSelectPhone;
       this.statusList.studentStatus = false;
     },
     onCurrentConfirm(value) {
@@ -576,6 +605,13 @@ export default {
     margin-left: 0.08rem;
   }
 }
+/deep/.van-field__right-icon, .phone_section {
+  display: flex;
+}
+.iconPhone {
+  width: .17rem;
+  height: .21rem;
+}
 .paddingB80 {
   padding-bottom: 0.8rem;
 }

Деякі файли не було показано, через те що забагато файлів було змінено