Ver Fonte

添加标签

lex-xin há 5 meses atrás
pai
commit
a76d936c01

+ 339 - 330
src/views/prepare-lessons/api.ts

@@ -1,330 +1,339 @@
-import request from '@/utils/request';
-
-/**
- * 备课 - 教学课件
- */
-export const lessonCoursewarePage = (params: any) => {
-  return request.post('/edu-app/lessonCourseware/page', {
-    data: params
-  });
-};
-
-/**
- * 备课 - 教学课件详情
- */
-export const lessonCoursewareDetail = (params: any) => {
-  return request.get('/edu-app/lessonCourseware/detail/' + params.id, {
-    params: params
-  });
-};
-
-/**
- * 备课 - 教学课件删除
- */
-export const lessonCoursewareRemove = (params: any) => {
-  return request.post('/edu-app/lessonCourseware/remove', {
-    requestType: 'form',
-    data: params
-  });
-};
-
-/**
- * 备课 - 课件列表
- */
-export const queryCourseware = (params: any) => {
-  return request.post('/edu-app/teacherKnowledgeMaterial/queryCourseware', {
-    data: params
-  });
-};
-
-/**
- * 备课 - 保存课件
- */
-export const saveCourseware = (params: any) => {
-  return request.post('/edu-app/teacherKnowledgeMaterial/saveCourseware', {
-    data: params
-  });
-};
-/**
- * 备课 - 删除课件
- */
-export const teacherKnowledgeMaterialDelete = (params: any) => {
-  return request.post('/edu-app/teacherKnowledgeMaterial/delete', {
-    requestType: 'form',
-    data: params
-  });
-};
-
-/**
- * 备课 - 训练列表
- */
-export const lessonPreTrainingPage = (params: any) => {
-  return request.post('/edu-app/lessonPreTraining/page', {
-    data: params
-  });
-};
-
-/**
- * 备课 - 新增训练
- */
-export const lessonPreTrainingAdd = (params: any) => {
-  return request.post('/edu-app/lessonPreTraining/add', {
-    data: params
-  });
-};
-
-/**
- * 备课 - 修改训练
- */
-export const lessonPreTrainingUpdate = (params: any) => {
-  return request.post('/edu-app/lessonPreTraining/update', {
-    data: params
-  });
-};
-
-/**
- * 备课 - 删除训练
- */
-export const lessonPreTrainingDelete = (params: any) => {
-  return request.post('/edu-app/lessonPreTraining/delete?ids=' + params.ids, {
-    data: params
-  });
-};
-
-/**
- * 备课 - 保存预训练曲目
- */
-export const lessonPreTrainingBatchSave = (params: any) => {
-  return request.post('/edu-app/lessonPreTraining/batchSave', {
-    data: params
-  });
-};
-
-/**
- * 备课 - 乐谱列表
- */
-export const musicSheetPage = (params: any) => {
-  return request.post('/edu-app/musicSheet/page', {
-    data: params
-  });
-};
-
-/**
- * 备课 - 班级列表
- */
-export const classGroupPage = (params: any) => {
-  return request.post('/edu-app/classGroup/page', {
-    data: params
-  });
-};
-
-/**
- * 备课 - 布置作业
- */
-export const lessonTrainingAdd = (params: any) => {
-  return request.post('/edu-app/lessonTraining/add', {
-    data: params
-  });
-};
-
-/**
- * 备课 - 开始上课
- */
-export const courseScheduleStart = (params: any) => {
-  return request.post('/edu-app/courseSchedule/start', {
-    data: params
-  });
-};
-
-/**
- * 备课 - 音乐教材版本
- */
-export const bookVersionPage = (params?: any) => {
-  return request.post('/edu-app/bookVersion/page', {
-    data: params
-  });
-};
-/**
- * 备课 - 使用课件打标记
- */
-export const tagUseCourseware = (params?: any) => {
-  return request.post('/edu-app/teacherKnowledgeMaterial/tagUseCourseware', {
-    requestType: 'form',
-    data: params
-  });
-};
-/**
- * 备课 - 更新上课记录
- */
-export const courseScheduleUpdate = (params?: any) => {
-  return request.post('/edu-app/courseSchedule/update', {
-    data: params
-  });
-};
-
-/**
- * 评测详情
- */
-export const musicPracticeRecordDetail = (params: any) => {
-  return request.get('/edu-app/musicPracticeRecord/detail/' + params.id, {
-    params: params
-  });
-};
-
-/**
- * 预设作业列表
- */
-export const lessonPreTrainingV2Page = (params: any) => {
-  return request.post('/edu-app/lessonPreTrainingV2/page', {
-    data: params
-  });
-};
-
-/**
- * 预设作业 添加/修改
- */
-export const lessonPreTrainingV2Save = (params: any) => {
-  return request.post('/edu-app/lessonPreTrainingV2/save', {
-    data: params
-  });
-};
-
-/**
- * 预设作业 删除
- */
-export const lessonPreTrainingV2Remove = (params: any) => {
-  return request.post('/edu-app/lessonPreTrainingV2/remove', {
-    data: params,
-    requestType: 'form'
-  });
-};
-
-/**
- * 预设作业 详情
- */
-export const lessonPreTrainingV2Detail = (params: any) => {
-  return request.get('/edu-app/lessonPreTrainingV2/detail/' + params.id);
-};
-
-/**
- * 课件列表
- */
-export const teacherChapterLessonCoursewareList = (params: any) => {
-  return request.post('/edu-app/teacherChapterLessonCourseware/list', {
-    data: params
-  });
-};
-
-/**
- * 课件 修改信息
- */
-export const api_updateCoursewareInfo = (params: any) => {
-  return request.post(
-    '/edu-app/teacherChapterLessonCourseware/updateCoursewareInfo',
-    {
-      data: params
-    }
-  );
-};
-
-/**
- * 课件 查询公开课件列表
- */
-export const api_queryOpenCoursewareByPage = (params: any) => {
-  return request.post(
-    '/edu-app/teacherChapterLessonCourseware/queryOpenCoursewareByPage',
-    {
-      data: params
-    }
-  );
-};
-
-/**
- * 课件 新增公开课件到我的课件
- */
-export const api_addByOpenCourseware = (params: any) => {
-  return request.post(
-    '/edu-app/teacherChapterLessonCourseware/addByOpenCourseware',
-    {
-      data: params
-    }
-  );
-};
-
-/**
- * 课件 新增课件
- */
-export const api_teacherChapterLessonCoursewareAdd = (params: any) => {
-  return request.post('/edu-app/teacherChapterLessonCourseware/add', {
-    data: params
-  });
-};
-
-/**
- * 课件 删除我的课件
- */
-export const api_teacherChapterLessonCoursewareRemove = (params: any) => {
-  return request.post(
-    '/edu-app/teacherChapterLessonCourseware/remove?id=' + params.id,
-    {
-      requestType: 'form'
-    }
-  );
-};
-
-/**
- * 课件 修改我的课件
- */
-export const api_teacherChapterLessonCoursewareUpdate = (params: any) => {
-  return request.post('/edu-app/teacherChapterLessonCourseware/update', {
-    data: params
-  });
-};
-
-/**
- * 课件 课件详情
- */
-export const api_teacherChapterLessonCoursewareDetail = (id: string) => {
-  return request.get('/edu-app/teacherChapterLessonCourseware/detail/' + id);
-};
-
-/**
- * 平台课件转老师课件
- */
-export const api_coursewareToTeacherCourseware = (id: string) => {
-  return request.post(
-    '/edu-app/teacherChapterLessonCourseware/coursewareToTeacherCourseware',
-    {
-      data: { id }
-    }
-  );
-};
-
-/**
- *  @description: 素材详情
- * @param params
- */
-export const api_materialDetail = (id: string) => {
-  return request.get('/edu-app/material/detail/' + id);
-};
-
-/**
- *  @description: 老师查询教材分类
- * @param params
- */
-export const api_lessonCoursewareTeacherCategory = () => {
-  return request.get('/edu-app/lessonCourseware/teacherCategory');
-};
-
-/**
- *  @description: 备课页面检测声部
- * @param params
- */
-export const api_courseScheduleCheck = (params: {
-  classGroupId: string;
-  chapterLessonCoursewareId: string;
-}) => {
-  return request.post('/edu-app/courseSchedule/check', {
-    data: params
-  });
-};
+import request from '@/utils/request';
+
+/**
+ * 备课 - 教学课件
+ */
+export const lessonCoursewarePage = (params: any) => {
+  return request.post('/edu-app/lessonCourseware/page', {
+    data: params
+  });
+};
+
+/**
+ * 备课 - 教学课件详情
+ */
+export const lessonCoursewareDetail = (params: any) => {
+  return request.get('/edu-app/lessonCourseware/detail/' + params.id, {
+    params: params
+  });
+};
+
+/**
+ * 备课 - 教学课件删除
+ */
+export const lessonCoursewareRemove = (params: any) => {
+  return request.post('/edu-app/lessonCourseware/remove', {
+    requestType: 'form',
+    data: params
+  });
+};
+
+/**
+ * 备课 - 课件列表
+ */
+export const queryCourseware = (params: any) => {
+  return request.post('/edu-app/teacherKnowledgeMaterial/queryCourseware', {
+    data: params
+  });
+};
+
+/**
+ * 备课 - 保存课件
+ */
+export const saveCourseware = (params: any) => {
+  return request.post('/edu-app/teacherKnowledgeMaterial/saveCourseware', {
+    data: params
+  });
+};
+/**
+ * 备课 - 删除课件
+ */
+export const teacherKnowledgeMaterialDelete = (params: any) => {
+  return request.post('/edu-app/teacherKnowledgeMaterial/delete', {
+    requestType: 'form',
+    data: params
+  });
+};
+
+/**
+ * 备课 - 训练列表
+ */
+export const lessonPreTrainingPage = (params: any) => {
+  return request.post('/edu-app/lessonPreTraining/page', {
+    data: params
+  });
+};
+
+/**
+ * 备课 - 新增训练
+ */
+export const lessonPreTrainingAdd = (params: any) => {
+  return request.post('/edu-app/lessonPreTraining/add', {
+    data: params
+  });
+};
+
+/**
+ * 备课 - 修改训练
+ */
+export const lessonPreTrainingUpdate = (params: any) => {
+  return request.post('/edu-app/lessonPreTraining/update', {
+    data: params
+  });
+};
+
+/**
+ * 备课 - 删除训练
+ */
+export const lessonPreTrainingDelete = (params: any) => {
+  return request.post('/edu-app/lessonPreTraining/delete?ids=' + params.ids, {
+    data: params
+  });
+};
+
+/**
+ * 备课 - 保存预训练曲目
+ */
+export const lessonPreTrainingBatchSave = (params: any) => {
+  return request.post('/edu-app/lessonPreTraining/batchSave', {
+    data: params
+  });
+};
+
+/**
+ * 备课 - 乐谱列表
+ */
+export const musicSheetPage = (params: any) => {
+  return request.post('/edu-app/musicSheet/page', {
+    data: params
+  });
+};
+
+/**
+ * 备课 - 班级列表
+ */
+export const classGroupPage = (params: any) => {
+  return request.post('/edu-app/classGroup/page', {
+    data: params
+  });
+};
+
+/**
+ * 备课 - 布置作业
+ */
+export const lessonTrainingAdd = (params: any) => {
+  return request.post('/edu-app/lessonTraining/add', {
+    data: params
+  });
+};
+
+/**
+ * 备课 - 开始上课
+ */
+export const courseScheduleStart = (params: any) => {
+  return request.post('/edu-app/courseSchedule/start', {
+    data: params
+  });
+};
+
+/**
+ * 备课 - 音乐教材版本
+ */
+export const bookVersionPage = (params?: any) => {
+  return request.post('/edu-app/bookVersion/page', {
+    data: params
+  });
+};
+/**
+ * 备课 - 使用课件打标记
+ */
+export const tagUseCourseware = (params?: any) => {
+  return request.post('/edu-app/teacherKnowledgeMaterial/tagUseCourseware', {
+    requestType: 'form',
+    data: params
+  });
+};
+/**
+ * 备课 - 更新上课记录
+ */
+export const courseScheduleUpdate = (params?: any) => {
+  return request.post('/edu-app/courseSchedule/update', {
+    data: params
+  });
+};
+
+/**
+ * 评测详情
+ */
+export const musicPracticeRecordDetail = (params: any) => {
+  return request.get('/edu-app/musicPracticeRecord/detail/' + params.id, {
+    params: params
+  });
+};
+
+/**
+ * 预设作业列表
+ */
+export const lessonPreTrainingV2Page = (params: any) => {
+  return request.post('/edu-app/lessonPreTrainingV2/page', {
+    data: params
+  });
+};
+
+/**
+ * 预设作业 添加/修改
+ */
+export const lessonPreTrainingV2Save = (params: any) => {
+  return request.post('/edu-app/lessonPreTrainingV2/save', {
+    data: params
+  });
+};
+
+/**
+ * 预设作业 删除
+ */
+export const lessonPreTrainingV2Remove = (params: any) => {
+  return request.post('/edu-app/lessonPreTrainingV2/remove', {
+    data: params,
+    requestType: 'form'
+  });
+};
+
+/**
+ * 预设作业 详情
+ */
+export const lessonPreTrainingV2Detail = (params: any) => {
+  return request.get('/edu-app/lessonPreTrainingV2/detail/' + params.id);
+};
+
+/**
+ * 课件列表
+ */
+export const teacherChapterLessonCoursewareList = (params: any) => {
+  return request.post('/edu-app/teacherChapterLessonCourseware/list', {
+    data: params
+  });
+};
+
+/**
+ * 课件 修改信息
+ */
+export const api_updateCoursewareInfo = (params: any) => {
+  return request.post(
+    '/edu-app/teacherChapterLessonCourseware/updateCoursewareInfo',
+    {
+      data: params
+    }
+  );
+};
+
+/**
+ * 课件 查询公开课件列表
+ */
+export const api_queryOpenCoursewareByPage = (params: any) => {
+  return request.post(
+    '/edu-app/teacherChapterLessonCourseware/queryOpenCoursewareByPage',
+    {
+      data: params
+    }
+  );
+};
+
+/**
+ * 课件 新增公开课件到我的课件
+ */
+export const api_addByOpenCourseware = (params: any) => {
+  return request.post(
+    '/edu-app/teacherChapterLessonCourseware/addByOpenCourseware',
+    {
+      data: params
+    }
+  );
+};
+
+/**
+ * 课件 新增课件
+ */
+export const api_teacherChapterLessonCoursewareAdd = (params: any) => {
+  return request.post('/edu-app/teacherChapterLessonCourseware/add', {
+    data: params
+  });
+};
+
+/**
+ * 课件 删除我的课件
+ */
+export const api_teacherChapterLessonCoursewareRemove = (params: any) => {
+  return request.post(
+    '/edu-app/teacherChapterLessonCourseware/remove?id=' + params.id,
+    {
+      requestType: 'form'
+    }
+  );
+};
+
+/**
+ * 课件 修改我的课件
+ */
+export const api_teacherChapterLessonCoursewareUpdate = (params: any) => {
+  return request.post('/edu-app/teacherChapterLessonCourseware/update', {
+    data: params
+  });
+};
+
+/**
+ * 课件 课件详情
+ */
+export const api_teacherChapterLessonCoursewareDetail = (id: string) => {
+  return request.get('/edu-app/teacherChapterLessonCourseware/detail/' + id);
+};
+
+/**
+ * 平台课件转老师课件
+ */
+export const api_coursewareToTeacherCourseware = (id: string) => {
+  return request.post(
+    '/edu-app/teacherChapterLessonCourseware/coursewareToTeacherCourseware',
+    {
+      data: { id }
+    }
+  );
+};
+
+/**
+ *  @description: 素材详情
+ * @param params
+ */
+export const api_materialDetail = (id: string) => {
+  return request.get('/edu-app/material/detail/' + id);
+};
+
+/**
+ *  @description: 老师查询教材分类
+ * @param params
+ */
+export const api_lessonCoursewareTeacherCategory = () => {
+  return request.get('/edu-app/lessonCourseware/teacherCategory');
+};
+
+/**
+ *  @description: 备课页面检测声部
+ * @param params
+ */
+export const api_courseScheduleCheck = (params: {
+  classGroupId: string;
+  chapterLessonCoursewareId: string;
+}) => {
+  return request.post('/edu-app/courseSchedule/check', {
+    data: params
+  });
+};
+
+/** 标签-所有 */
+export const api_chapterLessonCoursewareTag_queryAll = (
+  params?: any
+): Promise<any> => {
+  return request.post('/edu-app/chapterLessonCoursewareTag/queryAll', {
+    data: params
+  });
+};

