lex-xin 9 mēneši atpakaļ
vecāks
revīzija
caca9806b8

+ 32 - 38
src/views/afterSchoolManager/components/examinationDetail.vue

@@ -22,38 +22,8 @@
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
         :data="list"
       >
-        <el-table-column type="expand">
+        <!-- <el-table-column type="expand">
           <template slot-scope="props">
-            <!-- <el-table
-              style="width: 100%;padding-left: 48px"
-              :show-header="false"
-              :data="props.row.detailDtos"
-            >
-              <el-table-column
-                label="名称"
-                prop="musicScoreName"
-              ></el-table-column>
-              <el-table-column label="类型" prop="type"
-                ><template slot-scope="scope">{{
-                  scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频"
-                }}</template>
-              </el-table-column>
-              <el-table-column label="速度" prop="trainingSpeed">
-                <template slot-scope="scope">
-                  <span v-if="scope.row.homeworkType === 'MUSIC_SCORE'">
-                    {{ scope.row.trainingSpeed }}速度
-                  </span>
-                  <span v-else>--</span>
-                </template>
-              </el-table-column>
-              <el-table-column prop="times" label="次数/总计">
-                <template slot-scope="scope"
-                  >{{ scope.row.trainingTimes }}/{{
-                    scope.row.times
-                  }}次</template
-                >
-              </el-table-column>
-            </el-table> -->
             <el-row
               :gutter="20"
               v-for="(item, index) in props.row.detailDtos"
@@ -80,7 +50,7 @@
               >
             </el-row>
           </template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column prop="username" align="left" label="学生姓名">
         </el-table-column>
         <el-table-column prop="phone" align="left" label="手机号">
@@ -100,41 +70,65 @@
         </el-table-column>
         <el-table-column prop="trainingTime" align="left" label="完成时间">
           <template slot-scope="scope">
-            <div>{{ scope.row.trainingTime | dateForMinFormat }}</div>
+            <div v-if="scope.row.trainingTime">{{ scope.row.trainingTime | dateForMinFormat }}</div>
+            <div v-else>--</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="finishFlag" align="left" label="测验分数">
+          <template slot-scope="scope">
+            <div>{{ scope.row.trainingScore || 0 }}</div>
           </template>
         </el-table-column>
-        <el-table-column prop="finishFlag" align="right" label="测验分数">
+        <el-table-column prop="finishFlag" align="right" label="操作">
           <template slot-scope="scope">
-            <div>{{ scope.row.trainingScore }}</div>
+            <el-button type="text" @click="onDetail(scope.row)">查看详情</el-button>
           </template>
         </el-table-column>
       </el-table>
     </div>
+
+    <el-dialog
+      :title="userName + '评测详情'"
+      :visible.sync="classVisible"
+      width="800px"
+      append-to-body
+      v-if="classVisible"
+    >
+      <homeworkDetail :list="selectItem" />
+    </el-dialog>
   </div>
 </template>
 <script>
