lex 1 år sedan
förälder
incheckning
3637738d14
1 ändrade filer med 442 tillägg och 442 borttagningar
  1. 442 442
      src/views/attend-class/model/train-type/index.tsx

+ 442 - 442
src/views/attend-class/model/train-type/index.tsx

@@ -1,442 +1,442 @@
-import { PropType, computed, defineComponent, ref } from 'vue';
-import styles from './index.module.less';
-import {
-  NButton,
-  NEllipsis,
-  NSpace,
-  NImage,
-  NTag,
-  NModal,
-  NProgress,
-  NTooltip,
-  useMessage,
-  NDivider
-} from 'naive-ui';
-import iconDelete from '@/views/prepare-lessons/images/icon-delete-default.png';
-import iconEdit from './images/icon-edit.png';
-// import iconDelete from './images/icon-delete2.png';
-import iconBackLook from './images/icon-back-look.png';
-import iconReport from './images/icon-report.png';
-import { useUserStore } from '/src/store/modules/users';
-import CardPreview from '/src/components/card-preview';
-import { vaildMusicScoreUrl, vaildUrl } from '/src/utils/urlUtils';
-import { musicPracticeRecordDetail } from '/src/views/prepare-lessons/api';
-import { checkUrlType } from '/src/utils';
-import TheNoticeBar from '/src/components/TheNoticeBar';
-type ItemType = {
-  id: string | number;
-  trainingType: 'PRACTICE' | 'EVALUATION';
-  musicId: string | number;
-  coverImg: string;
-  musicName: string;
-  typeList: string[];
-  allTimes?: number;
-  trainingTimes?: number;
-  recordId?: string | number; // 评测记录编号
-};
-
-export default defineComponent({
-  name: 'train-type',
-  props: {
-    type: {
-      type: String as PropType<'prepare' | 'homework'>,
-      default: 'homework'
-    },
-    item: {
-      type: Object as PropType<ItemType>,
-      default: () => ({})
-    },
-    isDelete: {
-      type: Boolean,
-      default: false
-    },
-    isDisabled: {
-      type: Boolean,
-      default: false
-    },
-    isLarge: {
-      type: Boolean,
-      default: false
-    },
-    /** 是否下架 */
-    offShelf: {
-      type: Boolean,
-      default: false
-    },
-    isCLassWork: {
-      type: Boolean,
-      default: false
-    },
-    from: {
-      type: String,
-      default: ''
-    }
-  },
-  emits: ['click', 'delete', 'edit', 'offShelf'],
-  setup(props, { emit }) {
-    const userStore = useUserStore();
-    const message = useMessage();
-    const removeVisiable = ref(false);
-    const previewShow = ref(false);
-    const preivewItem = ref({
-      type: 'MUSIC',
-      content: props.item.musicId,
-      title: props.item.musicName
-    });
-    const onDetail = () => {
-      // const origin = /(localhost|192)/.test(location.host)
-      //   ? 'https://dev.kt.colexiu.com'
-      //   : location.origin;
-      // const src = `${origin}/instrument?platform=pc&modelType=practise&id=${props.item.musicId}&Authorization=${userStore.getToken}`;
-      // window.open(src, '_blank');
-      // console.log(props.item, 'item');
-      // console.log(props.item, '1212');
-      preivewItem.value = {
-        type: 'MUSIC',
-        content: props.item.musicId,
-        title: props.item.musicName
-      };
-      previewShow.value = true;
-    };
-
-    const reportSrc = ref('');
-    const detailVisiable = ref(false);
-    const gotoRecode = (row: any) => {
-      if (!row.id) {
-        message.error('暂无评测记录');
-        return;
-      }
-      const tockn = userStore.getToken;
-      reportSrc.value =
-        vaildMusicScoreUrl() +
-        `/instrument/#/evaluat-report?id=${row.id}&Authorization=${tockn}`;
-      detailVisiable.value = true;
-    };
-
-    const onBackLook = async () => {
-      try {
-        if (!props.item?.recordId) {
-          message.error('暂无数据');
-          return;
-        }
-        const { data } = await musicPracticeRecordDetail({
-          id: props.item.recordId
-        });
-        if (data.videoFilePath || data.recordFilePath) {
-          let lookTitle = '';
-          if (data.videoFilePath) {
-            lookTitle = checkUrlType(data.videoFilePath);
-          } else {
-            lookTitle = checkUrlType(data.recordFilePath);
-          }
-          const lookUrl = data.videoFilePath || data.recordFilePath;
-          preivewItem.value.content = lookUrl;
-          preivewItem.value.title = props.item.musicName;
-          if (lookTitle === 'video') {
-            preivewItem.value.type = 'VIDEO';
-          } else if (lookTitle === 'audio') {
-            preivewItem.value.type = 'SONG';
-          }
-          previewShow.value = true;
-        } else {
-          message.error('暂无数据');
-        }
-      } catch {
-        //
-      }
-    };
-
-    const isPass = computed(() => {
-      const item = props.item;
-      if (item) {
-        if (item.trainingType === 'EVALUATION') {
-          return (item.trainingTimes || 0) >= (item.allTimes || 0)
-            ? true
-            : false;
-        } else {
-          return (item.trainingTimes
-            ? parseInt(item.trainingTimes / 60 + '')
-            : 0) >= (item.allTimes || 0)
-            ? true
-            : false;
-        }
-      } else {
-        return false;
-      }
-    });
-
-    const isDownload = computed(() => {
-      if (
-        props.isDisabled &&
-        !props.isCLassWork &&
-        props.item.trainingType === 'EVALUATION'
-      ) {
-        return true;
-      } else {
-        return false;
-      }
-    });
-
-    return () => (
-      <div
-        class={[
-          styles.trainType,
-          props.item.trainingType === 'EVALUATION' ? styles.evaluationType : ''
-        ]}
-        onClick={() => emit('click', props.item)}>
-        <div
-          class={[
-            styles['train-content'],
-            props.isDisabled && !props.isCLassWork && styles.trainDisabled,
-            props.isLarge && styles.trainDisabled
-          ]}
-          onClick={() => {
-            if (props.isDisabled && !props.isCLassWork) {
-              return;
-            }
-            onDetail();
-          }}>
-          <NImage
-            src={props.item.coverImg}
-            previewDisabled
-            objectFit="contain"
-          />
-          {props.isDisabled && !props.isCLassWork ? (
-            <div class={styles.disPreview}>
-              <NProgress
-                percentage={
-                  props.item.trainingType === 'EVALUATION'
-                    ? (Number(props.item.trainingTimes) /
-                        Number(props.item.allTimes)) *
-                      100
-                    : (Number(props.item.trainingTimes) /
-                        60 /
-                        Number(props.item.allTimes)) *
-                      100
-                }
-                offset-degree={180}
-                type="circle"
-                rail-color={'8b8b8b'}
-                color={isPass.value ? '#6CFFC1' : '#FF7794'}
-                style="width: 120px; margin: 0  0 10px;">
-                <div class={styles.BProgress}>
-                  {props.item.trainingType === 'EVALUATION' ? (
-                    <h4>
-                      {props.item.trainingTimes}
-
-                      <span>分</span>
-                    </h4>
-                  ) : (
-                    <h4>
-                      {props.item.trainingTimes
-                        ? parseInt(props.item.trainingTimes / 60 + '')
-                        : 0}
-                      <span>分钟</span>
-                    </h4>
-                  )}
-
-                  <p>
-                    {props.item.trainingType === 'EVALUATION'
-                      ? '学生分数'
-                      : '实际练习'}{' '}
-                  </p>
-                </div>
-              </NProgress>
-              <p class={styles.disPreviewDivide}>
-                {props.item.trainingType === 'EVALUATION'
-                  ? '合格分数'
-                  : '练习时长要求'}
-                {props.item.allTimes}
-                {props.item.trainingType === 'EVALUATION' ? '分' : '分钟'}
-              </p>
-            </div>
-          ) : null}
-
-          {/* <div class={styles.preview} onClick={onDetail}>
-              <NButton strong secondary class={styles.previewBtn}>
-                预览
-              </NButton>
-            </div> */}
-          {props.isDelete && (
-            <img
-              src={iconDelete}
-              class={styles.iconDelete}
-              onClick={(e: MouseEvent) => {
-                e.stopPropagation();
-                emit('delete', props.item);
-              }}
-            />
-          )}
-        </div>
-        <div class={styles['train-footer']}>
-          <div class={styles.trainInfo}>
-            <div class={styles.trainName}>
-              <span class={[styles.type, styles[props.item.trainingType]]}>
-                {props.item.trainingType === 'EVALUATION' ? '评测' : '练习'}
-              </span>
-              {/* <NEllipsis tooltip={false}>{props.item.musicName}</NEllipsis> */}
-              <div class={styles['title-text']}>
-                <TheNoticeBar text={props.item.musicName} />
-              </div>
-            </div>
-            <div class={styles.tagList}>
-              {props.item.typeList?.map((type: string, index: number) => (
-                <>
-                  <span>{type}</span>
-                  {props.item.typeList.length - 1 > index && (
-                    <NDivider vertical />
-                  )}
-                </>
-              ))}
-            </div>
-          </div>
-
-          {props.isDisabled ? null : (
-            <NSpace size={12}>
-              <n-button
-                quaternary
-                disabled={!props.isDelete}
-                class={styles.operation}
-                onClick={(e: MouseEvent) => {
-                  e.stopPropagation();
-                  emit('edit', props.item);
-                }}>
-                <NTooltip showArrow={false}>
-                  {{
-                    trigger: () => <i class={styles.iconEdit}></i>,
-                    // <img src={iconEdit} />
-                    default: '编辑'
-                  }}
-                </NTooltip>
-              </n-button>
-              {/* <n-button
-                quaternary
-                disabled={!props.isDelete}
-                class={styles.operation}
-                onClick={(e: MouseEvent) => {
-                  e.stopPropagation();
-                  // onDelete();
-                  // removeVisiable.value = true;
-                  emit('delete', props.item);
-                }}>
-                <NTooltip showArrow={false}>
-                  {{
-                    trigger: () => <img src={iconDelete} />,
-                    default: '删除'
-                  }}
-                </NTooltip>
-              </n-button> */}
-            </NSpace>
-          )}
-
-          {/* 只有评测的时候才有 */}
-          {props.isDisabled &&
-          !props.isCLassWork &&
-          props.item.trainingType === 'EVALUATION' &&
-          props.item?.recordId ? (
-            <>
-              <NSpace size={12}>
-                <n-button
-                  quaternary
-                  disabled={props.isDelete}
-                  class={styles.operation}
-                  onClick={(e: MouseEvent) => {
-                    e.stopPropagation();
-                    gotoRecode({ id: props.item.recordId });
-                  }}>
-                  <NTooltip showArrow={false}>
-                    {{
-                      trigger: () => <img src={iconReport} />,
-                      default: '评测报告'
-                    }}
-                  </NTooltip>
-                </n-button>
-                <n-button
-                  quaternary
-                  disabled={props.isDelete}
-                  class={styles.operation}
-                  onClick={(e: MouseEvent) => {
-                    e.stopPropagation();
-                    // onDetail();
-                    // musicPracticeRecordId;
-                    onBackLook();
-                  }}>
-                  <NTooltip showArrow={false}>
-                    {{
-                      trigger: () => <img src={iconBackLook} />,
-                      default: '查看回放'
-                    }}
-                  </NTooltip>
-                </n-button>
-              </NSpace>
-            </>
-          ) : (
-            ''
-          )}
-        </div>
-
-        {/* 判断是否下架 */}
-        {props.offShelf && (
-          <div class={styles.offShelfBg}>
-            <p class={styles.offShelfTips}>该资源已被下架</p>
-            <NButton
-              type="primary"
-              class={styles.offShelfBtn}
-              onClick={() => emit('offShelf')}>
-              确认
-            </NButton>
-          </div>
-        )}
-
-        <NModal
-          v-model:show={removeVisiable.value}
-          preset="card"
-          class={['modalTitle', styles.removeVisiable]}
-          title={'提示'}>
-          <div class={styles.studentRemove}>
-            <p>您确定是否删除?</p>
-
-            <NSpace class={styles.btnGroupModal} justify="center">
-              <NButton
-                round
-                type="primary"
-                onClick={() => {
-                  removeVisiable.value = false;
-                  emit('delete', props.item);
-                }}>
-                确定
-              </NButton>
-              <NButton round onClick={() => (removeVisiable.value = false)}>
-                取消
-              </NButton>
-            </NSpace>
-          </div>
-        </NModal>
-
-        <CardPreview
-          from={props.from}
-          v-model:show={previewShow.value}
-          item={preivewItem.value}
-          isDownload={isDownload.value}
-        />
-
-        <NModal
-          v-model:show={detailVisiable.value}
-          preset="card"
-          class={['modalTitle background', styles.reportModel]}
-          title={'评测报告'}>
-          <div class={styles.reportContainer} style={{ lineHeight: 0 }}>
-            <iframe
-              width={'100%'}
-              height={'450px'}
-              frameborder="0"
-              onLoad={(val: any) => {
-                iframeDislableKeyboard(val.target);
-              }}
-              src={reportSrc.value}></iframe>
-          </div>
-        </NModal>
-      </div>
-    );
-  }
-});
+import { PropType, computed, defineComponent, ref } from 'vue';
+import styles from './index.module.less';
+import {
+  NButton,
+  NEllipsis,
+  NSpace,
+  NImage,
+  NTag,
+  NModal,
+  NProgress,
+  NTooltip,
+  useMessage,
+  NDivider
+} from 'naive-ui';
+import iconDelete from '@/views/prepare-lessons/images/icon-delete-default.png';
+import iconEdit from './images/icon-edit.png';
+// import iconDelete from './images/icon-delete2.png';
+import iconBackLook from './images/icon-back-look.png';
+import iconReport from './images/icon-report.png';
+import { useUserStore } from '/src/store/modules/users';
+import CardPreview from '/src/components/card-preview';
+import { vaildMusicScoreUrl, vaildUrl } from '/src/utils/urlUtils';
+import { musicPracticeRecordDetail } from '/src/views/prepare-lessons/api';
+import { checkUrlType, iframeDislableKeyboard } from '/src/utils';
+import TheNoticeBar from '/src/components/TheNoticeBar';
+type ItemType = {
+  id: string | number;
+  trainingType: 'PRACTICE' | 'EVALUATION';
+  musicId: string | number;
+  coverImg: string;
+  musicName: string;
+  typeList: string[];
+  allTimes?: number;
+  trainingTimes?: number;
+  recordId?: string | number; // 评测记录编号
+};
+
+export default defineComponent({
+  name: 'train-type',
+  props: {
+    type: {
+      type: String as PropType<'prepare' | 'homework'>,
+      default: 'homework'
+    },
+    item: {
+      type: Object as PropType<ItemType>,
+      default: () => ({})
+    },
+    isDelete: {
+      type: Boolean,
+      default: false
+    },
+    isDisabled: {
+      type: Boolean,
+      default: false
+    },
+    isLarge: {
+      type: Boolean,
+      default: false
+    },
+    /** 是否下架 */
+    offShelf: {
+      type: Boolean,
+      default: false
+    },
+    isCLassWork: {
+      type: Boolean,
+      default: false
+    },
+    from: {
+      type: String,
+      default: ''
+    }
+  },
+  emits: ['click', 'delete', 'edit', 'offShelf'],
+  setup(props, { emit }) {
+    const userStore = useUserStore();
+    const message = useMessage();
+    const removeVisiable = ref(false);
+    const previewShow = ref(false);
+    const preivewItem = ref({
+      type: 'MUSIC',
+      content: props.item.musicId,
+      title: props.item.musicName
+    });
+    const onDetail = () => {
+      // const origin = /(localhost|192)/.test(location.host)
+      //   ? 'https://dev.kt.colexiu.com'
+      //   : location.origin;
+      // const src = `${origin}/instrument?platform=pc&modelType=practise&id=${props.item.musicId}&Authorization=${userStore.getToken}`;
+      // window.open(src, '_blank');
+      // console.log(props.item, 'item');
+      // console.log(props.item, '1212');
+      preivewItem.value = {
+        type: 'MUSIC',
+        content: props.item.musicId,
+        title: props.item.musicName
+      };
+      previewShow.value = true;
+    };
+
+    const reportSrc = ref('');
+    const detailVisiable = ref(false);
+    const gotoRecode = (row: any) => {
+      if (!row.id) {
+        message.error('暂无评测记录');
+        return;
+      }
+      const tockn = userStore.getToken;
+      reportSrc.value =
+        vaildMusicScoreUrl() +
+        `/instrument/#/evaluat-report?id=${row.id}&Authorization=${tockn}`;
+      detailVisiable.value = true;
+    };
+
+    const onBackLook = async () => {
+      try {
+        if (!props.item?.recordId) {
+          message.error('暂无数据');
+          return;
+        }
+        const { data } = await musicPracticeRecordDetail({
+          id: props.item.recordId
+        });
+        if (data.videoFilePath || data.recordFilePath) {
+          let lookTitle = '';
+          if (data.videoFilePath) {
+            lookTitle = checkUrlType(data.videoFilePath);
+          } else {
+            lookTitle = checkUrlType(data.recordFilePath);
+          }
+          const lookUrl = data.videoFilePath || data.recordFilePath;
+          preivewItem.value.content = lookUrl;
+          preivewItem.value.title = props.item.musicName;
+          if (lookTitle === 'video') {
+            preivewItem.value.type = 'VIDEO';
+          } else if (lookTitle === 'audio') {
+            preivewItem.value.type = 'SONG';
+          }
+          previewShow.value = true;
+        } else {
+          message.error('暂无数据');
+        }
+      } catch {
+        //
+      }
+    };
+
+    const isPass = computed(() => {
+      const item = props.item;
+      if (item) {
+        if (item.trainingType === 'EVALUATION') {
+          return (item.trainingTimes || 0) >= (item.allTimes || 0)
+            ? true
+            : false;
+        } else {
+          return (item.trainingTimes
+            ? parseInt(item.trainingTimes / 60 + '')
+            : 0) >= (item.allTimes || 0)
+            ? true
+            : false;
+        }
+      } else {
+        return false;
+      }
+    });
+
+    const isDownload = computed(() => {
+      if (
+        props.isDisabled &&
+        !props.isCLassWork &&
+        props.item.trainingType === 'EVALUATION'
+      ) {
+        return true;
+      } else {
+        return false;
+      }
+    });
+
+    return () => (
+      <div
+        class={[
+          styles.trainType,
+          props.item.trainingType === 'EVALUATION' ? styles.evaluationType : ''
+        ]}
+        onClick={() => emit('click', props.item)}>
+        <div
+          class={[
+            styles['train-content'],
+            props.isDisabled && !props.isCLassWork && styles.trainDisabled,
+            props.isLarge && styles.trainDisabled
+          ]}
+          onClick={() => {
+            if (props.isDisabled && !props.isCLassWork) {
+              return;
+            }
+            onDetail();
+          }}>
+          <NImage
+            src={props.item.coverImg}
+            previewDisabled
+            objectFit="contain"
+          />
+          {props.isDisabled && !props.isCLassWork ? (
+            <div class={styles.disPreview}>
+              <NProgress
+                percentage={
+                  props.item.trainingType === 'EVALUATION'
+                    ? (Number(props.item.trainingTimes) /
+                        Number(props.item.allTimes)) *
+                      100
+                    : (Number(props.item.trainingTimes) /
+                        60 /
+                        Number(props.item.allTimes)) *
+                      100
+                }
+                offset-degree={180}
+                type="circle"
+                rail-color={'8b8b8b'}
+                color={isPass.value ? '#6CFFC1' : '#FF7794'}
+                style="width: 120px; margin: 0  0 10px;">
+                <div class={styles.BProgress}>
+                  {props.item.trainingType === 'EVALUATION' ? (
+                    <h4>
+                      {props.item.trainingTimes}
+
+                      <span>分</span>
+                    </h4>
+                  ) : (
+                    <h4>
+                      {props.item.trainingTimes
+                        ? parseInt(props.item.trainingTimes / 60 + '')
+                        : 0}
+                      <span>分钟</span>
+                    </h4>
+                  )}
+
+                  <p>
+                    {props.item.trainingType === 'EVALUATION'
+                      ? '学生分数'
+                      : '实际练习'}{' '}
+                  </p>
+                </div>
+              </NProgress>
+              <p class={styles.disPreviewDivide}>
+                {props.item.trainingType === 'EVALUATION'
+                  ? '合格分数'
+                  : '练习时长要求'}
+                {props.item.allTimes}
+                {props.item.trainingType === 'EVALUATION' ? '分' : '分钟'}
+              </p>
+            </div>
+          ) : null}
+
+          {/* <div class={styles.preview} onClick={onDetail}>
+              <NButton strong secondary class={styles.previewBtn}>
+                预览
+              </NButton>
+            </div> */}
+          {props.isDelete && (
+            <img
+              src={iconDelete}
+              class={styles.iconDelete}
+              onClick={(e: MouseEvent) => {
+                e.stopPropagation();
+                emit('delete', props.item);
+              }}
+            />
+          )}
+        </div>
+        <div class={styles['train-footer']}>
+          <div class={styles.trainInfo}>
+            <div class={styles.trainName}>
+              <span class={[styles.type, styles[props.item.trainingType]]}>
+                {props.item.trainingType === 'EVALUATION' ? '评测' : '练习'}
+              </span>
+              {/* <NEllipsis tooltip={false}>{props.item.musicName}</NEllipsis> */}
+              <div class={styles['title-text']}>
+                <TheNoticeBar text={props.item.musicName} />
+              </div>
+            </div>
+            <div class={styles.tagList}>
+              {props.item.typeList?.map((type: string, index: number) => (
+                <>
+                  <span>{type}</span>
+                  {props.item.typeList.length - 1 > index && (
+                    <NDivider vertical />
+                  )}
+                </>
+              ))}
+            </div>
+          </div>
+
+          {props.isDisabled ? null : (
+            <NSpace size={12}>
+              <n-button
+                quaternary
+                disabled={!props.isDelete}
+                class={styles.operation}
+                onClick={(e: MouseEvent) => {
+                  e.stopPropagation();
+                  emit('edit', props.item);
+                }}>
+                <NTooltip showArrow={false}>
+                  {{
+                    trigger: () => <i class={styles.iconEdit}></i>,
+                    // <img src={iconEdit} />
+                    default: '编辑'
+                  }}
+                </NTooltip>
+              </n-button>
+              {/* <n-button
+                quaternary
+                disabled={!props.isDelete}
+                class={styles.operation}
+                onClick={(e: MouseEvent) => {
+                  e.stopPropagation();
+                  // onDelete();
+                  // removeVisiable.value = true;
+                  emit('delete', props.item);
+                }}>
+                <NTooltip showArrow={false}>
+                  {{
+                    trigger: () => <img src={iconDelete} />,
+                    default: '删除'
+                  }}
+                </NTooltip>
+              </n-button> */}
+            </NSpace>
+          )}
+
+          {/* 只有评测的时候才有 */}
+          {props.isDisabled &&
+          !props.isCLassWork &&
+          props.item.trainingType === 'EVALUATION' &&
+          props.item?.recordId ? (
+            <>
+              <NSpace size={12}>
+                <n-button
+                  quaternary
+                  disabled={props.isDelete}
+                  class={styles.operation}
+                  onClick={(e: MouseEvent) => {
+                    e.stopPropagation();
+                    gotoRecode({ id: props.item.recordId });
+                  }}>
+                  <NTooltip showArrow={false}>
+                    {{
+                      trigger: () => <img src={iconReport} />,
+                      default: '评测报告'
+                    }}
+                  </NTooltip>
+                </n-button>
+                <n-button
+                  quaternary
+                  disabled={props.isDelete}
+                  class={styles.operation}
+                  onClick={(e: MouseEvent) => {
+                    e.stopPropagation();
+                    // onDetail();
+                    // musicPracticeRecordId;
+                    onBackLook();
+                  }}>
+                  <NTooltip showArrow={false}>
+                    {{
+                      trigger: () => <img src={iconBackLook} />,
+                      default: '查看回放'
+                    }}
+                  </NTooltip>
+                </n-button>
+              </NSpace>
+            </>
+          ) : (
+            ''
+          )}
+        </div>
+
+        {/* 判断是否下架 */}
+        {props.offShelf && (
+          <div class={styles.offShelfBg}>
+            <p class={styles.offShelfTips}>该资源已被下架</p>
+            <NButton
+              type="primary"
+              class={styles.offShelfBtn}
+              onClick={() => emit('offShelf')}>
+              确认
+            </NButton>
+          </div>
+        )}
+
+        <NModal
+          v-model:show={removeVisiable.value}
+          preset="card"
+          class={['modalTitle', styles.removeVisiable]}
+          title={'提示'}>
+          <div class={styles.studentRemove}>
+            <p>您确定是否删除?</p>
+
+            <NSpace class={styles.btnGroupModal} justify="center">
+              <NButton
+                round
+                type="primary"
+                onClick={() => {
+                  removeVisiable.value = false;
+                  emit('delete', props.item);
+                }}>
+                确定
+              </NButton>
+              <NButton round onClick={() => (removeVisiable.value = false)}>
+                取消
+              </NButton>
+            </NSpace>
+          </div>
+        </NModal>
+
+        <CardPreview
+          from={props.from}
+          v-model:show={previewShow.value}
+          item={preivewItem.value}
+          isDownload={isDownload.value}
+        />
+
+        <NModal
+          v-model:show={detailVisiable.value}
+          preset="card"
+          class={['modalTitle background', styles.reportModel]}
+          title={'评测报告'}>
+          <div class={styles.reportContainer} style={{ lineHeight: 0 }}>
+            <iframe
+              width={'100%'}
+              height={'450px'}
+              frameborder="0"
+              onLoad={(val: any) => {
+                iframeDislableKeyboard(val.target);
+              }}
+              src={reportSrc.value}></iframe>
+          </div>
+        </NModal>
+      </div>
+    );
+  }
+});