+ 21 - 5
src/views/prepare-lessons/components/lesson-main/courseware-presets/index.module.less

@@ -59,23 +59,39 @@
     .popoverItem {
       font-weight: 600;
       font-size: max(16px, 12Px);
-      width: 120px;
-      height: 36px;
+      width: 196px;
+      height: 40px;
       color: #484F59;
       border-radius: 8px;
       text-align: center;
-      line-height: 36px;
+      line-height: 40px;
+      padding: 0 12px;
+      margin-bottom: 12px;
+
+      &:last-child {
+        margin-bottom: 0;
+      }
       cursor: pointer;
       &:hover {
         background: #F5F6FA;
       }
+
+      img {
+        width: 22px;
+        height: 22px;
+        margin-right: 12px;
+      }
+      span {
+        display: flex;
+        align-items: center;
+      }
     }
 
     :global {
       .n-popover {
         box-shadow: 0px 2px 12px 0px rgba(0,0,0,0.1);
-        border-radius: 10px;
-        padding: 8px 6px !important;
+        border-radius: 12px;
+        padding: 12px !important;
       }
     }
   }

+ 19 - 3
src/views/prepare-lessons/components/lesson-main/courseware-presets/index.tsx

@@ -30,6 +30,8 @@ import {
 import { usePrepareStore } from '/src/store/modules/prepareLessons';
 import add from '@/views/studentList/images/add.png';
 // import iconSlideRight from '../../../images/icon-slide-right.png';
+import iconBlank from '../../../images/icon-blank.png';
+import iconPpt from '../../../images/icon-ppt.png';
 import CoursewareType from '../../../model/courseware-type';
 import TheEmpty from '/src/components/TheEmpty';
 import RelatedClass from '../../../model/related-class';
@@ -59,6 +61,7 @@ import {
 } from '../../../api';
 import { vaildPPTUrl } from '/src/utils/urlUtils';
 import { useUserStore } from '/src/store/modules/users';
+import dayjs from 'dayjs';
 
 export default defineComponent({
   name: 'courseware-presets',
@@ -154,6 +157,13 @@ export default defineComponent({
             coverImg: firstItem && firstItem[0]?.bizInfo.coverImg,
             type: firstItem && firstItem[0]?.bizInfo.type,
             isNotWork: item.lessonPreTrainingNum <= 0 ? true : false, // 是否布置作业
+            chapterLessonCoursewareTagName: item.chapterLessonCoursewareTagName,
+            chapterLessonCoursewareTagColor:
+              item.chapterLessonCoursewareTagColor,
+            authorName: item.authorName,
+            updateTime: item.updateTime
+              ? dayjs(item.updateTime).format('YYYY-MM-DD')
+              : '',
             coursewareType: item.coursewareType,
             instrumentIds: item.instrumentIds,
             pptId: firstItem && firstItem[0]?.id,
@@ -735,7 +745,10 @@ export default defineComponent({
                               type: 'create'
                             });
                           }}>
-                          <span>数字化课件</span>
+                          <span>
+                            <img src={iconBlank} />
+                            空白课件
+                          </span>
                         </div>
                         <div
                           class={styles.popoverItem}
@@ -750,7 +763,10 @@ export default defineComponent({
                               openFlag: false
                             });
                           }}>
-                          <span>PPT</span>
+                          <span>
+                            <img src={iconPpt} />
+                            演示文稿(PPT)
+                          </span>
                         </div>
                       </div>
                     )