+import homeworkDetail from '../modal/homework-detail.vue'
 import {
   getLessonExaminationStudent,
   getExaminationSubjectPublic
 } from "../api";
 export default {
   props: ["courseScheduleId", "type"],
+  components: {homeworkDetail},
   data() {
     return {
+      classVisible: false,
       subjectId: [],
       list: [],
-      subjectList: []
+      subjectList: [],
+      userName: null,
+      selectItem: [],
     };
   },
   mounted() {
-    console.log(this.courseScheduleId, "mounted");
     if (this.courseScheduleId) {
       this.getStudentList(this.courseScheduleId);
       this.getPublicSubject();
     }
   },
-
   methods: {
+    onDetail(row) {
+      this.userName = row.username
+      this.selectItem = row.detailDtos || []
+      this.classVisible = true
+    },
     async getStudentList() {
       try {
         const res = await getLessonExaminationStudent({

+ 30 - 37
src/views/afterSchoolManager/components/studentWroks.vue

@@ -22,7 +22,7 @@
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
         :data="list"
       >
-        <el-table-column type="expand">
+        <!-- <el-table-column type="expand">
           <template slot-scope="props">
             <el-table
               style="width: 100%;padding-left: 48px"
@@ -54,39 +54,8 @@
                 >
               </el-table-column>
             </el-table>
-            <!-- <el-row
-              :gutter="20"
-              v-for="(item, index) in props.row.studentLessonTrainingDetail"
-              :key="index"
-            >
-              <el-col :span="6"
-                ><div class="rowFirst">{{ item.musicScoreName }}</div></el-col
-              >
-              <el-col :span="6"
-                ><div class="rowFirst">{{ scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频" }}</div></el-col
-              >
-              <el-col :span="6"
-                ><div class="rowSecond">
-
-                  <span v-if="item.homeworkType === 'MUSIC_SCORE'">
-              <span>{{ item.trainingSpeed }}</span> 速度
-            </span>
-            <span v-else>--</span>
-
-                </div></el-col
-              >
-              <el-col :span="6"
-                ><div class="rowlast">
-                  <span
-                    :class="item.trainingTimes >= item.times ? '' : 'red'"
-                    >{{ item.trainingTimes }}</span
-                  >
-                  / {{ item.times }} 次
-                </div></el-col
-              >
-            </el-row> -->
           </template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column prop="userName" align="left" label="学生姓名">
         </el-table-column>
         <el-table-column prop="phone" align="left" label="手机号">
@@ -98,28 +67,47 @@
             <div>{{ scope.row.submitTime | dateForMinFormat }}</div>
           </template>
         </el-table-column>
-        <el-table-column prop="finishFlag" align="right" label="练习情况">
+        <el-table-column prop="finishFlag" align="left" label="练习情况">
           <template slot-scope="scope">
             <div>{{ scope.row.finishFlag ? "已完成" : "未完成" }}</div>
           </template>
         </el-table-column>
-      </el-table>
+        <el-table-column prop="finishFlag" align="right" label="练习内容">
+        <template slot-scope="scope">
+          <el-button type="text" @click="onDetail(scope.row)">查看详情</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <el-dialog
+      :title="userName + '练习详情'"
+      :visible.sync="classVisible"
+      width="800px"
+      append-to-body
+      v-if="classVisible"
+    >
+      <homeworkDetail :list="selectItem" />
+    </el-dialog>
     </div>
   </div>
 </template>
 <script>
+import homeworkDetail from '@/views/attendanceManager/modal/homework-detail.vue'
 import { getHomeworkStudent, getHomeworkSubjectPublic } from "../api";
 export default {
   props: ["courseScheduleId", "type"],
+  components: {homeworkDetail},
   data() {
     return {
       subjectId: [],
       list: [],
-      subjectList: []
+      subjectList: [],
+      classVisible: false,
+      username: '',
+      selectItem: [],
     };
   },
   mounted() {
-    console.log(this.courseScheduleId, "mounted");
     if (this.courseScheduleId) {
       this.getStudentList(this.courseScheduleId);
       console.log(this.type, "type");
@@ -128,6 +116,11 @@ export default {
   },
 
   methods: {
+    onDetail(row) {
+      this.userName = row.userName
+      this.selectItem = row.studentLessonTrainingDetail || []
+      this.classVisible = true
+    },
     async getStudentList() {
       try {
         const res = await getHomeworkStudent({

+ 60 - 63
src/views/afterSchoolManager/components/textConment.vue

@@ -1,69 +1,49 @@
 <template>
   <div>
-    <!--   -->
-    <!-- <el-checkbox-group
-      v-if="subjectList.length > 1"
-      @change="checkSubject"
-      v-model="subjectId"
-      size="medium"
-      style="margin-bottom: 20px"
-    >
-      <el-checkbox-button
-        :class="subjectList.length == 1 ? 'one' : ''"
-        v-for="(item, index) in subjectList"
-        :key="index"
-        :label="item.id"
-        >{{ item.name }}</el-checkbox-button
-      >
-    </el-checkbox-group> -->
     <div v-for="(item, index) in fitterTraining" :key="index">
       <el-alert :title="'练习组' + (index + 1)" :closable="false">
         {{ item.subjectName }}
       </el-alert>
-      <div style="padding: 8px 16px 8px;">练习说明:{{ item.memo }}</div>
-      <el-table
-        :data="item.trainingDetailList"
-        :show-header="true"
-        style="width: 100%;margin-bottom: 12px;"
-        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-      >
-        <el-table-column label="名称" prop="musicScoreName"></el-table-column>
-        <el-table-column label="类型" prop="type"
-          ><template slot-scope="scope">{{
-            scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频"
-          }}</template>
-        </el-table-column>
-        <el-table-column label="速度" prop="trainingSpeed">
-          <template slot-scope="scope">
-            <span v-if="scope.row.homeworkType === 'MUSIC_SCORE'">
-              {{ scope.row.trainingSpeed }}速度
-            </span>
-            <span v-else>--</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="times" label="总计">
-          <template slot-scope="scope"
-            >{{ scope.row.times }}次</template
-          >
-        </el-table-column>
-      </el-table>
-    </div>
-    <!-- <el-row :gutter="20" v-for="(item, index) in fitterTraining" :key="index">
-      <el-col :span="12"
-        ><div class="rowFirst">{{ item.musicScoreName }}</div></el-col
-      >
-      <el-col :span="6"
-        ><div class="rowSecond">
-          <span>{{ item.trainingSpeed }}</span> 速度
-        </div></el-col
-      >
-      <el-col :span="6"
-        ><div class="rowlast">
-          <span> {{ item.times }}</span>
-          次
-        </div></el-col
-      >
-    </el-row> -->
+      <template v-if="item.trainingVideoAndMusic.length > 0">
+        <div style="padding: 8px 16px 8px;">练习说明:{{ item.memo }}</div>
+        <el-table
+          :data="item.trainingVideoAndMusic"
+          :show-header="true"
+          style="width: 100%;margin-bottom: 12px;"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        >
+          <el-table-column label="名称" prop="musicScoreName"></el-table-column>
+          <el-table-column label="类型" prop="type"
+            ><template slot-scope="scope">{{
+              scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频"
+            }}</template>
+          </el-table-column>
+          <el-table-column label="速度" prop="trainingSpeed">
+            <template slot-scope="scope">
+              <span v-if="scope.row.homeworkType === 'MUSIC_SCORE'">
+                {{ scope.row.trainingSpeed }}速度
+              </span>
+              <span v-else>--</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="times" label="总计">
+            <template slot-scope="scope"
+              >{{ scope.row.times }}次</template
+            >
+          </el-table-column>
+        </el-table>
+      </template>
+      <template v-if="item.trainingTxt.length > 0">
+        <el-table
+          :data="item.trainingTxt"
+          style="width: 100%;margin-bottom: 12px;"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        >
+          <el-table-column prop="desc" label="练习内容">
+          </el-table-column>
+        </el-table>
+      </template>
+      </div>
   </div>
 </template>
 <script>
@@ -79,9 +59,26 @@ export default {
     };
   },
   mounted() {
-    console.log(this.trainingDetailList);
-    this.fitterTraining = this.trainingDetailList.map(item => item);
-    // this.getPublicSubject();
+    const list = this.trainingDetailList
+    const temp = []
+    list.forEach((item) => {
+      const child = item.trainingDetailList || []
+      const videoMusic = []
+      const txt = []
+      child.forEach(c => {
+        if(c === "DESCRIPTION") {
+          txt.push(c)
+        } else {
+          videoMusic.push(c)
+        }
+      })
+      temp.push({
+        ...item,
+        trainingVideoAndMusic: videoMusic,
+        trainingTxt: txt
+      })
+    })
+    this.fitterTraining = temp.map(item => item);
   },
 
   methods: {

+ 174 - 0
src/views/afterSchoolManager/modal/homework-detail.vue

@@ -0,0 +1,174 @@
+<template>
+  <div class="studentWroks">
+    <template v-if="listMusic.length > 0">
+      <el-alert title="练习曲目" :closable="false" style="width: 99%;margin-bottom: 8px;"></el-alert>
+      <el-table
+        max-height="300px"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        :data="listMusic"
+        style="margin-bottom: 20px;"
+      >
+        <el-table-column prop="musicScoreName" width="260px" align="left" label="名称">
+        </el-table-column>
+        <el-table-column prop="subjectName" align="left" label="级别">
+          <template slot-scope="scope">
+            <div v-if="scope.row.heardLevel">{{ scope.row.heardLevel | palyLevelFilter }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="finishFlag" align="left" label="分数">
+          <template slot-scope="scope"
+            ><span
+                    :class="
+                      scope.row.trainingScore >= scope.row.standardScore ? '' : 'red'
+                    "
+                    >{{ scope.row.trainingScore }}</span
+                  >
+                  / {{ scope.row.standardScore }} 分</template
+          >
+        </el-table-column>
+        <el-table-column prop="finishFlag" align="right" label="操作">
+          <template slot-scope="scope">
+            <el-button v-if="scope.row.fileJson && scope.row.fileJson.length > 0" @click="onDetail(scope.row)" type="text">查看详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+
+    <template v-if="listVideo.length > 0">
+      <el-alert title="练习视频" :closable="false" style="width: 99%;margin-bottom: 8px;"></el-alert>
+      <el-table
+        max-height="300px"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        :data="listVideo"
+      >
+        <el-table-column prop="musicScoreName" align="left" label="名称">
+          </el-table-column>
+          <el-table-column prop="subjectName" align="left" label="级别">
+            <template slot-scope="scope">
+              <div v-if="scope.row.heardLevel">{{ scope.row.heardLevel | palyLevelFilter }}</div>
+            </template>
+          </el-table-column>
+          <el-table-column prop="finishFlag" align="left" label="分数">
+            <template slot-scope="scope"
+              ><span
+                      :class="
+                        scope.row.trainingScore >= scope.row.standardScore ? '' : 'red'
+                      "
+                      >{{ scope.row.trainingScore }}</span
+                    >
+                    / {{ scope.row.standardScore }} 分</template
+            >
+          </el-table-column>
+          <el-table-column prop="finishFlag" align="right" label="操作">
+          <template slot-scope="scope">
+            <el-button  @click="onDetail(scope.row)" type="text">查看详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+
+    <template v-if="listTxt.length > 0">
+      <el-alert title="练习" :closable="false" style="width: 99%;margin-bottom: 8px;"></el-alert>
+      <el-table
+        max-height="300px"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        :data="listTxt"
+      >
+        <el-table-column prop="desc" align="left" label="练习内容">
+        </el-table-column>
+        <el-table-column prop="finishFlag" align="right" label="操作">
+          <template slot-scope="scope">
+            <el-button v-if="scope.row.fileJson && scope.row.fileJson.length > 0" @click="onDetail(scope.row)" type="text">查看详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+
+    <el-dialog
+      title="查看"
+      width="680px"
+      append-to-body
+      :visible.sync="videoVisible"
+      v-if="videoVisible"
+    >
+      <div class="activeVideoWrap">
+        <videoTcplayer v-if="selectItem.fileType === 'VIDEO'" class="ql-video" :src="selectItem.filePath" />
+        <audio
+          id="audio"
+          controls
+          v-if="selectItem.fileType === 'SOUND'"
+          style="width: 100%"
+          :src="selectItem.filePath"
+        >
+          您的浏览器不支持视频播放
+        </audio>
+        <el-image 
+          v-if="selectItem.fileType === 'IMG'"
+          fit="contain"
+          style="width: 100%; height: 350px"
+          :src="selectItem.filePath" 
+          :preview-src-list="[selectItem.filePath]">
+        </el-image>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import videoTcplayer from "@/components/video-tcplayer";
+export default {
+  props: ["list", "groupType"],
+  components: { videoTcplayer },
+  data() {
+    return {
+      videoVisible: false,
+      listMusic: [],
+      listVideo: [],
+      listTxt: [],
+      selectItem: {}
+    };
+  },
+  mounted() {
+    this.__init()
+  },
+  methods: {
+    __init() {
+      const list = this.list || []
+      const tempMusic = []
+      const tempVideo = []
+      const tempTxt = []
+      list.forEach(item => {
+        if(item.homeworkType === "MUSIC_SCORE") {
+          tempMusic.push(item)
+        } else if(item.homeworkType === "VIDEO") {
+          tempVideo.push(item)
+        } else {
+          tempTxt.push(item)
+        }
+      })
+      
+      this.listMusic = tempMusic
+      this.listVideo = tempVideo
+      this.listTxt = tempTxt
+      console.log(this.listMusic, this.listVideo, this.listTxt, 'text')
+    },
+    onDetail(row) {
+      this.selectItem = row.fileJson && row.fileJson.length > 0 ? row.fileJson[0] : {}
+      this.videoVisible = true
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.activeVideoWrap {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+/deep/.video-js {
+  height: 360px;
+}
+.red {
+    color: #f44743;
+  }
+</style>

+ 30 - 27
src/views/attendanceManager/attendanceList/components/studentWroks.vue

@@ -20,7 +20,7 @@
       :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
       :data="list"
     >
-      <el-table-column type="expand">
+      <!-- <el-table-column type="expand">
         <template slot-scope="props">
           <el-table
             style="width: 100%;padding-left: 48px"
@@ -51,30 +51,8 @@
               >
             </el-table-column>
           </el-table>
-          <!-- <el-row
-            :gutter="20"
-            v-for="(item, index) in props.row.studentLessonTrainingDetail"
-            :key="index"
-          >
-            <el-col :span="12"
-              ><div class="rowFirst">{{ item.musicScoreName }}</div></el-col
-            >
-            <el-col :span="6"
-              ><div class="rowSecond">
-                <span>{{ item.trainingSpeed }}</span> 速度
-              </div></el-col
-            >
-            <el-col :span="6"
-              ><div class="rowlast">
-                <span :class="item.trainingTimes >= item.times ? '' : 'red'">{{
-                  item.trainingTimes
-                }}</span>
-                / {{ item.times }} 次
-              </div></el-col
-            >
-          </el-row> -->
         </template>
-      </el-table-column>
+      </el-table-column> -->
       <el-table-column prop="userName" align="left" label="学生姓名">
       </el-table-column>
       <el-table-column prop="phone" align="left" label="手机号">
@@ -83,7 +61,8 @@
       </el-table-column>
       <el-table-column prop="submitTime" align="left" label="完成时间">
         <template slot-scope="scope">
-          <div>{{ scope.row.submitTime | dateForMinFormat }}</div>
+          <div v-if= scope.row.submitTime>{{ scope.row.submitTime | dateForMinFormat }}</div>
+          <div v-else>--</div>
         </template>
       </el-table-column>
       <el-table-column prop="finishFlag" align="right" label="练习情况">
@@ -91,22 +70,41 @@
           <div>{{ scope.row.finishFlag ? "已完成" : "未完成" }}</div>
         </template>
       </el-table-column>
+      <el-table-column prop="finishFlag" align="right" label="练习内容">
+        <template slot-scope="scope">
+          <el-button type="text" @click="onDetail(scope.row)">查看详情</el-button>
+        </template>
+      </el-table-column>
     </el-table>
+
+    <el-dialog
+      :title="userName + '练习详情'"
+      :visible.sync="classVisible"
+      width="800px"
+      append-to-body
+      v-if="classVisible"
+    >
+      <homeworkDetail :list="selectItem" />
+    </el-dialog>
   </div>
 </template>
 <script>
 import { getHomeworkStudent, getHomeworkSubjectPublic } from "../api";
+import homeworkDetail from '@/views/attendanceManager/modal/homework-detail.vue'
 export default {
   props: ["courseScheduleId"],
+  components: {homeworkDetail},
   data() {
     return {
       subjectId: [],
       list: [],
-      subjectList: []
+      subjectList: [],
+      classVisible: false,
+      username: '',
+      selectItem: [],
     };
   },
   mounted() {
-    console.log(this.courseScheduleId, "mounted");
     if (this.courseScheduleId) {
       this.getStudentList(this.courseScheduleId);
       this.getPublicSubject();
@@ -114,6 +112,11 @@ export default {
   },
 
   methods: {
+    onDetail(row) {
+      this.userName = row.userName
+      this.selectItem = row.studentLessonTrainingDetail || []
+      this.classVisible = true
+    },
     async getStudentList() {
       try {
         const res = await getHomeworkStudent({

+ 59 - 64
src/views/attendanceManager/attendanceList/components/textConment.vue

@@ -1,70 +1,48 @@
 <template>
   <div>
-    <!--   -->
-    <!-- <el-checkbox-group
-      v-if="subjectList.length > 1"
-      @change="checkSubject"
-      v-model="subjectId"
-      size="medium"
-      style="margin-bottom: 20px"
-    >
-      <el-checkbox-button
-        :class="subjectList.length == 1 ? 'one' : ''"
-        v-for="(item, index) in subjectList"
-        :key="index"
-        :label="item.id"
-        >{{ item.name }}</el-checkbox-button
-      >
-    </el-checkbox-group> -->
     <div v-for="(item, index) in fitterTraining" :key="index">
       <el-alert :title="'练习组' + (index + 1)" :closable="false">
         {{ item.subjectName }}
       </el-alert>
-      <div style="padding: 8px 16px 8px;">练习说明:{{ item.memo }}</div>
-      <el-table
-        :data="item.trainingDetailList"
-        :show-header="true"
-        style="width: 100%;margin-bottom: 12px;"
-        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-      >
-        <el-table-column label="名称" prop="musicScoreName"></el-table-column>
-        <el-table-column label="类型" prop="type"
-          ><template slot-scope="scope">{{
-            scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频"
-          }}</template>
-        </el-table-column>
-        <el-table-column label="速度" prop="trainingSpeed">
-          <template slot-scope="scope">
-            <span v-if="scope.row.homeworkType === 'MUSIC_SCORE'">
-              {{ scope.row.trainingSpeed }}速度
-            </span>
-            <span v-else>--</span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="times" label="总计">
-          <template slot-scope="scope"
-            >{{ scope.row.times }}次</template
-          >
-        </el-table-column>
-      </el-table>
-      <!-- <el-table
-        :data="item.trainingDetailList"
-        :show-header="false"
-        style="width: 100%;margin-bottom: 12px;"
-        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
-      >
-        <el-table-column prop="musicScoreName"></el-table-column>
-        <el-table-column prop="trainingSpeed">
-          <template slot-scope="scope"
-            >{{ scope.row.trainingSpeed }}速度</template
-          >
-        </el-table-column>
-        <el-table-column prop="times">
-          <template slot-scope="scope"
-            >{{ scope.row.times }}次</template
-          >
-        </el-table-column>
-      </el-table> -->
+      <template v-if="item.trainingVideoAndMusic.length > 0">
+        <div style="padding: 8px 16px 8px;">练习说明:{{ item.memo }}</div>
+        <el-table
+          :data="item.trainingVideoAndMusic"
+          :show-header="true"
+          style="width: 100%;margin-bottom: 12px;"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        >
+          <el-table-column label="名称" prop="musicScoreName"></el-table-column>
+          <el-table-column label="类型" prop="type"
+            ><template slot-scope="scope">{{
+              scope.row.homeworkType === "MUSIC_SCORE" ? "曲目" : "视频"
+            }}</template>
+          </el-table-column>
+          <el-table-column label="速度" prop="trainingSpeed">
+            <template slot-scope="scope">
+              <span v-if="scope.row.homeworkType === 'MUSIC_SCORE'">
+                {{ scope.row.trainingSpeed }}速度
+              </span>
+              <span v-else>--</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="times" label="总计">
+            <template slot-scope="scope"
+              >{{ scope.row.times }}次</template
+            >
+          </el-table-column>
+        </el-table>
+      </template>
+      <template v-if="item.trainingTxt.length > 0">
+        <el-table
+          :data="item.trainingTxt"
+          style="width: 100%;margin-bottom: 12px;"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        >
+          <el-table-column prop="desc" label="练习内容">
+          </el-table-column>
+        </el-table>
+      </template>
     </div>
   </div>
 </template>
@@ -81,9 +59,26 @@ export default {
     };
   },
   mounted() {
-    console.log(this.trainingDetailList);
-    this.fitterTraining = this.trainingDetailList.map(item => item);
-    // this.getPublicSubject();
+    const list = this.trainingDetailList
+    const temp = []
+    list.forEach((item) => {
+      const child = item.trainingDetailList || []
+      const videoMusic = []
+      const txt = []
+      child.forEach(c => {
+        if(c === "DESCRIPTION") {
+          txt.push(c)
+        } else {
+          videoMusic.push(c)
+        }
+      })
+      temp.push({
+        ...item,
+        trainingVideoAndMusic: videoMusic,
+        trainingTxt: txt
+      })
+    })
+    this.fitterTraining = temp.map(item => item);
   },
 
   methods: {

+ 154 - 0
src/views/attendanceManager/modal/homework-detail.vue

@@ -0,0 +1,154 @@
+<template>
+  <div class="studentWroks">
+    <template v-if="listMusic.length > 0">
+      <el-alert title="练习曲目" :closable="false" style="width: 99%;margin-bottom: 8px;"></el-alert>
+      <el-table
+        max-height="300px"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        :data="listMusic"
+        style="margin-bottom: 20px;"
+      >
+        <el-table-column prop="musicScoreName" width="260px" align="left" label="名称">
+        </el-table-column>
+        <el-table-column prop="subjectName" align="left" label="练习">
+          <template slot-scope="scope">
+            <div>{{ scope.row.start }}-{{ scope.row.end }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="trainingSpeed" align="left" label="速度">
+        </el-table-column>
+        <el-table-column prop="finishFlag" align="left" label="次数">
+          <template slot-scope="scope"
+            >{{ scope.row.trainingTimes }}/{{ scope.row.times }}次</template
+          >
+        </el-table-column>
+        <el-table-column prop="finishFlag" align="right" label="操作">
+          <template slot-scope="scope">
+            <el-button v-if="scope.row.fileJson && scope.row.fileJson.length > 0" @click="onDetail(scope.row)" type="text">查看详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+
+    <template v-if="listVideo.length > 0">
+      <el-alert title="练习视频" :closable="false" style="width: 99%;margin-bottom: 8px;"></el-alert>
+      <el-table
+        max-height="300px"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        :data="listVideo"
+      >
+        <el-table-column prop="musicScoreName" align="left" label="名称">
+        </el-table-column>
+        <el-table-column prop="finishFlag" align="left" label="次数">
+          <template slot-scope="scope"
+            >{{ scope.row.trainingTimes }}/{{ scope.row.times }}次</template
+          >
+        </el-table-column>
+        <el-table-column prop="finishFlag" align="right" label="操作">
+          <template slot-scope="scope">
+            <el-button v-if="scope.row.fileJson && scope.row.fileJson.length > 0" @click="onDetail(scope.row)" type="text">查看详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+
+    <template v-if="listTxt.length > 0">
+      <el-alert title="练习" :closable="false" style="width: 99%;margin-bottom: 8px;"></el-alert>
+      <el-table
+        max-height="300px"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        :data="listTxt"
+      >
+        <el-table-column prop="desc" align="left" label="练习内容">
+        </el-table-column>
+        <el-table-column prop="finishFlag" align="right" label="操作">
+          <template slot-scope="scope">
+            <el-button v-if="scope.row.fileJson && scope.row.fileJson.length > 0" @click="onDetail(scope.row)" type="text">查看详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </template>
+
+    <el-dialog
+      title="查看"
+      width="680px"
+      append-to-body
+      :visible.sync="videoVisible"
+      v-if="videoVisible"
+    >
+      <div class="activeVideoWrap">
+        <videoTcplayer v-if="selectItem.fileType === 'VIDEO'" class="ql-video" :src="selectItem.filePath" />
+        <audio
+          id="audio"
+          controls
+          v-if="selectItem.fileType === 'SOUND'"
+          style="width: 100%"
+          :src="selectItem.filePath"
+        >
+          您的浏览器不支持视频播放
+        </audio>
+        <el-image 
+          v-if="selectItem.fileType === 'IMG'"
+          fit="contain"
+          style="width: 100%; height: 350px"
+          :src="selectItem.filePath" 
+          :preview-src-list="[selectItem.filePath]">
+        </el-image>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import videoTcplayer from "@/components/video-tcplayer";
+export default {
+  props: ["list", "groupType"],
+  components: { videoTcplayer },
+  data() {
+    return {
+      videoVisible: false,
+      listMusic: [],
+      listVideo: [],
+      listTxt: [],
+      selectItem: {}
+    };
+  },
+  mounted() {
+    this.__init()
+  },
+  methods: {
+    __init() {
+      const list = this.list || []
+      const tempMusic = []
+      const tempVideo = []
+      const tempTxt = []
+      list.forEach(item => {
+        if(item.homeworkType === "MUSIC_SCORE") {
+          tempMusic.push(item)
+        } else if(item.homeworkType === "VIDEO") {
+          tempVideo.push(item)
+        } else {
+          tempTxt.push(item)
+        }
+      })
+      this.listMusic = tempMusic
+      this.listVideo = tempVideo
+      this.listTxt = tempTxt
+    },
+    onDetail(row) {
+      this.selectItem = row.fileJson && row.fileJson.length > 0 ? row.fileJson[0] : {}
+      this.videoVisible = true
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+.activeVideoWrap {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+}
+/deep/.video-js {
+  height: 360px;
+}
+</style>

+ 61 - 0
src/views/categroyManager/generalSettings/overallManager.vue

@@ -401,6 +401,67 @@
             条练习
           </el-form-item>
         </el-row>
+
+        <el-row>
+          <el-form-item
+            prop="280"
+            :rules="[
+              {
+                required: false,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入正确天数'
+              }
+            ]"
+          >
+            作业文件从截止之日起:
+            <el-input v-model="form['280']" placeholder="请输入天数">
+              <template slot="append"
+                >天</template
+              >
+            </el-input>
+            后过期
+          </el-form-item>
+        </el-row>
+        <el-row>
+          <el-form-item
+            prop="281"
+            :rules="[
+              {
+                required: true,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入正确秒数'
+              }
+            ]"
+          >
+            <span style="color: red">*</span>作业视频最长:
+            <el-input v-model="form['281']" placeholder="请输入秒数">
+              <template slot="append"
+                >秒</template
+              >
+            </el-input>
+            
+          </el-form-item>
+        </el-row>
+        <el-row>
+          <el-form-item
+            prop="282"
+            :rules="[
+              {
+                required: true,
+                pattern: /^[1-9][0-9]*$/,
+                message: '请输入分钟数'
+              }
+            ]"
+          >
+          <span style="color: red">*</span>作业音频最长:
+            <el-input v-model="form['282']" placeholder="请输入分钟数">
+              <template slot="append"
+                >分钟</template
+              >
+            </el-input>
+            
+          </el-form-item>
+        </el-row>
       </el-form>
       <!-- 列表 -->
       <!-- <el-row>