lex 1 rok temu
rodzic
commit
fc13f0f9c1

+ 30 - 0
src/components/card-type/index.module.less

@@ -140,4 +140,34 @@
     z-index: 99;
     transition: all .3s ease-in-out;
   }
+
+
+  .offShelfBg {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    border-radius: 14px;
+    background-color: rgba(0, 0, 0, 0.7);
+    z-index: 10;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-direction: column;
+
+    .offShelfTips {
+      font-size: 22px;
+      font-weight: 600;
+      color: #FFFFFF;
+      line-height: 30px;
+      padding-bottom: 32px;
+    }
+
+    .offShelfBtn {
+      height: 44px;
+      border-radius: 10px;
+      min-width: 124px;
+    }
+  }
 }

+ 19 - 1
src/components/card-type/index.tsx

@@ -57,14 +57,20 @@ export default defineComponent({
     item: {
       type: Object as PropType<itemType>,
       default: () => ({})
+    },
+    /** 是否下架 */
+    offShelf: {
+      type: Boolean,
+      default: false
     }
   },
   /**
    * @type {string} click 点击事件
    * @type {string} collect 收藏
    * @type {string} add 添加
+   * @type {string} offShelf 下架
    */
-  emits: ['click', 'collect', 'add'],
+  emits: ['click', 'collect', 'add', 'offShelf'],
   setup(props, { emit }) {
     const isAnimation = ref(false);
     const formatType = (type: string) => {
@@ -96,6 +102,18 @@ export default defineComponent({
         onMouseleave={() => {
           isAnimation.value = false;
         }}>
+        {/* 判断是否下架 */}
+        {props.offShelf && (
+          <div class={styles.offShelfBg}>
+            <p class={styles.offShelfTips}>该资源已被平台下架</p>
+            <NButton
+              type="primary"
+              class={styles.offShelfBtn}
+              onClick={() => emit('offShelf')}>
+              确认
+            </NButton>
+          </div>
+        )}
         <NCard
           class={[
             styles['card-section'],

+ 10 - 17
src/utils/request.ts

@@ -24,23 +24,16 @@ request.interceptors.request.use(
     const userStore = useUserStore();
     const Authorization = userStore.getToken || '';
     const authHeaders: any = {};
-    console.log(userStore.getUserInfo, 'userStore');
-    if (
-      userStore.getUserInfo &&
-      userStore.getUserInfo.schoolInfos &&
-      userStore.getUserInfo.schoolInfos[0]?.id &&
-      options.data
-    ) {
-      // console.log(
-      //   userStore.getUserInfo && userStore.getUserInfo.schoolInfos[0]?.id,
-      //   ' userStore.getUserInfo && userStore.getUserInfo.schoolInfos[0]?.id',
-      //   options
-      // );
-
-      options.data['schoolId'] =
-        (userStore.getUserInfo && userStore.getUserInfo.schoolInfos[0]?.id) ||
-        '';
-    }
+    // if (
+    //   userStore.getUserInfo &&
+    //   userStore.getUserInfo.schoolInfos &&
+    //   userStore.getUserInfo.schoolInfos[0]?.id &&
+    //   options.data
+    // ) {
+    //   options.data['schoolId'] =
+    //     (userStore.getUserInfo && userStore.getUserInfo.schoolInfos[0]?.id) ||
+    //     '';
+    // }
     if (
       Authorization &&
       !['/api-oauth/userlogin', '/api-auth/open/sendSms'].includes(url)

+ 10 - 0
src/views/natural-resources/api.ts

@@ -18,6 +18,16 @@ export const favorite = (params: any) => {
   });
 };
 
+/**
+ * 资源 - 删除
+ */
+export const materialRemove = (params: any) => {
+  return request.post('/edu-app/material/remove', {
+    requestType: 'form',
+    data: params
+  });
+};
+
 /** 音乐教材-新增 */
 export const api_lessonCoursewareSave = (params: any): Promise<any> => {
   return request.post('/edu-app/lessonCourseware/save', {

+ 28 - 3
src/views/natural-resources/components/my-collect/index.tsx

@@ -3,14 +3,16 @@ import styles from './index.module.less';
 import CardType from '@/components/card-type';
 import Pagination from '@/components/pagination';
 import SearchGroupResources from './search-group-resources';
-import { favorite, materialQueryPage } from '../../api';
-import { NSpin } from 'naive-ui';
+import { favorite, materialQueryPage, materialRemove } from '../../api';
+import { NSpin, useDialog, useMessage } from 'naive-ui';
 import TheEmpty from '@/components/TheEmpty';
 import CardPreview from '@/components/card-preview';
 
 export default defineComponent({
   name: 'share-resources',
   setup() {
+    const message = useMessage();
+    const dialog = useDialog();
     const state = reactive({
       searchWord: '',
       loading: false,
@@ -66,6 +68,25 @@ export default defineComponent({
       }
     };
 
+    // 单个删除
+    const onRemove = async (item: any) => {
+      try {
+        dialog.warning({
+          title: '提示',
+          content: '该资源已下架,是否删除?',
+          positiveText: '确定',
+          negativeText: '取消',
+          onPositiveClick: async () => {
+            await materialRemove({ id: item.id });
+            message.success('删除成功');
+            onSearch(state.searchGroup);
+          }
+        });
+      } catch {
+        //
+      }
+    };
+
     onMounted(() => {
       getList();
     });
@@ -82,11 +103,15 @@ export default defineComponent({
                 type: item.type,
                 title: item.name,
                 isCollect: !!item.favoriteFlag,
-                isSelected: item.sourceFrom === 'PLATFORM' ? true : false
+                isSelected: item.sourceFrom === 'PLATFORM' ? true : false,
+                enableFlag: item.enableFlag ? 1 : 0,
+                openFlag: item.openFlag
               };
               return (
                 <CardType
                   item={tmpItem}
+                  offShelf={item.enableFlag ? false : true}
+                  onOffShelf={() => onRemove(item)}
                   disabledMouseHover={false}
                   onClick={(val: any) => {
                     if (val.type === 'IMG') return;

+ 27 - 1
src/views/natural-resources/components/my-resources/index.tsx

@@ -3,7 +3,12 @@ import styles from './index.module.less';
 import CardType from '/src/components/card-type';
 import Pagination from '/src/components/pagination';
 import SearchGroupResources from './search-group-resources';
-import { favorite, materialQueryPage, materialRemoveAll } from '../../api';
+import {
+  favorite,
+  materialQueryPage,
+  materialRemove,
+  materialRemoveAll
+} from '../../api';
 import { NModal, NSpin, useDialog, useMessage } from 'naive-ui';
 import TheEmpty from '/src/components/TheEmpty';
 import UploadModal from './upload-modal';
@@ -114,6 +119,25 @@ export default defineComponent({
       }
     };
 
+    // 单个删除
+    const onRemove = async (item: any) => {
+      try {
+        dialog.warning({
+          title: '提示',
+          content: '该资源已下架,是否删除?',
+          positiveText: '确定',
+          negativeText: '取消',
+          onPositiveClick: async () => {
+            await materialRemove({ id: item.id });
+            message.success('删除成功');
+            onSearch(state.searchGroup);
+          }
+        });
+      } catch {
+        //
+      }
+    };
+
     onMounted(() => {
       getList();
     });
@@ -169,6 +193,8 @@ export default defineComponent({
                 <CardType
                   item={item}
                   disabledMouseHover={false}
+                  offShelf={item.enableFlag ? false : true}
+                  onOffShelf={() => onRemove(item)}
                   onClick={(val: any) => {
                     if (val.type === 'IMG') return;
                     state.show = true;

+ 16 - 6
src/views/prepare-lessons/components/directory-main/select-lessonware/index.tsx

@@ -111,25 +111,35 @@ export default defineComponent({
             }}
           </NInput>
           <NSelect
-            placeholder="版本"
+            placeholder="全部版本"
             clearable
-            options={catchStore.getMusicCategories}
+            options={[
+              { id: null, name: '全部版本' },
+              ...catchStore.getMusicCategories
+            ]}
             labelField="name"
             valueField="id"
             v-model:value={forms.bookVersionId}
             onUpdate:value={() => throttledFn()}
           />
           <NSelect
-            placeholder="请选择年级"
-            options={BOOK_DATA.grades}
+            placeholder="全部年级"
+            options={
+              [{ label: '全部年级', value: null }, ...BOOK_DATA.grades] as any
+            }
             v-model:value={forms.currentGradeNum}
             clearable
             filterable
             onUpdate:value={() => throttledFn()}
           />
           <NSelect
-            placeholder="请选择册别"
-            options={BOOK_DATA.bookTypes}
+            placeholder="全部册别"
+            options={
+              [
+                { label: '全部册别', value: null },
+                ...BOOK_DATA.bookTypes
+              ] as any
+            }
             v-model:value={forms.bookType}
             clearable
             onUpdate:value={() => throttledFn()}

+ 1 - 1
src/views/prepare-lessons/components/lesson-main/courseware/index.module.less

@@ -96,7 +96,7 @@
     width: 100%;
     height: 100%;
     text-align: right;
-    z-index: 2;
+    z-index: 98;
     cursor: move;
   }
 

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

@@ -56,7 +56,11 @@ export default defineComponent({
               return;
             }
             // 保存课件
-            await lessonPreTrainingBatchSave(forms.trainList);
+            await lessonPreTrainingBatchSave({
+              coursewareKnowledgeDetailId: prepareStore.getSelectKey,
+              subjectId: prepareStore.getSubjectId,
+              lessonPreTrainingDetails: forms.trainList
+            });
 
             forms.drag = false;
             message.success('编辑成功');

+ 5 - 2
src/views/prepare-lessons/components/resource-main/components/resource-item/resource-search-group/index.tsx

@@ -70,8 +70,11 @@ export default defineComponent({
           {forms.type === 'MUSIC' && (
             <div class={styles.searchSelect}>
               <NSelect
-                placeholder="教材"
-                options={catchStore.getMusicCategories}
+                placeholder="全部教材"
+                options={[
+                  { name: '全部教材', id: null },
+                  ...catchStore.getMusicCategories
+                ]}
                 clearable
                 labelField="name"
                 valueField="id"

+ 5 - 2
src/views/prepare-lessons/components/resource-main/components/select-music/resource-search-group/index.tsx

@@ -31,8 +31,11 @@ export default defineComponent({
         <div class={styles.searchGroup}>
           <div class={styles.searchSelect}>
             <NSelect
-              placeholder="教材"
-              options={catchStore.getMusicCategories}
+              placeholder="全部教材"
+              options={[
+                { name: '全部教材', id: null },
+                ...catchStore.getMusicCategories
+              ]}
               clearable
               labelField="name"
               valueField="id"

+ 10 - 0
src/views/prepare-lessons/model/attend-class/index.module.less

@@ -30,7 +30,17 @@
 
 .classList {
   max-height: 60vh;
+  min-height: 60vh;
   padding: 0 40px;
+
+  .listSection {
+    min-height: 60vh;
+  }
+
+  .emptySection {
+    display: flex;
+    align-items: center;
+  }
 }
 
 .thingItem {

+ 80 - 22
src/views/prepare-lessons/model/attend-class/index.tsx

@@ -1,9 +1,11 @@
-import { defineComponent, onMounted } from 'vue';
+import { defineComponent, onMounted, reactive, ref } from 'vue';
 import styles from './index.module.less';
-import { NInput, NScrollbar, NSelect, NThing } from 'naive-ui';
+import { NInput, NScrollbar, NSelect, NSpin, NThing } from 'naive-ui';
 import { useRouter } from 'vue-router';
 import { BOOK_DATA } from '/src/views/natural-resources/model/add-teaching';
 import { classGroupPage } from '../../api';
+import { useThrottleFn } from '@vueuse/core';
+import TheEmpty from '/src/components/TheEmpty';
 
 const classList: any = [];
 for (let i = 1; i <= 40; i++) {
@@ -15,6 +17,13 @@ export default defineComponent({
   emits: ['close'],
   setup(props, { emit }) {
     const router = useRouter();
+    const forms = reactive({
+      keyword: null,
+      currentGradeNum: null,
+      currentClass: null
+    });
+    const list = ref([] as any);
+    const loading = ref(false);
     const onAttendClass = (i: any) => {
       emit('close');
 
@@ -25,13 +34,23 @@ export default defineComponent({
     };
 
     const getList = async () => {
+      loading.value = true;
       try {
-        await classGroupPage({});
+        const { data } = await classGroupPage({
+          page: 1,
+          rows: 99,
+          ...forms
+        });
+        console.log(data, 'data');
+        list.value = data.rows || [];
       } catch {
         //
       }
+      loading.value = false;
     };
 
+    const throttleFn = useThrottleFn(() => getList(), 500);
+
     onMounted(() => {
       getList();
     });
@@ -39,31 +58,70 @@ export default defineComponent({
     return () => (
       <div class={styles.attendClass}>
         <div class={styles.attendClassSearch}>
-          <NInput placeholder="请输入班级名称" clearable>
+          <NInput
+            placeholder="请输入班级名称"
+            clearable
+            v-model:value={forms.keyword}
+            onKeyup={(e: KeyboardEvent) => {
+              if (e.code === 'Enter') {
+                throttleFn();
+              }
+            }}
+            onClear={() => throttleFn()}>
             {{
-              prefix: () => <span class="icon-search-input"></span>
+              prefix: () => (
+                <span
+                  class="icon-search-input"
+                  onClick={() => throttleFn()}></span>
+              )
             }}
           </NInput>
-          <NSelect placeholder="年级" clearable options={BOOK_DATA.grades} />
-          <NSelect placeholder="班级" clearable options={classList} />
+          <NSelect
+            placeholder="全部年级"
+            clearable
+            options={
+              [{ label: '全部年级', value: null }, ...BOOK_DATA.grades] as any
+            }
+            v-model:value={forms.currentGradeNum}
+            onUpdate:value={() => throttleFn()}
+          />
+          <NSelect
+            placeholder="全部班级"
+            clearable
+            options={[{ label: '全部班级', value: null }, ...classList]}
+            v-model:value={forms.currentClass}
+            onUpdate:value={() => throttleFn()}
+          />
         </div>
         <NScrollbar class={styles.classList}>
-          {[1, 2, 3, 4, 5, 6, 7].map(i => (
-            <div onClick={() => onAttendClass(i)}>
-              <NThing class={styles.thingItem}>
-                {{
-                  header: () => (
-                    <div class={styles.title}>一年级{i}班 23人</div>
-                  ),
-                  default: () => (
-                    <div class={styles.content}>
-                      人教版二年级上册 | 第一单元 |【歌表演】我和我的祖国
-                    </div>
-                  )
-                }}
-              </NThing>
+          <NSpin show={loading.value}>
+            <div
+              class={[
+                styles.listSection,
+                !loading.value && list.value.length <= 0
+                  ? styles.emptySection
+                  : ''
+              ]}>
+              {list.value.map((item: any) => (
+                <div onClick={() => onAttendClass(item)}>
+                  <NThing class={styles.thingItem}>
+                    {{
+                      header: () => (
+                        <div class={styles.title}>
+                          {item.name} {item.preStudentNum}人
+                        </div>
+                      ),
+                      default: () =>
+                        item.lastStudy && (
+                          <div class={styles.content}>{item.lastStudy}</div>
+                        )
+                    }}
+                  </NThing>
+                </div>
+              ))}
+              {!loading.value && list.value.length <= 0 && <TheEmpty />}
             </div>
-          ))}
+          </NSpin>
         </NScrollbar>
       </div>
     );