@@ -836,7 +852,7 @@ export default defineComponent({
                                 // 进入 ppt 编辑页面
                                 handleRouterPPT(
                                   item,
-                                  prepareStore.getInstrumentId
+                                  prepareStore.getInstrumentId as any
                                 );
                               } else {
                                 handlePptEdit(item);

+ 29 - 18
src/views/prepare-lessons/components/lesson-main/courseware-presets/select-related/index.module.less

@@ -15,8 +15,6 @@
     min-height: calc(var(--window-page-lesson-height) - 204px);
   }
 
-
-
   .emptySection {
     display: flex;
     align-items: center;
@@ -26,7 +24,7 @@
     padding: 10px 0;
     text-align: center;
 
-    &>div {
+    & > div {
       margin-bottom: 20px;
 
       &:last-child {
@@ -51,9 +49,9 @@
     height: 66px;
     margin-right: 10px;
     border-radius: 12px;
-    border: 1px solid #EFF0F2;
+    border: 1px solid #eff0f2;
     overflow: hidden;
-    .statusCon{
+    .statusCon {
       position: absolute;
       top: 2px;
       left: 2px;
@@ -65,8 +63,8 @@
         background: rgba(0, 0, 0, 0.5);
         border-radius: 4px;
         font-weight: 600;
-        font-size: max(12px, 11Px);
-        color: #FFFFFF;
+        font-size: max(12px, 11px);
+        color: #ffffff;
         padding: 2px 6px;
       }
     }
@@ -93,7 +91,7 @@
   .function {
     position: absolute;
     inset: 0;
-    background: rgba(0, 0, 0, .3);
+    background: rgba(0, 0, 0, 0.3);
     display: flex;
     align-items: center;
     justify-content: space-evenly;
@@ -106,11 +104,10 @@
       width: 27px;
       height: 27px;
       border-radius: 50%;
-      background: rgba(0, 0, 0, .4);
+      background: rgba(0, 0, 0, 0.4);
       display: flex;
       align-items: center;
       justify-content: center;
-
     }
 
     .iconLook {
@@ -124,7 +121,6 @@
       }
     }
 
-
     .iconAdd {
       &::before {
         display: inline-block;
@@ -140,15 +136,16 @@
   .itemContent {
     max-width: 158px;
     text-align: left;
+    flex: 1;
 
     .itemTitle {
       font-weight: 600;
-      font-size: 12Px;
+      font-size: 12px;
       color: #000000;
       line-height: 17px;
 
       &:hover {
-        color: #1677FF;
+        color: #1677ff;
         cursor: pointer;
       }
     }
@@ -159,20 +156,34 @@
       overflow: hidden;
       text-overflow: ellipsis;
       white-space: nowrap;
-      font-size: 11Px;
+      font-size: 11px;
       color: #777777;
       line-height: 15px;
     }
 
+    .updateTime {
+      font-size: 12px;
+      color: #777777;
+      padding-top: 2px;
+    }
+
+    .other {
+      display: flex;
+      justify-content: space-between;
+      span {
+        font-size: 12px;
+        color: #777777;
+      }
+    }
+
     .addCourseBtn {
-      margin-top: 8px;
       display: inline-block;
       padding: 2px 6px;
-      background: #E8F4FF;
+      background: #e8f4ff;
       border-radius: 2px;
       font-weight: 500;
-      font-size: max(10px, 10Px);
-      color: #0378EC;
+      font-size: max(10px, 10px);
+      color: #0378ec;
       cursor: pointer;
     }
   }

+ 8 - 0
src/views/prepare-lessons/components/lesson-main/courseware-presets/select-related/index.tsx

@@ -15,6 +15,7 @@ import { usePrepareStore } from '/src/store/modules/prepareLessons';
 import { api_queryOpenCoursewareByPage } from '/src/views/prepare-lessons/api';
 import Item from './item';
 import { eventGlobal } from '/src/utils';
+import dayjs from 'dayjs';
 
 export default defineComponent({
   name: 'share-resources',
@@ -69,6 +70,13 @@ export default defineComponent({
             instrumentNames: item.instrumentNames,
             fromChapterLessonCoursewareId: item.fromChapterLessonCoursewareId,
             name: item.name,
+            chapterLessonCoursewareTagName: item.chapterLessonCoursewareTagName,
+            chapterLessonCoursewareTagColor:
+              item.chapterLessonCoursewareTagColor,
+            authorName: item.authorName,
+            updateTime: item.updateTime
+              ? dayjs(item.updateTime).format('YYYY-MM-DD')
+              : '',
             coverImg: firstItem?.bizInfo.coverImg,
             type: firstItem?.bizInfo.type,
             isAdd: item.addFlag,

+ 18 - 5
src/views/prepare-lessons/components/lesson-main/courseware-presets/select-related/item.tsx

@@ -17,9 +17,18 @@ export default defineComponent({
       <div class={styles.itemModal}>
         <div class={styles.itemCover}>
           <div class={styles.statusCon}>
-            <div class={styles.status}>
-              {props.item.coursewareType === 'PPT' ? 'PPT' : '数字化'}
-            </div>
+            {props.item.chapterLessonCoursewareTagName ? (
+              <div
+                class={styles.status}
+                style={{
+                  background: props.item.chapterLessonCoursewareTagColor
+                }}>
+                {/* {props.item.coursewareType === 'PPT' ? 'PPT' : '数字化'} */}
+                {props.item.chapterLessonCoursewareTagName}
+              </div>
+            ) : (
+              ''
+            )}
           </div>
           <NImage src={props.item.coverImg} objectFit="cover" previewDisabled />
 
@@ -50,8 +59,12 @@ export default defineComponent({
 
           {/* <div class={styles.itemSubject}>{props.item.instrumentNames}</div> */}
 
-          <div class={styles.addCourseBtn} onClick={() => emit('add')}>
-            添加课件
+          <div class={styles.updateTime}>更新于 {props.item.updateTime}</div>
+          <div class={styles.other}>
+            <span>作者 {props.item.authorName}</span>
+            <div class={styles.addCourseBtn} onClick={() => emit('add')}>
+              添加
+            </div>
           </div>
         </div>
       </div>

+ 6 - 0
src/views/prepare-lessons/components/lesson-main/courseware-presets/select-related/resource-search-group/index.module.less

@@ -1,5 +1,11 @@
 .searchGroup {
   padding: 0 20px;
+  display: flex;
+
+  .searchSelect2 {
+    width: 100px;
+    margin-right: 12px;
+  }
 
   .searchSelect {
     padding: 0 0 20px;

+ 75 - 53
src/views/prepare-lessons/components/lesson-main/courseware-presets/select-related/resource-search-group/index.tsx

@@ -1,53 +1,75 @@
-import { PropType, defineComponent, onMounted, reactive } from 'vue';
-import styles from './index.module.less';
-import { NButton, NInput } from 'naive-ui';
-import { useCatchStore } from '/src/store/modules/catchData';
-import { useThrottleFn } from '@vueuse/core';
-
-export default defineComponent({
-  name: 'resource-search-group',
-  emits: ['search'],
-  setup(props, { emit }) {
-    const catchStore = useCatchStore();
-    const forms = reactive({
-      keyword: ''
-    });
-
-    const onSearch = () => {
-      emit('search', forms);
-    };
-
-    const throttledFn = useThrottleFn(() => onSearch(), 500);
-
-    // onMounted(async () => {});
-    return () => (
-      <>
-        <div class={styles.searchGroup}>
-          <NInput
-            type="text"
-            placeholder="请输入课件名称关键词"
-            clearable
-            v-model:value={forms.keyword}
-            class={styles.inputSearch}
-            onKeyup={(e: KeyboardEvent) => {
-              if (e.code === 'Enter') {
-                throttledFn();
-              }
-            }}
-            onClear={() => {
-              forms.keyword = '';
-              throttledFn();
-            }}>
-            {{
-              prefix: () => (
-                <span
-                  class={'icon-search-input'}
-                  onClick={() => throttledFn()}></span>
-              )
-            }}
-          </NInput>
-        </div>
-      </>
-    );
-  }
-});
+import { PropType, defineComponent, onMounted, reactive, ref } from 'vue';
+import styles from './index.module.less';
+import { NButton, NInput, NSelect } from 'naive-ui';
+import { useCatchStore } from '/src/store/modules/catchData';
+import { useThrottleFn } from '@vueuse/core';
+import { api_chapterLessonCoursewareTag_queryAll } from '/src/views/prepare-lessons/api';
+
+export default defineComponent({
+  name: 'resource-search-group',
+  emits: ['search'],
+  setup(props, { emit }) {
+    const catchStore = useCatchStore();
+    const forms = reactive({
+      keyword: '',
+      chapterLessonCoursewareTagId: ''
+    });
+    const tagList = ref<any[]>([]);
+
+    const onSearch = () => {
+      emit('search', forms);
+    };
+
+    const throttledFn = useThrottleFn(() => onSearch(), 500);
+
+    const getTagAll = async () => {
+      const { data } = await api_chapterLessonCoursewareTag_queryAll();
+      const result = data || [];
+
+      tagList.value = [{ name: '全部', id: '' }, ...result];
+    };
+
+    getTagAll();
+    // onMounted(async () => {});
+    return () => (
+      <>
+        <div class={styles.searchGroup}>
+          <NSelect
+            placeholder="请选择课件标签"
+            class={styles.searchSelect2}
+            options={tagList.value}
+            labelField="name"
+            valueField="id"
+            v-model:value={forms.chapterLessonCoursewareTagId}
+            onUpdate:value={() => {
+              throttledFn();
+            }}
+          />
+          <NInput
+            type="text"
+            placeholder="请输入课件标题/作者名称"
+            clearable={false}
+            v-model:value={forms.keyword}
+            class={styles.inputSearch}
+            onKeyup={(e: KeyboardEvent) => {
+              if (e.code === 'Enter') {
+                throttledFn();
+              }
+            }}
+            onClear={() => {
+              forms.keyword = '';
+              throttledFn();
+            }}>
+            {{
+              prefix: () => (
+                <span
+                  class={'icon-search-input'}
+                  onClick={() => throttledFn()}></span>
+              )
+            }}
+          </NInput>
+        </div>
+      </>
+    );
+  }
+});

+ 1 - 1
src/views/prepare-lessons/components/lesson-main/index.tsx

@@ -1,4 +1,4 @@
-import { defineComponent, nextTick, reactive, ref, watch } from 'vue';
+import { defineComponent, reactive, ref } from 'vue';
 import styles from './index.module.less';
 // import { NTabPane, NTabs } from 'naive-ui';
 import Courseware from './courseware/addCourseware';

BIN
src/views/prepare-lessons/images/icon-blank.png


BIN
src/views/prepare-lessons/images/icon-ppt.png


+ 1 - 7
src/views/prepare-lessons/index.tsx

@@ -1,10 +1,4 @@
-import {
-  defineComponent,
-  onMounted,
-  ref,
-  onUnmounted,
-  reactive
-} from 'vue';
+import { defineComponent, onMounted, ref, onUnmounted, reactive } from 'vue';
 import styles from './index.module.less';
 import DirectoryList from './components/directory-main';
 import LessonMain from './components/lesson-main';

+ 106 - 50
src/views/prepare-lessons/model/courseware-type/index.module.less

@@ -2,14 +2,14 @@
   position: relative;
   border-radius: 13px;
   padding: 10px 10px 0;
-  transition: all .2s ease;
-  background: #F4F7FD;
+  transition: all 0.2s ease;
+  background: #f4f7fd;
 
   &:hover {
     // background: #FFFFFF;
     // box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1);
     border-radius: 15px;
-    transition: all .2s ease;
+    transition: all 0.2s ease;
 
     // &:hover .footer {
     //   opacity: 1;
@@ -44,13 +44,13 @@
     right: 15px;
     // width: 60px;
     height: 27px;
-    background: #3D9EFF;
+    background: #3d9eff;
     border-radius: 5px;
     padding: 0 12px;
 
     z-index: 1;
     --n-border: none !important;
-    font-size: max(16px, 12Px) !important;
+    font-size: max(16px, 12px) !important;
   }
 
   :global {
@@ -67,8 +67,8 @@
     border-radius: 10px;
     overflow: hidden;
     background-color: #fff;
-    border: 1px solid #EFF0F2;
-    transition: all .2s ease;
+    border: 1px solid #eff0f2;
+    transition: all 0.2s ease;
 
     .noCoverImg {
       background-color: #000;
@@ -125,10 +125,23 @@
       .function {
         opacity: 1;
         visibility: visible;
-        transition: all .1s ease;
+        transition: all 0.1s ease;
       }
     }
 
+    .iconOpenFlag {
+      position: absolute;
+      right: 0;
+      top: 0;
+      font-weight: 600;
+      font-size: 13px;
+      color: #ffffff;
+      line-height: 18px;
+      background: rgba(0, 0, 0, 0.3);
+      border-radius: 0 10px 0px 10px;
+      padding: 2px 8px;
+    }
+
     .iconNoWork {
       position: absolute;
       right: 0;
@@ -139,7 +152,7 @@
       background: url('../../images/icon-no-work.png') no-repeat center;
       background-size: contain;
     }
-    .statusCon{
+    .statusCon {
       position: absolute;
       top: 6px;
       left: 6px;
@@ -150,8 +163,8 @@
         background: rgba(0, 0, 0, 0.5);
         border-radius: 4px;
         font-weight: 600;
-        font-size: max(12px, 11Px);
-        color: #FFFFFF;
+        font-size: max(12px, 11px);
+        color: #ffffff;
         padding: 2px 6px;
         & + .status {
           margin-left: 8px;
@@ -180,12 +193,11 @@
       .preview {
         opacity: 1;
         visibility: visible;
-        transition: all .2s ease;
+        transition: all 0.2s ease;
       }
     }
   }
 
-
   .preview {
     position: absolute;
     opacity: 0;
@@ -202,26 +214,68 @@
     cursor: pointer;
 
     .previewBtn {
-      background: #3D9EFF;
-      height: max(40px, 32Px);
+      background: #3d9eff;
+      height: max(40px, 32px);
       padding: 0 30px;
       border-radius: 12px;
       color: #fff;
     }
   }
 
+  .itemOperation {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    color: #777777;
+    font-size: max(13px, 11px);
+    padding-top: 8px;
+    .authorName {
+      max-width: 50%;
+      span {
+        display: block;
+        max-width: 100%;
+        white-space: nowrap;
+        overflow: hidden;
+        text-overflow: ellipsis;
+      }
+    }
+
+    &.itemOperationAdd {
+      flex-direction: column;
+      justify-content: flex-start;
+      > div {
+        flex: 1;
+        width: 100%;
+      }
+
+      .authorName {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        max-width: 100%;
+        span {
+          display: block;
+          max-width: 80%;
+          white-space: nowrap;
+          overflow: hidden;
+          text-overflow: ellipsis;
+        }
+      }
+    }
+  }
+
   .coursewareText {
     padding: 10px 0 0;
 
     .name {
       font-weight: 600;
-      font-size: max(14px, 13Px);
+      font-size: max(14px, 13px);
       color: #000000;
       display: flex;
       align-items: center;
 
       span {
-        list-style: 16Px;
+        list-style: 16px;
         max-width: 100%;
         display: inline-block;
         overflow: hidden;
@@ -231,9 +285,10 @@
 
       .iconEditName {
         display: none;
-        width: max(13px, 12Px);
-        height: max(13px, 12Px);
-        background: url('../../images/icon-edit-name.png') no-repeat center center;
+        width: max(13px, 12px);
+        height: max(13px, 12px);
+        background: url('../../images/icon-edit-name.png') no-repeat center
+          center;
         background-size: contain;
       }
     }
@@ -270,31 +325,28 @@
 
     .subjectName {
       padding-top: 5px;
-      font-size: 11Px;
+      font-size: 11px;
       color: #777777;
-      line-height: 16Px;
+      line-height: 16px;
     }
   }
 
   .addCourseBtn {
     display: inline-block;
     padding: 3px 8px;
-    background: #E8F4FF;
+    background: #e8f4ff;
     border-radius: 2px;
     font-weight: 500;
-    font-size: max(10px, 10Px);
-    color: #0378EC;
+    font-size: max(10px, 10px);
+    color: #0378ec;
     cursor: pointer;
   }
 }
 
 .operationBottom {
   padding-bottom: 10px;
-
-
 }
 
-
 .footer {
   // opacity: 0;
   // visibility: hidden;
@@ -307,7 +359,7 @@
   // right: 10px;
   // bottom: 12px;
   // background-color: #fff;
-  transition: all .2s ease;
+  transition: all 0.2s ease;
 
   :global {
     .n-space {
@@ -318,31 +370,39 @@
   .actionClass {
     cursor: pointer;
     flex: 1;
-    height: 30Px !important;
-    line-height: 30Px;
+    height: 30px !important;
+    line-height: 30px;
     background: #fff;
     // background: #198CFE;
     border-radius: 7px;
     text-align: center;
     margin-right: 10px;
-    font-size: max(14px, 13Px);
+    font-size: max(14px, 13px);
     // color: #fff;
-    color: #484F59;
+    color: #484f59;
     font-weight: 600;
-    transition: all .2s ease;
+    transition: all 0.2s ease;
 
     &:hover {
       background-color: rgba(25, 140, 254, 0.8);
-      transition: all .2s ease;
+      transition: all 0.2s ease;
       color: #fff;
     }
 
     &.actionWork {
       margin-right: 0;
       background: #fff;
-      color: #484F59;
+      color: #484f59;
       padding: 0 13px;
 
+      :global {
+        .n-badge-sup {
+          width: 7px;
+          height: 7px;
+          min-width: 7px;
+        }
+      }
+
       &:hover {
         background-color: rgba(25, 140, 254, 0.8);
         color: #fff;
@@ -351,9 +411,9 @@
   }
 
   .menu {
-    height: 30Px !important;
-    line-height: 30Px;
-    width: 30Px !important;
+    height: 30px !important;
+    line-height: 30px;
+    width: 30px !important;
     background: #fff;
     border-radius: 7px;
     display: flex;
@@ -364,8 +424,8 @@
     &::after {
       content: '';
       display: inline-block;
-      width: 13Px;
-      height: 10Px;
+      width: 13px;
+      height: 10px;
       background: url('../../images/icon-menu-default.png') no-repeat center;
       background-size: contain;
     }
@@ -378,7 +438,6 @@
     }
   }
 
-
   // .optons {
   //   width: 20Px;
   //   height: 20Px;
@@ -452,8 +511,8 @@
     display: flex;
     align-items: center;
     font-weight: 600;
-    font-size: max(13px, 12Px);
-    color: #484F59;
+    font-size: max(13px, 12px);
+    color: #484f59;
     line-height: 18px;
     border-radius: 8px;
     padding: 8px 13px;
@@ -465,7 +524,7 @@
     }
 
     &:hover {
-      background: #F5F6FA;
+      background: #f5f6fa;
     }
   }
 
@@ -481,7 +540,7 @@
 .function {
   position: absolute;
   inset: 0;
-  background: rgba(0, 0, 0, .3);
+  background: rgba(0, 0, 0, 0.3);
   display: flex;
   align-items: center;
   justify-content: center;
@@ -495,12 +554,11 @@
     width: 38px;
     height: 38px;
     border-radius: 50%;
-    background: rgba(0, 0, 0, .4);
+    background: rgba(0, 0, 0, 0.4);
     display: flex;
     align-items: center;
     justify-content: center;
     margin: 0 16px;
-
   }
 
   .iconLook {
@@ -514,7 +572,6 @@
     }
   }
 
-
   .iconAdd {
     &::before {
       display: inline-block;
@@ -525,5 +582,4 @@
       background-size: contain;
     }
   }
-
 }

+ 49 - 19
src/views/prepare-lessons/model/courseware-type/index.tsx

@@ -1,6 +1,6 @@
 import { defineComponent } from 'vue';
 import styles from './index.module.less';
-import { NButton, NImage, NPopover, NSpace, NTooltip } from 'naive-ui';
+import { NBadge, NButton, NImage, NPopover, NSpace, NTooltip } from 'naive-ui';
 // import iconEdit from '../../images/icon-courseware-edit.png';
 // import iconDelete from '../../images/icon-courseware-delete.png';
 // import iconEditName from '../../images/icon-edit-name.png';
@@ -75,11 +75,17 @@ export default defineComponent({
           ]}
           onClick={() => emit('click')}>
           <div class={styles.statusCon}>
-            <div class={styles.status}>
-              {props.item.coursewareType === 'PPT' ? 'PPT' : '数字化'}
-            </div>
-            {props.isShowOpenFlag && props.item.openFlag && (
-              <div class={styles.status}>公开</div>
+            {props.item.chapterLessonCoursewareTagName ? (
+              <div
+                class={styles.status}
+                style={{
+                  background: props.item.chapterLessonCoursewareTagColor
+                }}>
+                {/* {props.item.coursewareType === 'PPT' ? 'PPT' : '数字化'} */}
+                {props.item.chapterLessonCoursewareTagName}
+              </div>
+            ) : (
+              ''
             )}
           </div>
 
@@ -92,6 +98,10 @@ export default defineComponent({
 
           <i class={styles.defaultLook}></i>
 
+          {props.isShowOpenFlag && props.item.openFlag && (
+            <div class={styles.iconOpenFlag}>公开</div>
+          )}
+
           {props.isShowPreviewBtn && (
             <div class={styles.preview}>
               <NButton strong secondary class={styles.previewBtn}>
@@ -100,8 +110,6 @@ export default defineComponent({
             </div>
           )}
 
-          {/* 是否布置作业 */}
-          {props.item.isNotWork && <i class={styles.iconNoWork}></i>}
           {/* 是否有添加逻辑 */}
           {props.isShowAdd && (
             <div class={styles.function}>
@@ -132,13 +140,30 @@ export default defineComponent({
                 class={styles.iconEditName}
                 onClick={() => emit('editName')}></i> */}
             </div>
-            <div class={styles.subjectName}>{props.item.instrumentNames}</div>
+            {/* <div class={styles.subjectName}>{props.item.instrumentNames}</div> */}
 
-            {props.isShowAdd && (
-              <div class={styles.addCourseBtn} onClick={() => emit('add')}>
-                添加课件
-              </div>
-            )}
+            <div
+              class={[
+                styles.itemOperation,
+                props.isShowAdd ? styles.itemOperationAdd : ''
+              ]}>
+              <div>更新时间:{props.item.updateTime}</div>
+              {props.item.authorName ? (
+                <div class={styles.authorName}>
+                  <span>作者:{props.item.authorName}</span>
+
+                  {props.isShowAdd && (
+                    <div
+                      class={styles.addCourseBtn}
+                      onClick={() => emit('add')}>
+                      添加
+                    </div>
+                  )}
+                </div>
+              ) : (
+                ''
+              )}
+            </div>
           </div>
 
           {props.operate && (
@@ -150,11 +175,16 @@ export default defineComponent({
               </div>
 
               <NSpace>
-                <div
-                  class={[styles.actionClass, styles.actionWork]}
-                  onClick={() => emit('work')}>
-                  作业
-                </div>
+                <NBadge
+                  dot={props.item.isNotWork}
+                  offset={[-7, 6]}
+                  color="#EA4132"
+                  class={[styles.actionClass, styles.actionWork]}>
+                  <div onClick={() => emit('work')}>
+                    作业
+                    {/* 是否布置作业 */}
+                  </div>
+                </NBadge>
                 <NPopover
                   trigger="hover"
                   showArrow={false}

+ 42 - 2
src/views/prepare-lessons/model/related-class/index.tsx

@@ -1,11 +1,22 @@
-import { defineComponent, onMounted, onUnmounted, reactive, watch } from 'vue';
+import {
+  defineComponent,
+  onMounted,
+  onUnmounted,
+  reactive,
+  ref,
+  watch
+} from 'vue';
 import styles from './index.module.less';
 import { NCascader, NInput, NScrollbar, NSelect, NSpin } from 'naive-ui';
 import { useThrottleFn } from '@vueuse/core';
 import CoursewareType from '../courseware-type';
 import TheEmpty from '/src/components/TheEmpty';
-import { api_queryOpenCoursewareByPage } from '../../api';
+import {
+  api_chapterLessonCoursewareTag_queryAll,
+  api_queryOpenCoursewareByPage
+} from '../../api';
 import { eventGlobal } from '/src/utils';
+import dayjs from 'dayjs';
 
 export default defineComponent({
   name: 'related-class',
@@ -29,6 +40,7 @@ export default defineComponent({
   },
   emits: ['close', 'add', 'click'],
   setup(props, { emit }) {
+    const tagList = ref<any[]>([]);
     const forms = reactive({
       loading: false,
       finshed: false, // 是否加载完
@@ -39,6 +51,7 @@ export default defineComponent({
       tableList: [] as any,
       searchGroup: {
         instrumentId: props.instrumentId ? props.instrumentId : '',
+        chapterLessonCoursewareTagId: '',
         keyword: null
       }
     });
@@ -69,6 +82,13 @@ export default defineComponent({
             fromChapterLessonCoursewareId: item.fromChapterLessonCoursewareId,
             name: item.name,
             coverImg: firstItem?.bizInfo.coverImg,
+            chapterLessonCoursewareTagName: item.chapterLessonCoursewareTagName,
+            chapterLessonCoursewareTagColor:
+              item.chapterLessonCoursewareTagColor,
+            authorName: item.authorName,
+            updateTime: item.updateTime
+              ? dayjs(item.updateTime).format('YYYY-MM-DD')
+              : '',
             type: firstItem?.bizInfo.type,
             isAdd: item.addFlag,
             isNotWork: item.lessonPreTrainingNum <= 0 ? true : false, // 是否布置作业
@@ -105,6 +125,15 @@ export default defineComponent({
       getList();
     }, 500);
 
+    const getTagAll = async () => {
+      const { data } = await api_chapterLessonCoursewareTag_queryAll();
+      const result = data || [];
+
+      tagList.value = [{ name: '全部', id: '' }, ...result];
+    };
+
+    getTagAll();
+
     onMounted(() => {
       getList();
       eventGlobal.on('openCoursewareChanged', throttleFn);
@@ -116,6 +145,17 @@ export default defineComponent({
     return () => (
       <div class={styles.relatedClass}>
         <div class={styles.attendClassSearch}>
+          <NSelect
+            placeholder="请选择课件标签"
+            class={styles.searchSelect2}
+            options={tagList.value}
+            labelField="name"
+            valueField="id"
+            v-model:value={forms.searchGroup.chapterLessonCoursewareTagId}
+            onUpdate:value={() => {
+              throttleFn();
+            }}
+          />
           <NCascader
             placeholder="全部乐器"
             clearable