import { computed, defineComponent, nextTick, onMounted, reactive, ref } from 'vue'; import styles from './index.module.less'; import { NButton, NCheckbox, NCheckboxGroup, // NBreadcrumb, // NBreadcrumbItem, // NScrollbar, NSlider, NSpace, NSpin } from 'naive-ui'; import iconT from '/src/views/content-information/images/icon-t.png'; import iconAddT from '/src/views/content-information/images/icon-add-t.png'; import iconPlusT from '/src/views/content-information/images/icon-plus-t.png'; import { api_lessonCoursewareDetail_listKnowledge, api_lessonCoursewareKnowledgeDetail } from '/src/views/content-information/api'; import TheEmpty from '/src/components/TheEmpty'; import { PageEnum } from '/src/enums/pageEnum'; import { useSpeak } from '/src/views/content-information/useSpeak'; export default defineComponent({ name: 'cotnent-knowledge', emits: ['close', 'confirm'], setup(props, { emit }) { const show = ref(false); const content = ref(false); const musicContentRef = ref(); const speakMusicContent = 'musicContent' + new Date().getTime() + Math.floor(Math.random() * 100); const speak = useSpeak(speakMusicContent); const state = reactive({ fontSize: 18, tableList: [] as any, selectKey: null, details: {} as any, selectCheckboxs: [] as any }); const isDisabled = computed(() => { const boxs = state.selectCheckboxs; let flag = false; for (const i in boxs) { if (boxs[i].length > 0) { flag = true; break; } } return !flag; }); const getDetails = async () => { show.value = true; content.value = true; try { const { data } = await api_lessonCoursewareDetail_listKnowledge({ type: 'COURSEWARE' }); state.tableList = data || []; if (state.tableList.length > 0) { const item = state.tableList[0].lessonCoursewareDetailKnowledgeDetailList; state.tableList[0].selected = true; if (item && item.length) { const child = item[0]; state.selectKey = child.id; await getDetail(); } state.tableList.forEach((item: any) => { item.checked = false; item.indeterminate = false; }); } } catch { // } content.value = false; show.value = false; }; const getDetail = async () => { content.value = true; try { const { data } = await api_lessonCoursewareKnowledgeDetail({ id: state.selectKey }); content.value = false; state.details = data; nextTick(() => { // 使用 DOMParser 解析 HTML 字符串 const parser = new DOMParser(); const doc = parser.parseFromString(data.desc, 'text/html'); const hasChilds = document.querySelectorAll('.only-child-select'); if (hasChilds.length > 0) { hasChilds.forEach(child => { child.remove(); }); } const childNodes = doc.body.childNodes; childNodes?.forEach((node: any) => { node?.classList.add('only-child-select'); }); // 提取并分割 HTML 文档中的内容 const result = document.createElement("div") result.classList.add("html-to-dom") result.appendChild(speak.processNode(doc.body)) document .querySelector('#' + speakMusicContent) ?.appendChild(result); }); } catch { // } content.value = false; }; const onSubmit = () => { const items: any[] = []; for (const i in state.selectCheckboxs) { const ids = state.selectCheckboxs[i]; const item = state.tableList[i]; if (Array.isArray(item.lessonCoursewareDetailKnowledgeDetailList)) { item.lessonCoursewareDetailKnowledgeDetailList.forEach( (child: any) => { if (ids.includes(child.id)) { items.push(child); } } ); } } const result: any[] = []; items.forEach(item => { result.push({ coverImg: PageEnum.THEORY_DEFAULT_COVER, title: '乐理知识-' + item.name, materialId: item.id, content: item.id }); }); emit('confirm', result); }; onMounted(() => { getDetails(); }); return () => (
{item.name}
{child.name}