.env
@@ -1,4 +1,4 @@ VUE_APP_ENV = 'dev' VUE_APP_API_URL = "https://yxjy.pumcp.com/" VUE_APP_API_URL = "https://yxjy.pumcp.com" VUE_APP_RESOURCE_CTX = 'https://yxjy.pumcp.com/books/resource/' VUE_APP_PUBLIC_PATH = '/books/book' .env.product
@@ -1,11 +1,11 @@ VUE_APP_ENV = 'product' # 接口请求地址 VUE_APP_API_URL = "https://yxjy.pumcp.com/" VUE_APP_API_URL = "https://yxjy.pumcp.com" # 教材配置文件的获取地址 VUE_APP_RESOURCE_CTX = 'https://yxjy.pumcp.com/books/resource/' # 教材静态资源获取的路径,部署时修改为当前这本书 VUE_APP_PUBLIC_PATH = 'https://yxjy.pumcp.com/books/book/TCMRehabilitationTechnology' VUE_APP_PUBLIC_PATH = 'https://yxjy.pumcp.com/books/book/digitalDentalRestorationTechnology' # 当前项目架子内所有的书的文件夹名称,用于打包时过滤其他文件夹 VUE_APP_BOOK_LIST = "demo/exerciseTherapyTechniques/MSDiseaseRehabilitation/prosthodontics/normalHumanBodyStructureFunction/physiology/clinicalDiseasesSynopsis/speechTherapyTechniques/orthodontics/physicalFactorTherapyTechnology/occupationalTherapyTechniques/rehabilitationMedicineIntroduction/rehabilitationAssessmentTechniques/rehabilitationPsychology/humanKinematicsFundamentals/preventiveDentistry/oralImaging/clinicalDiseasesSummary/digitalDentalRestorationTechnology/clinicalMedicalSummary/CTExaminationTechnology/medicalImagingAnatomy/MRIExaminationTechnology/dentalMorphologyFunction/oralAnatomicalPhysiology/oralFixedRestorationTechnology/RPDtechnology/oralcomprehensiveSkills/completeDentureTechnology/oralMaxillofacialSurgery/oralHistopathology/TCMRehabilitationTechnology" # 当前部署的书的文件夹名称,部署时修改为当前这本书 VUE_APP_BOOK_ID = 'TCMRehabilitationTechnology' VUE_APP_BOOK_ID = 'digitalDentalRestorationTechnology' package-lock.json
Diff too large package.json
@@ -23,7 +23,8 @@ "viewerjs": "^1.11.6", "vue": "^2.6.14", "vue-mathjax": "^0.1.1", "vuex": "^3.6.2" "vuex": "^3.6.2", "yarn": "^1.22.22" }, "devDependencies": { "@babel/core": "^7.12.16", @@ -31,7 +32,7 @@ "@types/spark-md5": "^3.0.4", "@vue/cli-plugin-babel": "~5.0.0", "@vue/cli-plugin-eslint": "~5.0.0", "@vue/cli-service": "~5.0.0", "@vue/cli-service": "^5.0.9", "eslint": "^7.32.0", "eslint-plugin-vue": "^8.0.3", "less": "^4.2.0", public/index.html
@@ -1,20 +1,24 @@ <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache, must-revalidate"> <meta http-equiv="expires" content="0"> <link rel="icon" href="<%= BASE_URL %>favicon.ico"> <title>数字教材</title> </head> <body> <noscript> <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> </noscript> <div id="app"></div> <!-- built files will be auto injected --> </body> </html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="Cache-Control" content="no-cache, must-revalidate"> <meta http-equiv="expires" content="0"> <link rel="icon" href="<%= BASE_URL %>favicon.ico"> <title>数字教材</title> </head> <body> <noscript> <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> </noscript> <div id="app"></div> <!-- built files will be auto injected --> </body> </html> src/App.vue
@@ -14,23 +14,27 @@ </physicalFactorTherapyTechnology> <occupationalTherapyTechniques v-if="activeBook.name == 'occupationalTherapyTechniques'"> </occupationalTherapyTechniques>--> <rehabilitationMedicineIntroduction v-if="activeBook.name == 'rehabilitationMedicineIntroduction'"> <!-- <rehabilitationMedicineIntroduction v-if="activeBook.name == 'rehabilitationMedicineIntroduction'" > </rehabilitationMedicineIntroduction> <!-- <rehabilitationAssessmentTechniques v-if="activeBook.name == 'rehabilitationAssessmentTechniques'"> </rehabilitationAssessmentTechniques> <rehabilitationPsychology v-if="activeBook.name == 'rehabilitationPsychology'"></rehabilitationPsychology> <rehabilitationAssessmentTechniques v-if="activeBook.name == 'rehabilitationAssessmentTechniques'" > </rehabilitationAssessmentTechniques> --> <!--<rehabilitationPsychology v-if="activeBook.name == 'rehabilitationPsychology'"></rehabilitationPsychology> <humanKinematicsFundamentals v-if="activeBook.name == 'humanKinematicsFundamentals'"></humanKinematicsFundamentals> --> <preventiveDentistry v-if="activeBook.name == 'preventiveDentistry'"></preventiveDentistry> <!-- <oralImaging v-if="activeBook.name == 'oralImaging'"></oralImaging> <clinicalDiseasesSummary v-if="activeBook.name == 'clinicalDiseasesSummary'"></clinicalDiseasesSummary> <clinicalDiseasesSummary v-if="activeBook.name == 'clinicalDiseasesSummary'"></clinicalDiseasesSummary> --> <digitalDentalRestorationTechnology v-if="activeBook.name == 'digitalDentalRestorationTechnology'"> </digitalDentalRestorationTechnology> <clinicalMedicalSummary v-if="activeBook.name == 'clinicalMedicalSummary'"></clinicalMedicalSummary> <!-- <clinicalMedicalSummary v-if="activeBook.name == 'clinicalMedicalSummary'"></clinicalMedicalSummary> <CTExaminationTechnology v-if="activeBook.name == 'CTExaminationTechnology'"></CTExaminationTechnology> <medicalImagingAnatomy v-if="activeBook.name == 'medicalImagingAnatomy'"></medicalImagingAnatomy> <MRIExaminationTechnology v-if="activeBook.name == 'MRIExaminationTechnology'"></MRIExaminationTechnology> <MRIExaminationTechnology v-if="activeBook.name == 'MRIExaminationTechnology'"></MRIExaminationTechnology>--> <dentalMorphologyFunction v-if="activeBook.name == 'dentalMorphologyFunction'"></dentalMorphologyFunction> <oralAnatomicalPhysiology v-if="activeBook.name == 'oralAnatomicalPhysiology'"></oralAnatomicalPhysiology> <!-- <oralAnatomicalPhysiology v-if="activeBook.name == 'oralAnatomicalPhysiology'"></oralAnatomicalPhysiology> <oralFixedRestorationTechnology v-if="activeBook.name == 'oralFixedRestorationTechnology'"> </oralFixedRestorationTechnology> <RPDtechnology v-if="activeBook.name == 'RPDtechnology'"></RPDtechnology> @@ -76,14 +80,17 @@ // orthodontics: () => import("@/books/orthodontics/view/index.vue"), // physicalFactorTherapyTechnology: () => import("@/books/physicalFactorTherapyTechnology/view/index.vue"), // occupationalTherapyTechniques: () => import("@/books/occupationalTherapyTechniques/view/index.vue"), rehabilitationMedicineIntroduction: () => import("@/books/rehabilitationMedicineIntroduction/view/index.vue"), // rehabilitationAssessmentTechniques: () => import("@/books/rehabilitationAssessmentTechniques/view/index.vue"), rehabilitationMedicineIntroduction: () => import("@/books/rehabilitationMedicineIntroduction/view/index.vue"), rehabilitationAssessmentTechniques: () => import("@/books/rehabilitationAssessmentTechniques/view/index.vue"), // rehabilitationPsychology: () => import("@/books/rehabilitationPsychology/view/index.vue"), // humanKinematicsFundamentals: () => import("@/books/humanKinematicsFundamentals/view/index.vue"), preventiveDentistry: () => import("./books/preventiveDentistry/view/index.vue"), preventiveDentistry: () => import("./books/preventiveDentistry/view/index.vue"), // oralImaging: () => import("./books/oralImaging/view/index.vue"), // clinicalDiseasesSummary: () => import("./books/clinicalDiseasesSummary/view/index.vue"), // digitalDentalRestorationTechnology: () => import("./books/digitalDentalRestorationTechnology/view/index.vue"), digitalDentalRestorationTechnology: () => import("./books/digitalDentalRestorationTechnology/view/index.vue"), // clinicalMedicalSummary: () => import("./books/clinicalMedicalSummary/view/index.vue"), // CTExaminationTechnology: () => import("./books/CTExaminationTechnology/view/index.vue"), // medicalImagingAnatomy: () => import("./books/medicalImagingAnatomy/view/index.vue"), @@ -125,15 +132,15 @@ }, }); } else { // preventiveDentistry // 21 口腔预防医学 // oralImaging // 29 口腔影像学 // preventiveDentistry // 21 口腔预防医学 // oralImaging // 29 口腔影像学 // clinicalDiseasesSummary // 30 临床疾病概要(口腔) // digitalDentalRestorationTechnology // 31 数字化口腔修复技术 // clinicalMedicalSummary // 33 临床医学概要 // CTExaminationTechnology // 37 CT检查技术 // CTExaminationTechnology // 37 CT检查技术 // medicalImagingAnatomy // 34 医学影像解剖学 // MRIExaminationTechnology // 38 MRI检查技术 // 新增 // 新增 // dentalMorphologyFunction // 27 牙体形态与功能 // oralAnatomicalPhysiology // 22 口腔解剖生理学 // oralFixedRestorationTechnology // 24 口腔固定修复工艺技术 @@ -149,7 +156,7 @@ process.env.VUE_APP_RESOURCE_CTX + (process.env.VUE_APP_ENV == "product" ? process.env.VUE_APP_BOOK_ID : "preventiveDentistry") : "digitalDentalRestorationTechnology") ); // 测试试读30页 @@ -163,8 +170,7 @@ } }, methods: { but() { }, but() { }, }, }; </script> src/assets/icons/index.js
@@ -2,9 +2,29 @@ import svgIcon from "@/components/svgIcon/index.vue"; Vue.component("svg-icon", svgIcon); const req = require.context("@/assets/icons/svg", false, /\.svg$/); // 修改为将SVG注入到父应用DOM const requireContext = require.context("@/assets/icons/svg", false, /\.svg$/); const requireAll = (requireContext) => { // requireContext.keys()数据:['./404.svg', './agency.svg', './det.svg', './user.svg'] requireContext.keys().map(requireContext); const svgSymbols = requireContext.keys().map(key => { return requireContext(key).default || requireContext(key); }); // 创建SVG sprite容器 const spriteContainer = document.createElement('div'); spriteContainer.id = 'svg-sprite-container'; spriteContainer.style.display = 'none'; // 构建SVG sprite const svgSprite = ` <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> ${svgSymbols.join('')} </svg> `; spriteContainer.innerHTML = svgSprite; // 关键:注入到父应用的body中 (window.parent || window).document.body.appendChild(spriteContainer); }; requireAll(req); requireAll(requireContext); src/assets/js/config.js
@@ -13,11 +13,10 @@ return response.data; }; export const appId = 0; export const requestTimeOut = 300000; // 请求超时时间 export const tokenKey = "token"; // export const tokenKey = "token"; export const tokenKey = "xiehe-token"; // export const tokenKey = "website-front-token" const config = { src/assets/methods/examination.js
@@ -63,15 +63,18 @@ if ( foundItems && foundItems.Embedded_QuestionBank_QuestionType == "material" ) { ) { foundItems.childList = bookQuestionsList.filter( (ditem) => ditem.productLinkInfo[0].LinkPath == foundItems.productLinkPath (ditem) => ditem.productLinkInfo[0].LinkPath == foundItems.productLinkPath ); } let foundlist = []; foundlist.push(foundItems); if(foundItems){ foundlist.push(foundItems); }else{ console.error("题目Id错误"+ qitem) return } if (foundlist.length > 0 && foundlist != undefined) { foundlist.forEach((item, index) => { const questionObj = handleQuestion(item, index + 1, oldList, collectList); @@ -99,183 +102,6 @@ }); } } // for (let qindex = 0; qindex < questionList.length; qindex++) { // const qitem = questionList[qindex]; // let query = { // storeInfo: activeBook.storeRefcode, // path: "*", // cmsPath: activeBook.rootCmsItemId, // cmsType: "*", // productId: activeBook.bookId, // queryType: "*", // itemIds: qitem + "", // itemFields: { // Embedded_QuestionBank_Stem: [], // Embedded_QuestionBank_AnalysisCon: [], // Embedded_QuestionBank_Answer: [], // Embedded_QuestionBank_Option: [], // Embedded_QuestionBank_QuestionType: [], // Embedded_QuestionBank_StemStyle: [], // Embedded_QuestionBank_OptionStyle: [], // Embedded_QuestionBank_KnowledgePoint: [], // Embedded_QuestionBank_Difficulty: [], // }, // }; // const res = await MG.store.getProductDetail(query); // console.log(res.datas.cmsDatas[0].datas, "材料题"); // if (!res.datas) return false; // res.datas.cmsDatas[0].datas.forEach((item, index) => { // let oldObj = {}; // if (oldList) { // oldObj = oldList.find((item) => item.id == qitem); // } // const questionObj = { // number: index + 1, // 题号 // id: item.id, // stem: // item.Embedded_QuestionBank_QuestionType == "completion" // ? JSON.parse(item.Embedded_QuestionBank_Stem) // .stemTxt.replaceAll("<vacancy>", ",input,") // .split(",") // : JSON.parse(item.Embedded_QuestionBank_Stem), // 题干 // answer: item.Embedded_QuestionBank_Answer, // 答案 // option: item.Embedded_QuestionBank_Option // ? JSON.parse(item.Embedded_QuestionBank_Option) // : "", // 选择题选项 // analysisCon: item.Embedded_QuestionBank_AnalysisCon, // 解析 // questionType: item.Embedded_QuestionBank_QuestionType, // 题型 // optionStyle: item.Embedded_QuestionBank_OptionStyle, // 选项显示类型 // stemStyle: item.Embedded_QuestionBank_StemStyle, // 题干显示类型 // difficulty: item.Embedded_QuestionBank_Difficulty // ? 4 - item.Embedded_QuestionBank_Difficulty // : 0, // 难度等级 // userAnswer: oldObj // ? oldObj.userAnswer // : item.Embedded_QuestionBank_QuestionType == "completion" || // item.Embedded_QuestionBank_QuestionType == "multipleChoice" // ? [] // : "", // isSubmit: false, // 查看解析 // isRight: null, // 是否正确 // isComplete: false, // isCollect: collectList.indexOf(qitem) > -1 ? true : false, // isUnfold: "", // }; // console.log(item, "材料题"); // // 多选和填空答案肯为数组,要转换JSON格式 // if ( // questionObj.questionType == "completion" || // questionObj.questionType == "multipleChoice" // ) { // try { // questionObj.answer = JSON.parse(questionObj.answer); // } catch (error) { // questionObj.answer = item.Embedded_QuestionBank_Answer; // } // } // // 填空题改造 // if (questionObj.questionType == "completion") { // let index = 0; // for (let i = 0; i < questionObj.stem.length; i++) { // const item = questionObj.stem[i]; // if (item == "input") { // questionObj.stem[i] = { // num: index, // data: "input", // }; // questionObj.userAnswer[index] = ""; // index++; // } // } // } // // 获取图片 // if ( // questionObj.stemStyle == "Image" || // questionObj.stemStyle == "TxtAndImage" // ) { // questionObj.stem.stemImage = getPublicImage( // questionObj.stem.stemImage, // 150 // ); // } // if ( // questionObj.optionStyle == "Image" || // questionObj.optionStyle == "TxtAndImage" // ) { // questionObj.option.forEach((optionItem) => { // if (optionItem.img) // optionItem.img = getPublicImage(optionItem.img, 150); // }); // } // // 题干富文本处理 // if (questionObj.stemStyle == "RichText") { // // questionObj.option.txt = '' // questionObj.stem.stemTxt = questionObj.stem.stemTxt // .replace( // /\<img/gi, // '<img style="max-width: 300rpx !important;object-fit: contain;" class="stem-rich-img" ' // ) // .replace(/\<p/gi, '<p class="stem-rich-p"') // .replace("../file", process.env.VUE_APP_API_URL + "/file"); // } // // 选项富文本处理 // if ( // questionObj.optionStyle == "RichText" && // (questionObj.questionType == "singleChoice" || // questionObj.questionType == "judge" || // questionObj.questionType == "multipleChoice") // ) { // questionObj.option.forEach((item) => { // if (item.txt) // item.txt = item.txt // .replace(/\<img/gi, '<img class="option-rich-img"') // .replace(/\<p/gi, '<p class="stem-rich-p"') // .replace("../file", process.env.VUE_APP_API_URL + "/file"); // }); // } // // 解析富文本处理 // if ( // questionObj.analysisCon && // typeof questionObj.analysisCon == "string" // ) { // questionObj.analysisCon = questionObj.analysisCon.replace( // /\<img/gi, // '<img style="max-width: 300rpx !important;object-fit: contain;" class="stem-rich-img" ' // ); // } // // 听力题修改 // // if (questionObj.questionType == 'singleChoice') { // // const src = this.extractSourceSrc(questionObj.stem.stemTxt) // // if (src) { // // questionObj.src = src // // questionObj.stem.stemTxt = this.removeVideoAndAudioTags(questionObj.stem.stemTxt) // // } // // } // if (item.Embedded_QuestionBank_QuestionType == "judge") { // questionObj.type = "判断题"; // judgeArr.push(questionObj); // } else if (item.Embedded_QuestionBank_QuestionType == "singleChoice") { // questionObj.type = "单选题"; // singleChoiceArr.push(questionObj); // } else if (item.Embedded_QuestionBank_QuestionType == "multipleChoice") { // questionObj.type = "多选题"; // multipleChoiceArr.push(questionObj); // } else if (item.Embedded_QuestionBank_QuestionType == "completion") { // questionObj.type = "填空题"; // completionArr.push(questionObj); // } else if (item.Embedded_QuestionBank_QuestionType == "shortAnswer") { // questionObj.type = "简答题"; // shortArr.push(questionObj); // } else if (item.Embedded_QuestionBank_QuestionType == "material") { // questionObj.type = "材料题"; // materialArr.push(questionObj); // } // }); // } // 22 cardList[0].infoList = singleChoiceArr; cardList[1].infoList = judgeArr; @@ -301,6 +127,7 @@ if (oldList) { oldObj = oldList.find((oldItem) => oldItem.id == qitem); } // 1. 构建 questionObj 的基础结构 const questionObj = { number: index + 1, // 题号 @@ -329,13 +156,15 @@ ? [] : "", isSubmit: false, // 查看解析 isRight: null, // 是否正确 isComplete: false, isRight: oldObj ? oldObj.isRight :null, // 是否正确 isComplete: oldObj ? oldObj.isComplete : false, isCollect: collectList.indexOf(qitem) > -1 ? true : false, isUnfold: "", }; // 2. 处理多选和填空题的答案(JSON格式转换) if ( @@ -372,13 +201,9 @@ // 4. 材料题处理 (核心递归点) if (questionObj.questionType == "material" && Array.isArray(item.childList)) { // 遍历子题目列表,并对每一个子项递归调用 processQuestionItem questionObj.childList = item.childList.map((childItem, childIndex) => { // 子题目通常不需要 oldList 和 collectList,但为了逻辑统一,可以传入 // 如果子题目也需要独立的作答状态和收藏状态,则需要调整 oldList 和 collectList 的结构 // 这里假设它们不需要,或者由父级材料题统一管理 return handleQuestion(childItem, childIndex + 1, null, []); return handleQuestion(childItem, childIndex + 1, oldList, collectList); }); } src/books/CTExaminationTechnology/view/components/index.vue
@@ -1,41 +1,64 @@ <template> <div class="page-main" @scroll="throttledScrollHandler"> <div id="searchDomBox" style="display: none"> <div id="searchContent"></div> </div> <div class="page-content" :style="{ fontSize: fontSize + 'px', transform: `scale(${pageZoom})`, transformOrigin: 'center top', }"> <pageHeader v-if="showCatalogList.indexOf(1) > -1" :showPageList="loadPageList"></pageHeader> <chapterOne v-if="showCatalogList.indexOf(2) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterOne> <chapterTwo v-if="showCatalogList.indexOf(3) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterTwo> <chapterThree v-if="showCatalogList.indexOf(4) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterThree> <chapterFour v-if="showCatalogList.indexOf(5) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterFour> <chapterFive v-if="showCatalogList.indexOf(6) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterFive> </div> <div class="page-main" @scroll="throttledScrollHandler"> <div id="searchDomBox" style="display: none"> <div id="searchContent"></div> </div> <div class="page-content" :style="{ fontSize: fontSize + 'px', transform: `scale(${pageZoom})`, transformOrigin: 'center top', }" > <pageHeader v-if="showCatalogList.indexOf(1) > -1" :showPageList="loadPageList" ></pageHeader> <chapterOne v-if="showCatalogList.indexOf(2) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun" :interfaceQuestion="bookQuestionsList" > </chapterOne> <chapterTwo v-if="showCatalogList.indexOf(3) > -1" :showPageList="loadPageList" :resourceList="resourceList" > </chapterTwo> <chapterThree v-if="showCatalogList.indexOf(4) > -1" :showPageList="loadPageList" :resourceList="resourceList" > </chapterThree> <chapterFour v-if="showCatalogList.indexOf(5) > -1" :showPageList="loadPageList" :resourceList="resourceList" > </chapterFour> <chapterFive v-if="showCatalogList.indexOf(6) > -1" :showPageList="loadPageList" :resourceList="resourceList" > </chapterFive> </div> </div> </template> <script> import Vue from "vue"; import pageHeader from "./header.vue"; import chapterOne from "./chapter001.vue" import chapterTwo from "./chapter002.vue" import chapterThree from "./chapter003.vue" import chapterFour from "./chapter004.vue" import chapterFive from "./chapter005.vue" import chapterOne from "./chapter001.vue"; import chapterTwo from "./chapter002.vue"; import chapterThree from "./chapter003.vue"; import chapterFour from "./chapter004.vue"; import chapterFive from "./chapter005.vue"; // import chapterSix from "./chapter006.vue" import NoteIcon from "@/assets/images/biji.png"; import _ from "lodash"; @@ -44,921 +67,741 @@ import Viewer from "viewerjs"; import "viewerjs/dist/viewer.css"; export default { name: "pageContent", data() { return { catalogLength: 7, // 总章节数 showCatalogList: [], // 显示的章节 loadThreshold: 300, // 触发加载阈值 throttleThreshold: 100, // 节流阈值 previousScrollTop: 0, throttledScrollHandler: null, observer: null, loadPageObserver: null, loadPageList: [], questionDataMap: {}, renderSignMap: {}, highlightData: null, audioPath: "", currentTime: null, videoList: [], resourceList: {}, }; name: "pageContent", data() { return { catalogLength: 7, // 总章节数 showCatalogList: [], // 显示的章节 loadThreshold: 300, // 触发加载阈值 throttleThreshold: 100, // 节流阈值 previousScrollTop: 0, throttledScrollHandler: null, observer: null, loadPageObserver: null, loadPageList: [], questionDataMap: {}, renderSignMap: {}, highlightData: null, audioPath: "", currentTime: null, videoList: [], resourceList: [], }; }, computed: { fontSize() { this.transformDom(this.$store.state.qiankun.fontSize); return this.$store.state.qiankun.fontSize ? this.$store.state.qiankun.fontSize : 14; }, computed: { fontSize() { this.transformDom(this.$store.state.qiankun.fontSize); return this.$store.state.qiankun.fontSize ? this.$store.state.qiankun.fontSize : 14; }, pageZoom() { return this.$store.state.qiankun.scale ? this.$store.state.qiankun.scale / 100 : 1; }, pageZoom() { return this.$store.state.qiankun.scale ? this.$store.state.qiankun.scale / 100 : 1; }, watch: { showCatalogList: { handler(newVal, oldVal) { if ( this.$store.state.qiankun && this.$store.state.qiankun.catalogChange ) { // 调用父层方法 this.$store.state.qiankun.catalogChange({ showCatalogList: newVal, }); } // 启动页码观察 setTimeout(() => { this.initObservation(); this.initThemeColor(); }, 500); }, }, loadPageList: { handler(newVal, oldVal) { setTimeout(() => { this.transformDom(this.$store.state.qiankun.fontSize); this.initSwiper(); this.initViewer(); this.closeAudio(); this.closeVideo(); }, 200); }, }, pageZoom: { handler(newVal, oldVal) { const scrollBox = ( this.container ? this.container : document ).querySelector(".page-main"); scrollBox.scrollTop = (scrollBox.scrollTop / oldVal) * newVal; }, }, resourceList: { handler(newVal, oldVal) { this.resourceList = newVal; }, }, }, mounted() { // 默认加载章节 this.showCatalogList = [1]; // 滚动监听节流 this.throttledScrollHandler = _.throttle( this.scrollFun, this.throttleThreshold, { leading: true, trailing: false } ); // 定义子层方法 if (this.setGlobalState) { // 提供页面跳转功能 this.setGlobalState({ gotoPage: (catalog, page) => { this.gotoPage(catalog, page); }, // 渲染笔记、高亮、划线 renderSign: (type, data) => { // 因为调整为页面懒加载,所以渲染标记也需要按照页面进行处理,先储存数据,页面加载完成再渲染对应的标记; this.handelSignData(type, data); // this.renderSign(type, data); }, // 删除笔记、高亮、划线 delSign: (data) => { this.delSign(data); }, // 全文检索 searchBookByKeyword: (keyword) => { return this.searchTextByPage(keyword); }, // 跳转检索结果位置 jumpSearchItem: (data) => { this.searchItemLocation(data); }, }); }, watch: { showCatalogList: { handler(newVal, oldVal) { if ( this.$store.state.qiankun && this.$store.state.qiankun.catalogChange ) { // 调用父层方法 this.$store.state.qiankun.catalogChange({ showCatalogList: newVal, }); } // 创建一个新的 Intersection Observer 实例,用于观察目标元素和执行相应的回调函数。 // new IntersectionObserver(callback, options):使用之前定义的 callback 回调函数和 options 配置选项来初始化 Intersection Observer 实例。 this.observer = new IntersectionObserver(this.pageChangeCallback, { root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。 rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合 threshold: 0.5, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。 }); this.loadPageObserver = new IntersectionObserver(this.loadPageCallback, { root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。 rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合 threshold: 0, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。 }); // this.getBookResourceList(); // 启动页码观察 setTimeout(() => { this.initObservation(); this.initThemeColor(); this.initObservation(); }, 500); // 测试页面跳转 // setTimeout(() => { // this.gotoPage(6, 199); // }, 500); // const pageDom = (this.container ? this.container : document) // .querySelector("#app") // .querySelectorAll(".page-box"); // 检索 // console.log(this.searchTextByPage("保护内脏器官"), "searchTextByPage"); // 检索跳转 // this.searchItemLocation({ // catalog: 2, // page: 10, // txt: " 运动系统是由骨、骨连结和骨骼肌三部分组成的。全身的骨通过骨连结组成人体骨骼(见图1-1)。骨骼是人体的支架,具有保护内脏器官、供肌肉附着和作为肌肉运动的杠杆等作用。在神经系统的支配下,肌肉收缩牵动所附着的骨绕着关节转动,使身体产生各种动作。所以,运动系统具有运动、支持和保护等功能,幼年时期的骨骼还具有造血功能。 ", // txtIndex: 57 // }); // }, 500); }, }, methods: { // setZoom1() { // let scale = this.$store.state.qiankun.scale + 10; // const scrollBox = ( // this.container ? this.container : document // ).querySelector(".page-main"); // this.$store.commit("setZoom", scale); // }, // setZoom2() { // let scale = this.$store.state.qiankun.scale - 10; // const scrollBox = ( // this.container ? this.container : document // ).querySelector(".page-main"); // this.$store.commit("setZoom", scale); // }, // 请求资源Json async getBookResourceList() { this.resourceList = await this.config.getBookResources( process.env.VUE_APP_RESOURCE_CTX + (process.env.VUE_APP_ENV == "product" ? process.env.VUE_APP_BOOK_ID : "clinicalDiseasesSummary") loadPageList: { handler(newVal, oldVal) { setTimeout(() => { this.transformDom(this.$store.state.qiankun.fontSize); this.initSwiper(); this.initViewer(); this.closeAudio(); this.closeVideo(); this.initThemeColor(); }, 200); }, }, pageZoom: { handler(newVal, oldVal) { const scrollBox = ( this.container ? this.container : document ).querySelector(".page-main"); scrollBox.scrollTop = (scrollBox.scrollTop / oldVal) * newVal; }, }, resourceList: { handler(newVal, oldVal) { this.resourceList = newVal; }, }, }, mounted() { // 默认加载章节 this.showCatalogList = [1]; // 滚动监听节流 this.throttledScrollHandler = _.throttle( this.scrollFun, this.throttleThreshold, { leading: true, trailing: false } ); // 定义子层方法 if (this.setGlobalState) { // 提供页面跳转功能 this.setGlobalState({ gotoPage: (catalog, page) => { this.gotoPage(catalog, page); }, // 渲染笔记、高亮、划线 renderSign: (type, data) => { // 因为调整为页面懒加载,所以渲染标记也需要按照页面进行处理,先储存数据,页面加载完成再渲染对应的标记; this.handelSignData(type, data); // this.renderSign(type, data); }, // 删除笔记、高亮、划线 delSign: (data) => { this.delSign(data); }, // 全文检索 searchBookByKeyword: (keyword) => { return this.searchTextByPage(keyword); }, // 跳转检索结果位置 jumpSearchItem: (data) => { this.searchItemLocation(data); }, }); } // 创建一个新的 Intersection Observer 实例,用于观察目标元素和执行相应的回调函数。 // new IntersectionObserver(callback, options):使用之前定义的 callback 回调函数和 options 配置选项来初始化 Intersection Observer 实例。 this.observer = new IntersectionObserver(this.pageChangeCallback, { root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。 rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合 threshold: 0.5, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。 }); this.loadPageObserver = new IntersectionObserver(this.loadPageCallback, { root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。 rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合 threshold: 0, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。 }); this.getBookResourceList(); // 获取整本书题目 this.getBookQuestionList(); // 启动页码观察 setTimeout(() => { this.initObservation(); }, 500); // 测试页面跳转 // setTimeout(() => { // this.gotoPage(6, 199); // }, 500); // const pageDom = (this.container ? this.container : document) // .querySelector("#app") // .querySelectorAll(".page-box"); // 检索 // console.log(this.searchTextByPage("保护内脏器官"), "searchTextByPage"); // 检索跳转 // this.searchItemLocation({ // catalog: 2, // page: 10, // txt: " 运动系统是由骨、骨连结和骨骼肌三部分组成的。全身的骨通过骨连结组成人体骨骼(见图1-1)。骨骼是人体的支架,具有保护内脏器官、供肌肉附着和作为肌肉运动的杠杆等作用。在神经系统的支配下,肌肉收缩牵动所附着的骨绕着关节转动,使身体产生各种动作。所以,运动系统具有运动、支持和保护等功能,幼年时期的骨骼还具有造血功能。 ", // txtIndex: 57 // }); // }, 500); }, methods: { // setZoom1() { // let scale = this.$store.state.qiankun.scale + 10; // const scrollBox = ( // this.container ? this.container : document // ).querySelector(".page-main"); // this.$store.commit("setZoom", scale); // }, // setZoom2() { // let scale = this.$store.state.qiankun.scale - 10; // const scrollBox = ( // this.container ? this.container : document // ).querySelector(".page-main"); // this.$store.commit("setZoom", scale); // }, // 请求资源Json async getBookResourceList() { this.resourceList = await this.config .getBookResources( process.env.VUE_APP_RESOURCE_CTX + (process.env.VUE_APP_ENV == "product" ? process.env.VUE_APP_BOOK_ID : "clinicalDiseasesSummary") ) .then((data) => { this.resourceList = data; }) .catch((error) => { console.error("获取图书资源列表失败:", error); }); }, // 获取图书问题列表 getBookQuestionList() { let query = { storeInfo: this.config.activeBook.storeRefcode, path: "*", cmsPath: this.config.activeBook.rootCmsItemId, cmsType: "*", productId: this.config.activeBook.bookId, queryType: "*", itemFields: { Embedded_QuestionBank_Stem: [], Embedded_QuestionBank_AnalysisCon: [], Embedded_QuestionBank_Answer: [], Embedded_QuestionBank_Option: [], Embedded_QuestionBank_QuestionType: [], Embedded_QuestionBank_StemStyle: [], Embedded_QuestionBank_OptionStyle: [], Embedded_QuestionBank_KnowledgePoint: [], Embedded_QuestionBank_Difficulty: [], }, }; MG.store .getProductDetail(query) .then((res) => { let bookQuestionList = []; if (res.datas.cmsDatas[0].datas.length > 0) { res.datas.cmsDatas[0].datas.forEach((item) => { if (item.datas.Type === "questionBankItem") { bookQuestionList.push(item); } }); } this.bookQuestionsList = bookQuestionList; }) .catch((error) => { console.error("获取图书问题列表失败:", error); }); }, resourceListFun(id, key) { let data = this.resourceList.find(item => item.key == id) return key ? data[key] : data }, // 滚动监听 scrollFun(event) { this.handleVideoPicture(); // 判断向上滚动还是向下滚动 if (event.target.scrollTop > this.previousScrollTop) { this.getAduio(); // 向下 const currentScrollTop = event.target.scrollTop + event.target.offsetHeight; if ( currentScrollTop >= event.target.scrollHeight - this.loadThreshold ) { console.log(1); // 到达阈值 if ( this.showCatalogList[this.showCatalogList.length - 1] < this.catalogLength ) { // 加载下一章 this.showCatalogList.push( this.showCatalogList[this.showCatalogList.length - 1] + 1 ); }, // 滚动监听 scrollFun(event) { this.handleVideoPicture(); // 判断向上滚动还是向下滚动 if (event.target.scrollTop > this.previousScrollTop) { this.getAduio(); // 向下 const currentScrollTop = event.target.scrollTop + event.target.offsetHeight; if ( currentScrollTop >= event.target.scrollHeight - this.loadThreshold ) { console.log(1); // 到达阈值 if ( this.showCatalogList[this.showCatalogList.length - 1] < this.catalogLength ) { // 加载下一章 this.showCatalogList.push( this.showCatalogList[this.showCatalogList.length - 1] + 1 ); if (this.showCatalogList.length > 3) { // 超过三章隐藏顶部一章 this.showCatalogList.shift(); } } } } else if (event.target.scrollTop < this.previousScrollTop) { this.handleAudio(); // 向上 const currentScrollTop = event.target.scrollTop; if (currentScrollTop <= this.loadThreshold) { // 到达阈值 if (this.showCatalogList[0] > 0) { // 加载上一章 this.showCatalogList.unshift(this.showCatalogList[0] - 1); if (this.showCatalogList.length > 3) { // 超过三章隐藏底部一章 this.showCatalogList.pop(); } } } if (this.showCatalogList.length > 3) { // 超过三章隐藏顶部一章 this.showCatalogList.shift(); } // showCatalogList 当前显示的三个章节,watch监听传递给主应用 // 更新上一次滚动的位置 this.previousScrollTop = event.target.scrollTop; }, // 章节、页面跳转 gotoPage(catalog, page) { if (catalog >= 0 && catalog <= this.catalogLength) { // 处理渲染章节 if (catalog == 0) { this.showCatalogList = [0, 1]; } else if (catalog == this.catalogLength) { this.showCatalogList = [ this.catalogLength - 2, this.catalogLength - 1, this.catalogLength, ]; } else { this.showCatalogList = [catalog - 1, catalog, catalog + 1]; } setTimeout(() => { // 跳转页码 const pageDom = ( this.container ? this.container : document ).querySelector(`[page="${page}"]`); if (pageDom) { pageDom.scrollIntoView(); } else { console.log("页码错误!"); } }, 500); } else { console.log("章节错误!"); } } } else if (event.target.scrollTop < this.previousScrollTop) { this.handleAudio(); // 向上 const currentScrollTop = event.target.scrollTop; if (currentScrollTop <= this.loadThreshold) { // 到达阈值 if (this.showCatalogList[0] > 0) { // 加载上一章 this.showCatalogList.unshift(this.showCatalogList[0] - 1); if (this.showCatalogList.length > 3) { // 超过三章隐藏底部一章 this.showCatalogList.pop(); } }, } } } // showCatalogList 当前显示的三个章节,watch监听传递给主应用 // 更新上一次滚动的位置 this.previousScrollTop = event.target.scrollTop; }, // 章节、页面跳转 gotoPage(catalog, page) { if (catalog >= 0 && catalog <= this.catalogLength) { // 处理渲染章节 if (catalog == 0) { this.showCatalogList = [0, 1]; } else if (catalog == this.catalogLength) { this.showCatalogList = [ this.catalogLength - 2, this.catalogLength - 1, this.catalogLength, ]; } else { this.showCatalogList = [catalog - 1, catalog, catalog + 1]; } setTimeout(() => { // 跳转页码 const pageDom = ( this.container ? this.container : document ).querySelector(`[page="${page}"]`); if (pageDom) { pageDom.scrollIntoView(); } else { console.log("页码错误!"); } }, 500); } else { console.log("章节错误!"); } }, // 处理标记数据 handelSignData(type, data) { if (this.loadPageList.indexOf(Number(data.page)) > -1) { // 立即渲染 this.renderSign(type, data); // 处理标记数据 handelSignData(type, data) { if (this.loadPageList.indexOf(Number(data.page)) > -1) { // 立即渲染 this.renderSign(type, data); } // 储存数据 if (!this.renderSignMap[type]) this.renderSignMap[type] = {}; if (!this.renderSignMap[type][data.page]) this.renderSignMap[type][data.page] = []; this.renderSignMap[type][data.page].push(data); }, // 渲染标记 renderSign(type, data) { // 父层设置禁止渲染标记时不再进行渲染 if (this.$store.state.qiankun.disableSign) { return false; } const existence = ( this.container ? this.container : document ).querySelector(`[dataid="${data.id}"]`); // 去重 if (!existence) { const pageDom = ( this.container ? this.container : document ).querySelector(`[page="${data.page}"]`); // 创建 createTreeWalker 迭代器,用于遍历文本节点,保存到一个数组 const treeWalker = document.createTreeWalker( pageDom, NodeFilter.SHOW_TEXT ); const allTextNodes = []; let currentNode = treeWalker.nextNode(); while (currentNode) { allTextNodes.push(currentNode); currentNode = treeWalker.nextNode(); } for (let i = 0; i < allTextNodes.length; i++) { const textDom = allTextNodes[i]; if (textDom.textContent.indexOf(data.txt) > -1) { let reg = new RegExp(`${data.txt}`, "ig"); switch (type) { case "Highlight": // 高亮 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Highlight" dataid="${data.id}" style="background: ${data.color};" class="highLight" onclick="signClick('Highlight','${data.id}','${data.chapterNum}')">${data.txt}</span>` ); break; case "Dashing": // 划线 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Dashing" dataid="${data.id}" style="text-decoration-color:${data.color};" class="underline" onclick="signClick('Dashing','${data.id}','${data.chapterNum}')">${data.txt}</span>` ); break; case "Note": // 笔记 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Note" dataid="${data.id}" style="border-bottom-color:${data.color}" class="notesline" onclick="signClick('Note','${data.id}','${data.chapterNum}')" onmouseover="noteHover('Note','${data.id}','${data.chapterNum}')" onmouseout="noteOut('Note')">${data.txt}<img src="${NoteIcon}"/></span>` ); break; } // 储存数据 if (!this.renderSignMap[type]) this.renderSignMap[type] = {}; if (!this.renderSignMap[type][data.page]) this.renderSignMap[type][data.page] = []; this.renderSignMap[type][data.page].push(data); }, // 渲染标记 renderSign(type, data) { // 父层设置禁止渲染标记时不再进行渲染 if (this.$store.state.qiankun.disableSign) { return false; } } } }, // 删除标记渲染 delSign({ ids, type }) { if (ids && ids.length) { for (let i = 0; i < ids.length; i++) { const id = ids[i]; const dom = ( this.container ? this.container : document ).querySelector(`[dataid="${id}"]`); dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace( dom.outerHTML, dom.outerText ); } } if (type) { const doms = ( this.container ? this.container : document ).querySelectorAll(`[datatype="${type}"]`); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace( dom.outerHTML, dom.outerText ); } } }, initObservation() { const sections = ( this.container ? this.container : document ).querySelectorAll(".page-box"); sections.forEach((section) => { if (this.config.activeBook && this.config.activeBook.tryPageCount) { const page = section.getAttribute("page"); if (Number(page) > this.config.activeBook.tryPageCount) { let chapterDom = this.getParentWithClass(section, "chapter"); const chapterNum = chapterDom.getAttribute("num"); this.catalogLength = Number(chapterNum) - 1; section.remove(); return false; } } // observer 观察每个元素,以便在它们进入或离开视窗时触发回调函数。 const isObserver = section.getAttribute("observer"); const isLoadObserver = section.getAttribute("loadObserver"); if (!isObserver) { this.observer.observe(section); section.setAttribute("observer", "1"); } if (!isLoadObserver) { this.loadPageObserver.observe(section); section.setAttribute("loadObserver", "1"); } }); }, initThemeColor() { // 获取各种需要主题色的节点 const colorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-color"); const backgroundColorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-back"); const borderColorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-border"); // 获取配置的主题色 const bookThemeColor = this.config.activeBook && this.config.activeBook.bookThemeColor ? this.config.activeBook.bookThemeColor : null; const chapterThemeColor = this.config.activeBook && this.config.activeBook.chapterThemeColor ? this.config.activeBook.chapterThemeColor : null; const pageThemeColor = this.config.activeBook && this.config.activeBook.pageThemeColor ? this.config.activeBook.pageThemeColor : null; colorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.color = themeColor; } }); backgroundColorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.backgroundColor = themeColor; } }); borderColorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.borderColor = themeColor; } }); }, getParentWithClass(element, className) { while (element.parentElement) { element = element.parentElement; if (element.classList.contains(className)) { return element; } } }, pageChangeCallback(entries, observer) { //entries:代表观察到的目标元素的集合。 observer:代表观察者对象。 entries.forEach((entry) => { //entry.isIntersecting:检查当前目标元素是否与根元素相交。 if (entry.isIntersecting) { const target = entry.target; //entry.target:获取当前目标元素 const page = target.getAttribute("page"); const catalogDom = this.tool.getParentNodeByClassName( target, "chapter" ); const catalog = catalogDom.getAttribute("num"); let text = null; if (target.querySelector("p")) { text = target.querySelector("p").textContent.substring(0, 50); } // 返回页码和章节信息 if (this.$store.state.qiankun && this.$store.state.qiankun.pageChange) this.$store.state.qiankun.pageChange({ page: page, catalog: catalog, text, }); // const sections = Array.from(document.querySelectorAll(".section")); //sections:获取所有具有 .section 类名的元素,并转换为数组。 // let index = sections.findIndex((section) => section === target) + 1; //index:查找当前目标元素在 sections 数组中的索引,并加 1,用于确定当前页码。 } }); }, loadPageCallback(entries, observer) { entries.forEach(async (entry) => { if (entry.isIntersecting) { const target = entry.target; const page = target.getAttribute("page"); if (this.loadPageList.indexOf(Number(page)) == -1) { const catalogDom = this.tool.getParentNodeByClassName( target, "chapter" ); // 添加页码 this.loadPageList.push(Number(page)); const catalog = catalogDom.getAttribute("num"); // if (!this.questionDataMap[page]) { // if (testData && testData[catalog]) { // if (testData[catalog][page]) { // if (Array.isArray(testData[catalog][page])) { // this.questionDataMap[page] = await getQuestionList( // page, // testData[catalog][page], // this.config.activeBook // ); // } else { // const obj = {}; // for (let key in testData[catalog][page]) { // obj[key] = await getQuestionList( // [], // testData[catalog][page][key], // this.config.activeBook // ); // } // this.questionDataMap[page] = obj; // } // console.log("题目", this.questionDataMap); // } // } // } // 渲染这一页的标记 for (const key in this.renderSignMap) { if (this.renderSignMap[key][page]) { this.renderSignMap[key][page].forEach((item) => { this.renderSign(key, item); }); } } const existence = ( this.container ? this.container : document ).querySelector(`[dataid="${data.id}"]`); // 去重 if (!existence) { const pageDom = ( this.container ? this.container : document ).querySelector(`[page="${data.page}"]`); // 创建 createTreeWalker 迭代器,用于遍历文本节点,保存到一个数组 const treeWalker = document.createTreeWalker( pageDom, NodeFilter.SHOW_TEXT // 处理高亮 if (this.highlightData) { // 高亮行 setTimeout(() => { // 获取页面所有text节点 const pageTextList = document.createTreeWalker( target, NodeFilter.SHOW_TEXT ); const allTextNodes = []; let currentNode = treeWalker.nextNode(); // 匹配关键字 const allPageTextNodes = []; let currentNode = pageTextList.nextNode(); while (currentNode) { allTextNodes.push(currentNode); currentNode = treeWalker.nextNode(); allPageTextNodes.push(currentNode); currentNode = pageTextList.nextNode(); } for (let i = 0; i < allTextNodes.length; i++) { const textDom = allTextNodes[i]; if (textDom.textContent.indexOf(data.txt) > -1) { let reg = new RegExp(`${data.txt}`, "ig"); switch (type) { case "Highlight": // 高亮 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Highlight" dataid="${data.id}" style="background: ${data.color};" class="highLight" onclick="signClick('Highlight','${data.id}','${data.chapterNum}')">${data.txt}</span>` ); break; case "Dashing": // 划线 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Dashing" dataid="${data.id}" style="text-decoration-color:${data.color};" class="underline" onclick="signClick('Dashing','${data.id}','${data.chapterNum}')">${data.txt}</span>` ); break; case "Note": // 笔记 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Note" dataid="${data.id}" style="border-bottom-color:${data.color}" class="notesline" onclick="signClick('Note','${data.id}','${data.chapterNum}')" onmouseover="noteHover('Note','${data.id}','${data.chapterNum}')" onmouseout="noteOut('Note')">${data.txt}<img src="${NoteIcon}"/></span>` ); break; } } for (let i = 0; i < allPageTextNodes.length; i++) { const textDom = allPageTextNodes[i]; let txtIndex = textDom.textContent.indexOf( this.highlightData.txt ); if (txtIndex > -1) { textDom.parentNode.style.transition = "background-color 0.8s"; textDom.parentNode.scrollIntoView(); textDom.parentNode.style.backgroundColor = "#79bbf0"; setTimeout(() => { textDom.parentNode.style.backgroundColor = ""; }, 1000); } } }, 100); } }, // 删除标记渲染 delSign({ ids, type }) { if (ids && ids.length) { for (let i = 0; i < ids.length; i++) { const id = ids[i]; const dom = ( this.container ? this.container : document ).querySelector(`[dataid="${id}"]`); dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace( dom.outerHTML, dom.outerText ); } if (this.loadPageList.length > 5) { // 超过5页 this.loadPageList.shift(); } if (type) { const doms = ( this.container ? this.container : document ).querySelectorAll(`[datatype="${type}"]`); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace( dom.outerHTML, dom.outerText ); } } }, initObservation() { const sections = ( this.container ? this.container : document ).querySelectorAll(".page-box"); sections.forEach((section) => { if (this.config.activeBook && this.config.activeBook.tryPageCount) { const page = section.getAttribute("page"); if (Number(page) > this.config.activeBook.tryPageCount) { let chapterDom = this.getParentWithClass(section, "chapter"); const chapterNum = chapterDom.getAttribute("num"); this.catalogLength = Number(chapterNum) - 1; section.remove(); return false; } } // observer 观察每个元素,以便在它们进入或离开视窗时触发回调函数。 const isObserver = section.getAttribute("observer"); const isLoadObserver = section.getAttribute("loadObserver"); if (!isObserver) { this.observer.observe(section); section.setAttribute("observer", "1"); } if (!isLoadObserver) { this.loadPageObserver.observe(section); section.setAttribute("loadObserver", "1"); } }); }, initThemeColor() { // 获取各种需要主题色的节点 const colorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-color"); const backgroundColorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-back"); const borderColorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-border"); // 获取配置的主题色 const bookThemeColor = this.config.activeBook && this.config.activeBook.bookThemeColor ? this.config.activeBook.bookThemeColor : null; const chapterThemeColor = this.config.activeBook && this.config.activeBook.chapterThemeColor ? this.config.activeBook.chapterThemeColor : null; const pageThemeColor = this.config.activeBook && this.config.activeBook.pageThemeColor ? this.config.activeBook.pageThemeColor : null; colorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.color = themeColor; } }); backgroundColorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.backgroundColor = themeColor; } }); borderColorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.borderColor = themeColor; } }); }, getParentWithClass(element, className) { while (element.parentElement) { element = element.parentElement; if (element.classList.contains(className)) { return element; } } }, pageChangeCallback(entries, observer) { //entries:代表观察到的目标元素的集合。 observer:代表观察者对象。 entries.forEach((entry) => { //entry.isIntersecting:检查当前目标元素是否与根元素相交。 if (entry.isIntersecting) { const target = entry.target; //entry.target:获取当前目标元素 const page = target.getAttribute("page"); const catalogDom = this.tool.getParentNodeByClassName( target, "chapter" ); const catalog = catalogDom.getAttribute("num"); let text = null; if (target.querySelector("p")) { text = target.querySelector("p").textContent.substring(0, 50); } // 返回页码和章节信息 if (this.$store.state.qiankun && this.$store.state.qiankun.pageChange) this.$store.state.qiankun.pageChange({ page: page, catalog: catalog, text, }); // const sections = Array.from(document.querySelectorAll(".section")); //sections:获取所有具有 .section 类名的元素,并转换为数组。 // let index = sections.findIndex((section) => section === target) + 1; //index:查找当前目标元素在 sections 数组中的索引,并加 1,用于确定当前页码。 } }); }, loadPageCallback(entries, observer) { entries.forEach(async (entry) => { if (entry.isIntersecting) { const target = entry.target; const page = target.getAttribute("page"); if (this.loadPageList.indexOf(Number(page)) == -1) { const catalogDom = this.tool.getParentNodeByClassName( target, "chapter" ); // 添加页码 this.loadPageList.push(Number(page)); const catalog = catalogDom.getAttribute("num"); // if (!this.questionDataMap[page]) { // if (testData && testData[catalog]) { // if (testData[catalog][page]) { // if (Array.isArray(testData[catalog][page])) { // this.questionDataMap[page] = await getQuestionList( // page, // testData[catalog][page], // this.config.activeBook // ); // } else { // const obj = {}; // for (let key in testData[catalog][page]) { // obj[key] = await getQuestionList( // [], // testData[catalog][page][key], // this.config.activeBook // ); // } // this.questionDataMap[page] = obj; // } // console.log("题目", this.questionDataMap); // } // } // } // 渲染这一页的标记 for (const key in this.renderSignMap) { if (this.renderSignMap[key][page]) { this.renderSignMap[key][page].forEach((item) => { this.renderSign(key, item); }); } } // 处理高亮 if (this.highlightData) { // 高亮行 setTimeout(() => { // 获取页面所有text节点 const pageTextList = document.createTreeWalker( target, NodeFilter.SHOW_TEXT ); // 匹配关键字 const allPageTextNodes = []; let currentNode = pageTextList.nextNode(); while (currentNode) { allPageTextNodes.push(currentNode); currentNode = pageTextList.nextNode(); } for (let i = 0; i < allPageTextNodes.length; i++) { const textDom = allPageTextNodes[i]; let txtIndex = textDom.textContent.indexOf( this.highlightData.txt ); if (txtIndex > -1) { textDom.parentNode.style.transition = "background-color 0.8s"; textDom.parentNode.scrollIntoView(); textDom.parentNode.style.backgroundColor = "#79bbf0"; setTimeout(() => { textDom.parentNode.style.backgroundColor = ""; }, 1000); } } }, 100); } if (this.loadPageList.length > 5) { // 超过5页 this.loadPageList.shift(); } } } }); }, initSwiper() { const doms = ( this.container ? this.container : document ).querySelectorAll(".swiper-img"); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; new Swiper(dom, { loop: false, // 无缝 autoplay: { //自动开始 delay: 3000, //时间间隔 disableOnInteraction: false, //*手动操作轮播图后不会暂停* }, paginationClickable: true, slidesPerView: 1, // 一组三个 spaceBetween: 30, // 间隔 // 如果需要前进后退按钮 navigation: { nextEl: dom.querySelector(".swiper-button-next"), prevEl: dom.querySelector(".swiper-button-prev"), }, // 窗口变化,重新init,针对F11全屏和放大缩小,必须加 // observer: true, // observeParents: true // // 如果需要分页器 // pagination: { // el: (this.container ? this.container : document).querySelector( // ".swiper-pagination" // ), // clickable: true // 分页器可以点击 // } }); } const pptDoms = ( this.container ? this.container : document ).querySelectorAll(".swiper_ppt"); for (let i = 0; i < pptDoms.length; i++) { const dom = pptDoms[i]; new Swiper(dom, { loop: false, // 无缝 autoplay: false, paginationClickable: true, slidesPerView: 1, // 一组三个 spaceBetween: 30, // 间隔 // 如果需要前进后退按钮 navigation: { nextEl: dom.querySelector(".swiper-button-next"), prevEl: dom.querySelector(".swiper-button-prev"), }, // 窗口变化,重新init,针对F11全屏和放大缩小,必须加 observer: true, observeParents: true, on: { init: (value) => { let currentPage = value.activeIndex + 1; // 获取当前页(从1开始计数) let totalPages = value.slides.length; // 获取总页数 var paginationInfoEl = dom.querySelector(".pageBox"); if (paginationInfoEl) paginationInfoEl.textContent = currentPage + "/" + totalPages; }, slideChange: (value) => { let currentPage = value.activeIndex + 1; // 获取当前页(从1开始计数) let totalPages = value.slides.length; // 获取总页数 var paginationInfoEl = dom.querySelector(".pageBox"); if (paginationInfoEl) paginationInfoEl.textContent = currentPage + "/" + totalPages; }, }, }); } }, initViewer() { const doms = ( this.container ? this.container : document ).querySelectorAll(".openImgBox"); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; new Viewer(dom, { container: this.container ? this.container.querySelector("#app") : "body", navbar: true, // 显示导航栏 toolbar: true, // 显示工具栏 title: true, // 显示标题 }); } }, // 根据关键字全文检索 searchTextByPage(keyword) { const searchResult = []; let catalogIndex = 0; // 所有章节组件(每本书制作时单独配置) const pageData = { pageHeader, chapterOne, chapterTwo, chapterThree, chapterFour, chapterFive, // chapterSix }; // 遍历所有章节文件 for (const key in pageData) { catalogIndex++; let pageComponent, pageExample; // 先渲染一次当前章节文件(这时页面的内容为空),获取页码信息 pageComponent = Vue.extend(pageData[key]); pageExample = new pageComponent({ propsData: { showPageList: [], questionData: {}, isSearch: true, }, }); pageExample.$mount( (this.container ? this.container : document).querySelector( "#searchContent" ) ); // 获取页码 const pageDom = (this.container ? this.container : document) .querySelector("#searchDomBox") .querySelectorAll(".page-box"); const pages = []; for (let i = 0; i < pageDom.length; i++) { const pageDomItem = pageDom[i]; pages.push(Number(pageDomItem.getAttribute("page"))); } // 获取页面结束,卸载销毁 pageExample.$destroy(); (this.container ? this.container : document).querySelector( "#searchDomBox" ).innerHTML = '<div id="searchContent"></div>'; // 遍历页码 if (pages.length) { for (let i = 0; i < pages.length; i++) { const pageNum = pages[i]; // 动态渲染对应章节的页码 pageComponent = Vue.extend(pageData[key]); pageExample = new pageComponent({ propsData: { showPageList: [pageNum], questionData: {}, isSearch: true, }, }); pageExample.$mount( (this.container ? this.container : document).querySelector( "#searchContent" ) ); // 获取对应页面dom const thisPageDom = (this.container ? this.container : document) .querySelector("#searchDomBox") .querySelector(`[page="${pageNum}"]`); if (thisPageDom) { // 获取页面所有text节点 const pageTextList = document.createTreeWalker( thisPageDom, NodeFilter.SHOW_TEXT ); // 匹配关键字 const allPageTextNodes = []; let currentNode = pageTextList.nextNode(); while (currentNode) { allPageTextNodes.push(currentNode); currentNode = pageTextList.nextNode(); } for (let i = 0; i < allPageTextNodes.length; i++) { const textDom = allPageTextNodes[i]; let txtIndex = textDom.textContent.indexOf(keyword); if (txtIndex > -1) { // 记录关键字所在页码、章节以及匹配到的段落 searchResult.push({ page: pageNum, catalog: catalogIndex, txt: textDom.textContent, txtIndex: txtIndex, }); } } // 结束,卸载销毁 pageExample.$destroy(); (this.container ? this.container : document).querySelector( "#searchDomBox" ).innerHTML = '<div id="searchContent"></div>'; } } } } // 输出搜索结果 console.log(searchResult); return searchResult; }, // 根据检索结果跳转对应位置并高亮 searchItemLocation(data) { // 记录高亮信息 this.highlightData = data; // 跳转 this.gotoPage(data.catalog, data.page, () => { }); }, // 页面向下滚动,音频小窗播放功能 getAduio() { let allVideo = ( this.container ? this.container : document ).querySelectorAll(".audio"); allVideo = Array.from(allVideo); this.videoList = allVideo; if (allVideo.length) { // 查找播放状态的最后一条音频 const playAudio = allVideo .reverse() .find((item) => item.paused == false); if (playAudio) { const bottomGap = playAudio.getBoundingClientRect().bottom; if (bottomGap < 0) { playAudio.pause(); this.audioPath = playAudio.src; this.currentTime = playAudio.currentTime; } } } }, // 页面向上滚动,音频小窗回收 handleAudio() { if (!this.audioPath) return false; let allVideo = ( this.container ? this.container : document ).querySelectorAll(".audio"); allVideo = Array.from(allVideo); if (allVideo.length) { //查找与小窗播放音频同源的页面audio DOM const playAudio = allVideo.find((item) => item.src == this.audioPath); if (playAudio) { const bottomGap = playAudio.getBoundingClientRect().bottom; if (bottomGap >= 0) { if (this.$refs.audioPlayer) { const playerState = this.$refs.audioPlayer.getVideoPlayer(); this.audioPath = ""; playAudio.currentTime = playerState.currentTime; if (!playerState.paused) playAudio.play(); } } } } }, // 关闭mini video closeMiniAudio() { this.audioPath = ""; }, // 点击音频播放,关闭其他音频 closeAudio() { let allAudio = ( this.container ? this.container : document ).querySelectorAll(".audio"); for (let index = 0; index < allAudio.length; index++) { const item = allAudio[index]; item.addEventListener("play", () => { const audioList = Array.from(allAudio); for (let cindex = 0; cindex < audioList.length; cindex++) { const citem = audioList[cindex]; if (citem.currentSrc != item.src) { citem.pause(); } } this.closeMiniAudio(); }); } }, // 点击视频关闭其他 closeVideo() { let allVideo = ( this.container ? this.container : document ).querySelectorAll(".video"); for (let index = 0; index < allVideo.length; index++) { const item = allVideo[index]; item.addEventListener("playing", (item) => { const path = item.srcElement.src; const videoList = Array.from(allVideo); for (let cindex = 0; cindex < videoList.length; cindex++) { const citem = videoList[cindex]; if (citem.currentSrc != path && path) { citem.pause(); } } }); } }, // 视频小窗 handleVideoPicture() { let doms = (this.container ? this.container : document).querySelectorAll( ".video" ); doms = Array.from(doms); if (!doms.length) return false; const playVudio = doms.reverse().find((item) => item.paused == false); if (playVudio) { const bottomGap = playVudio.getBoundingClientRect().bottom; const topGap = playVudio.getBoundingClientRect().top; if (bottomGap < 0 || topGap > window.innerHeight) { try { if (playVudio.readyState) playVudio.requestPictureInPicture(); } catch (error) { console.log(error, "小窗错误error"); } } } }, //其他类名下字体大小变化 transformDom(fs) { if (!fs) return; let doms = (this.container ? this.container : document).querySelectorAll( ".block" ); if (!doms.length) return; for (let index = 0; index < doms.length; index++) { const dom = doms[index]; dom.style.fontSize = fs + "px"; } }, } } }); }, components: { initSwiper() { const doms = ( this.container ? this.container : document ).querySelectorAll(".swiper-img"); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; new Swiper(dom, { loop: false, // 无缝 autoplay: { //自动开始 delay: 3000, //时间间隔 disableOnInteraction: false, //*手动操作轮播图后不会暂停* }, paginationClickable: true, slidesPerView: 1, // 一组三个 spaceBetween: 30, // 间隔 // 如果需要前进后退按钮 navigation: { nextEl: dom.querySelector(".swiper-button-next"), prevEl: dom.querySelector(".swiper-button-prev"), }, // 窗口变化,重新init,针对F11全屏和放大缩小,必须加 // observer: true, // observeParents: true // // 如果需要分页器 // pagination: { // el: (this.container ? this.container : document).querySelector( // ".swiper-pagination" // ), // clickable: true // 分页器可以点击 // } }); } const pptDoms = ( this.container ? this.container : document ).querySelectorAll(".swiper_ppt"); for (let i = 0; i < pptDoms.length; i++) { const dom = pptDoms[i]; new Swiper(dom, { loop: false, // 无缝 autoplay: false, paginationClickable: true, slidesPerView: 1, // 一组三个 spaceBetween: 30, // 间隔 // 如果需要前进后退按钮 navigation: { nextEl: dom.querySelector(".swiper-button-next"), prevEl: dom.querySelector(".swiper-button-prev"), }, // 窗口变化,重新init,针对F11全屏和放大缩小,必须加 observer: true, observeParents: true, on: { init: (value) => { let currentPage = value.activeIndex + 1; // 获取当前页(从1开始计数) let totalPages = value.slides.length; // 获取总页数 var paginationInfoEl = dom.querySelector(".pageBox"); if (paginationInfoEl) paginationInfoEl.textContent = currentPage + "/" + totalPages; }, slideChange: (value) => { let currentPage = value.activeIndex + 1; // 获取当前页(从1开始计数) let totalPages = value.slides.length; // 获取总页数 var paginationInfoEl = dom.querySelector(".pageBox"); if (paginationInfoEl) paginationInfoEl.textContent = currentPage + "/" + totalPages; }, }, }); } }, initViewer() { const doms = ( this.container ? this.container : document ).querySelectorAll(".openImgBox"); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; new Viewer(dom, { container: this.container ? this.container.querySelector("#app") : "body", navbar: true, // 显示导航栏 toolbar: true, // 显示工具栏 title: true, // 显示标题 }); } }, // 根据关键字全文检索 searchTextByPage(keyword) { const searchResult = []; let catalogIndex = 0; // 所有章节组件(每本书制作时单独配置) const pageData = { pageHeader, chapterOne, chapterTwo, @@ -966,21 +809,250 @@ chapterFour, chapterFive, // chapterSix }; // 遍历所有章节文件 for (const key in pageData) { catalogIndex++; let pageComponent, pageExample; // 先渲染一次当前章节文件(这时页面的内容为空),获取页码信息 pageComponent = Vue.extend(pageData[key]); pageExample = new pageComponent({ propsData: { showPageList: [], questionData: {}, isSearch: true, }, }); pageExample.$mount( (this.container ? this.container : document).querySelector( "#searchContent" ) ); // 获取页码 const pageDom = (this.container ? this.container : document) .querySelector("#searchDomBox") .querySelectorAll(".page-box"); const pages = []; for (let i = 0; i < pageDom.length; i++) { const pageDomItem = pageDom[i]; pages.push(Number(pageDomItem.getAttribute("page"))); } // 获取页面结束,卸载销毁 pageExample.$destroy(); (this.container ? this.container : document).querySelector( "#searchDomBox" ).innerHTML = '<div id="searchContent"></div>'; // 遍历页码 if (pages.length) { for (let i = 0; i < pages.length; i++) { const pageNum = pages[i]; // 动态渲染对应章节的页码 pageComponent = Vue.extend(pageData[key]); pageExample = new pageComponent({ propsData: { showPageList: [pageNum], questionData: {}, isSearch: true, }, }); pageExample.$mount( (this.container ? this.container : document).querySelector( "#searchContent" ) ); // 获取对应页面dom const thisPageDom = (this.container ? this.container : document) .querySelector("#searchDomBox") .querySelector(`[page="${pageNum}"]`); if (thisPageDom) { // 获取页面所有text节点 const pageTextList = document.createTreeWalker( thisPageDom, NodeFilter.SHOW_TEXT ); // 匹配关键字 const allPageTextNodes = []; let currentNode = pageTextList.nextNode(); while (currentNode) { allPageTextNodes.push(currentNode); currentNode = pageTextList.nextNode(); } for (let i = 0; i < allPageTextNodes.length; i++) { const textDom = allPageTextNodes[i]; let txtIndex = textDom.textContent.indexOf(keyword); if (txtIndex > -1) { // 记录关键字所在页码、章节以及匹配到的段落 searchResult.push({ page: pageNum, catalog: catalogIndex, txt: textDom.textContent, txtIndex: txtIndex, }); } } // 结束,卸载销毁 pageExample.$destroy(); (this.container ? this.container : document).querySelector( "#searchDomBox" ).innerHTML = '<div id="searchContent"></div>'; } } } } // 输出搜索结果 console.log(searchResult); return searchResult; }, // 根据检索结果跳转对应位置并高亮 searchItemLocation(data) { // 记录高亮信息 this.highlightData = data; // 跳转 this.gotoPage(data.catalog, data.page, () => {}); }, // 页面向下滚动,音频小窗播放功能 getAduio() { let allVideo = ( this.container ? this.container : document ).querySelectorAll(".audio"); allVideo = Array.from(allVideo); this.videoList = allVideo; if (allVideo.length) { // 查找播放状态的最后一条音频 const playAudio = allVideo .reverse() .find((item) => item.paused == false); if (playAudio) { const bottomGap = playAudio.getBoundingClientRect().bottom; if (bottomGap < 0) { playAudio.pause(); this.audioPath = playAudio.src; this.currentTime = playAudio.currentTime; } } } }, // 页面向上滚动,音频小窗回收 handleAudio() { if (!this.audioPath) return false; let allVideo = ( this.container ? this.container : document ).querySelectorAll(".audio"); allVideo = Array.from(allVideo); if (allVideo.length) { //查找与小窗播放音频同源的页面audio DOM const playAudio = allVideo.find((item) => item.src == this.audioPath); if (playAudio) { const bottomGap = playAudio.getBoundingClientRect().bottom; if (bottomGap >= 0) { if (this.$refs.audioPlayer) { const playerState = this.$refs.audioPlayer.getVideoPlayer(); this.audioPath = ""; playAudio.currentTime = playerState.currentTime; if (!playerState.paused) playAudio.play(); } } } } }, // 关闭mini video closeMiniAudio() { this.audioPath = ""; }, // 点击音频播放,关闭其他音频 closeAudio() { let allAudio = ( this.container ? this.container : document ).querySelectorAll(".audio"); for (let index = 0; index < allAudio.length; index++) { const item = allAudio[index]; item.addEventListener("play", () => { const audioList = Array.from(allAudio); for (let cindex = 0; cindex < audioList.length; cindex++) { const citem = audioList[cindex]; if (citem.currentSrc != item.src) { citem.pause(); } } this.closeMiniAudio(); }); } }, // 点击视频关闭其他 closeVideo() { let allVideo = ( this.container ? this.container : document ).querySelectorAll(".video"); for (let index = 0; index < allVideo.length; index++) { const item = allVideo[index]; item.addEventListener("playing", (item) => { const path = item.srcElement.src; const videoList = Array.from(allVideo); for (let cindex = 0; cindex < videoList.length; cindex++) { const citem = videoList[cindex]; if (citem.currentSrc != path && path) { citem.pause(); } } }); } }, // 视频小窗 handleVideoPicture() { let doms = (this.container ? this.container : document).querySelectorAll( ".video" ); doms = Array.from(doms); if (!doms.length) return false; const playVudio = doms.reverse().find((item) => item.paused == false); if (playVudio) { const bottomGap = playVudio.getBoundingClientRect().bottom; const topGap = playVudio.getBoundingClientRect().top; if (bottomGap < 0 || topGap > window.innerHeight) { try { if (playVudio.readyState) playVudio.requestPictureInPicture(); } catch (error) { console.log(error, "小窗错误error"); } } } }, //其他类名下字体大小变化 transformDom(fs) { if (!fs) return; let doms = (this.container ? this.container : document).querySelectorAll( ".block" ); if (!doms.length) return; for (let index = 0; index < doms.length; index++) { const dom = doms[index]; dom.style.fontSize = fs + "px"; } }, }, components: { pageHeader, chapterOne, chapterTwo, chapterThree, chapterFour, chapterFive, // chapterSix }, }; </script> <style lang="less" scoped> .page-main { width: 100% !important; height: 100% !important; overflow: auto; width: 100% !important; height: 100% !important; overflow: auto; .page-content { max-width: 816px; min-width: 375px; margin: 0 auto; padding-bottom: 100px; } .page-content { max-width: 816px; min-width: 375px; margin: 0 auto; padding-bottom: 100px; } } </style> src/books/clinicalMedicalSummary/assets/images/0158-01.jpgsrc/books/dentalMorphologyFunction/view/components/header.vue
@@ -5,13 +5,11 @@ <img src="../../assets/images/device_phone_frontcover.jpg" alt="" style="width: 100%;"> </div> </div> <div class="page-box" page="2" style="min-height: auto"> <div v-if="showPageList.indexOf(2) > -1"> <img src="../../assets/images/0001-01.jpg" alt="" style="width: 100%;"> </div> </div> <div class="page-box" page="3"> <div v-if="showPageList.indexOf(3) > -1"> <div class="bodystyle"> @@ -60,7 +58,6 @@ </div> </div> </div> <div class="page-box" page="4"> <div v-if="showPageList.indexOf(4) > -1"> <div class="header"> src/books/digitalDentalRestorationTechnology/assets/images/0028-01-01.png
src/books/digitalDentalRestorationTechnology/assets/images/0028-01-02.png
src/books/digitalDentalRestorationTechnology/assets/images/tuoZhan.svg
@@ -1 +1 @@ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1755139138815" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4392" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><path d="M397.459421 837.555399H190.057869c-9.394495 0-16.62103-7.949188-16.621031-16.621031V158.983769c0-9.394495 7.949188-16.62103 16.621031-16.621031h581.736062c9.394495 0 16.62103 7.949188 16.62103 16.621031v278.944248c0 13.730416 11.562456 25.292872 25.292872 25.292872s25.292872-11.562456 25.292873-25.292872V158.983769c0-36.855328-30.351447-67.206775-67.206775-67.206775H190.057869c-36.855328 0-67.206775 30.351447-67.206775 67.206775v661.950599c0 36.855328 30.351447 67.206775 67.206775 67.206775H397.459421c13.730416 0 25.292872-11.562456 25.292873-25.292872s-11.562456-25.292872-25.292873-25.292872z" fill="" p-id="4393"></path><path d="M880.191955 529.705011c-33.242061-33.242061-87.441073-33.242061-120.683134 0l-247.870148 247.870148c-3.613267 3.613267-5.781228 7.226535-6.503881 12.285109l-24.570219 107.675371c-2.16796 8.671842 0.722653 17.343684 6.503881 23.124911 5.058574 5.058574 11.562456 7.949188 18.066338 7.949189 1.445307 0 3.613267 0 5.058574-0.722654l109.843331-22.402258c5.058574-0.722653 9.394495-3.613267 13.007763-7.226535L880.191955 650.388144c15.898377-15.898377 25.292872-37.577982 25.292872-60.702893s-9.394495-44.081863-25.292872-59.98024z m-35.410021 85.273112l-242.088921 242.08892-64.31616 13.007763 14.453069-62.1482L794.918843 565.115032c13.730416-13.730416 36.132675-13.730416 49.140437 0 6.503881 6.503881 10.117149 15.175723 10.117149 24.570219s-2.890614 18.788991-9.394495 25.292872z" fill="" p-id="4394"></path><path d="M698.805928 208.124206H255.096683c-13.730416 0-25.292872 11.562456-25.292872 25.292872s11.562456 25.292872 25.292872 25.292873h444.431899c13.730416 0 25.292872-11.562456 25.292872-25.292873s-11.562456-25.292872-26.015526-25.292872z" fill="" p-id="4395"></path><path d="M724.0988 356.268172c0-13.730416-11.562456-25.292872-25.292872-25.292872H255.096683c-13.730416 0-25.292872 11.562456-25.292872 25.292872s11.562456 25.292872 25.292872 25.292872h444.431899c13.730416 0 24.570219-11.562456 24.570218-25.292872z" fill="" p-id="4396"></path><path d="M257.987297 485.623147m-27.460833 0a27.460833 27.460833 0 1 0 54.921666 0 27.460833 27.460833 0 1 0-54.921666 0Z" fill="" p-id="4397"></path><path d="M354.100212 485.623147m-27.460833 0a27.460833 27.460833 0 1 0 54.921665 0 27.460833 27.460833 0 1 0-54.921665 0Z" fill="" p-id="4398"></path><path d="M450.213126 485.623147m-27.460832 0a27.460833 27.460833 0 1 0 54.921665 0 27.460833 27.460833 0 1 0-54.921665 0Z" fill="" p-id="4399"></path></svg> <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1755139138815" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4392" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><path d="M397.459421 837.555399H190.057869c-9.394495 0-16.62103-7.949188-16.621031-16.621031V158.983769c0-9.394495 7.949188-16.62103 16.621031-16.621031h581.736062c9.394495 0 16.62103 7.949188 16.62103 16.621031v278.944248c0 13.730416 11.562456 25.292872 25.292872 25.292872s25.292872-11.562456 25.292873-25.292872V158.983769c0-36.855328-30.351447-67.206775-67.206775-67.206775H190.057869c-36.855328 0-67.206775 30.351447-67.206775 67.206775v661.950599c0 36.855328 30.351447 67.206775 67.206775 67.206775H397.459421c13.730416 0 25.292872-11.562456 25.292873-25.292872s-11.562456-25.292872-25.292873-25.292872z" fill="#00918e" p-id="4393"></path><path d="M880.191955 529.705011c-33.242061-33.242061-87.441073-33.242061-120.683134 0l-247.870148 247.870148c-3.613267 3.613267-5.781228 7.226535-6.503881 12.285109l-24.570219 107.675371c-2.16796 8.671842 0.722653 17.343684 6.503881 23.124911 5.058574 5.058574 11.562456 7.949188 18.066338 7.949189 1.445307 0 3.613267 0 5.058574-0.722654l109.843331-22.402258c5.058574-0.722653 9.394495-3.613267 13.007763-7.226535L880.191955 650.388144c15.898377-15.898377 25.292872-37.577982 25.292872-60.702893s-9.394495-44.081863-25.292872-59.98024z m-35.410021 85.273112l-242.088921 242.08892-64.31616 13.007763 14.453069-62.1482L794.918843 565.115032c13.730416-13.730416 36.132675-13.730416 49.140437 0 6.503881 6.503881 10.117149 15.175723 10.117149 24.570219s-2.890614 18.788991-9.394495 25.292872z" fill="#00918e" p-id="4394"></path><path d="M698.805928 208.124206H255.096683c-13.730416 0-25.292872 11.562456-25.292872 25.292872s11.562456 25.292872 25.292872 25.292873h444.431899c13.730416 0 25.292872-11.562456 25.292872-25.292873s-11.562456-25.292872-26.015526-25.292872z" fill="#00918e" p-id="4395"></path><path d="M724.0988 356.268172c0-13.730416-11.562456-25.292872-25.292872-25.292872H255.096683c-13.730416 0-25.292872 11.562456-25.292872 25.292872s11.562456 25.292872 25.292872 25.292872h444.431899c13.730416 0 24.570219-11.562456 24.570218-25.292872z" fill="#00918e" p-id="4396"></path><path d="M257.987297 485.623147m-27.460833 0a27.460833 27.460833 0 1 0 54.921666 0 27.460833 27.460833 0 1 0-54.921666 0Z" fill="#00918e" p-id="4397"></path><path d="M354.100212 485.623147m-27.460833 0a27.460833 27.460833 0 1 0 54.921665 0 27.460833 27.460833 0 1 0-54.921665 0Z" fill="#00918e" p-id="4398"></path><path d="M450.213126 485.623147m-27.460832 0a27.460833 27.460833 0 1 0 54.921665 0 27.460833 27.460833 0 1 0-54.921665 0Z" fill="#00918e" p-id="4399"></path></svg> src/books/digitalDentalRestorationTechnology/assets/images/zongJie.svg
@@ -1 +1 @@ <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1755139571356" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14731" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><path d="M579.2 659.2c6.4-9.6 12.8-19.2 16-28.8l28.8 19.2c-16 25.6-32 48-51.2 70.4l48-6.4c0 9.6 0 19.2 3.2 28.8-32 3.2-64 9.6-92.8 19.2-3.2-9.6-6.4-22.4-9.6-32 9.6-3.2 16-9.6 22.4-16 9.6-6.4 16-16 22.4-25.6-25.6 3.2-32 3.2-35.2 6.4-3.2-6.4-6.4-22.4-9.6-32 6.4-3.2 12.8-9.6 16-16 16-22.4 25.6-44.8 35.2-70.4l32 12.8c-12.8 25.6-25.6 48-41.6 70.4h16z m-64 128c35.2-3.2 70.4-9.6 105.6-19.2l3.2 28.8c-35.2 6.4-73.6 16-102.4 22.4l-6.4-32z m195.2-147.2v28.8h51.2v32h-134.4v-32h51.2V640h-57.6v-32h57.6v-32h35.2v32h57.6v32h-60.8z m-80 80h121.6v108.8h-32v-9.6h-57.6v12.8h-32v-112z m32 28.8v38.4h57.6v-38.4h-57.6zM236.8 537.6c12.8-19.2 19.2-38.4 22.4-60.8l32 6.4c-3.2 22.4-9.6 44.8-22.4 67.2l-32-12.8z m121.6-80H272v-92.8h41.6c-6.4-16-12.8-28.8-22.4-38.4l28.8-12.8c12.8 12.8 22.4 28.8 28.8 44.8l-16 6.4H384c9.6-16 19.2-32 25.6-51.2l32 12.8c-6.4 12.8-16 25.6-22.4 38.4h38.4v92.8h-89.6c16 9.6 28.8 22.4 41.6 35.2l-22.4 19.2c-12.8-16-28.8-28.8-44.8-41.6l16-12.8z m41.6 73.6c12.8 0 16-3.2 16-25.6 9.6 6.4 19.2 9.6 28.8 12.8-3.2 32-12.8 41.6-44.8 41.6h-51.2c-38.4 0-51.2-9.6-51.2-38.4v-51.2h35.2v48c0 9.6 3.2 9.6 19.2 9.6l48 3.2z m-92.8-102.4H416v-35.2H307.2v35.2z m147.2 41.6c16 19.2 28.8 38.4 38.4 60.8l-28.8 12.8c-9.6-22.4-19.2-41.6-35.2-60.8l25.6-12.8z" fill="#000333" p-id="14732"></path><path d="M825.6 960H204.8c-38.4 0-67.2-32-67.2-67.2V204.8c0-38.4 32-67.2 67.2-67.2h121.6c19.2 0 35.2 16 35.2 35.2s-16 35.2-35.2 35.2H204.8V896h617.6V204.8h-112c-19.2 0-35.2-16-35.2-35.2s16-35.2 35.2-35.2h112c38.4 0 67.2 32 67.2 67.2v688c3.2 38.4-28.8 70.4-64 70.4z" fill="#000333" p-id="14733"></path><path d="M636.8 272h-240c-57.6 0-102.4-44.8-102.4-102.4s44.8-102.4 102.4-102.4h240c57.6 0 102.4 44.8 102.4 102.4s-48 102.4-102.4 102.4z m-243.2-137.6c-19.2 0-35.2 16-35.2 35.2s16 35.2 35.2 35.2h240c19.2 0 35.2-16 35.2-35.2s-16-35.2-35.2-35.2h-240z" fill="#000333" p-id="14734"></path></svg> <?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1755139571356" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14731" xmlns:xlink="http://www.w3.org/1999/xlink" width="32" height="32"><path d="M579.2 659.2c6.4-9.6 12.8-19.2 16-28.8l28.8 19.2c-16 25.6-32 48-51.2 70.4l48-6.4c0 9.6 0 19.2 3.2 28.8-32 3.2-64 9.6-92.8 19.2-3.2-9.6-6.4-22.4-9.6-32 9.6-3.2 16-9.6 22.4-16 9.6-6.4 16-16 22.4-25.6-25.6 3.2-32 3.2-35.2 6.4-3.2-6.4-6.4-22.4-9.6-32 6.4-3.2 12.8-9.6 16-16 16-22.4 25.6-44.8 35.2-70.4l32 12.8c-12.8 25.6-25.6 48-41.6 70.4h16z m-64 128c35.2-3.2 70.4-9.6 105.6-19.2l3.2 28.8c-35.2 6.4-73.6 16-102.4 22.4l-6.4-32z m195.2-147.2v28.8h51.2v32h-134.4v-32h51.2V640h-57.6v-32h57.6v-32h35.2v32h57.6v32h-60.8z m-80 80h121.6v108.8h-32v-9.6h-57.6v12.8h-32v-112z m32 28.8v38.4h57.6v-38.4h-57.6zM236.8 537.6c12.8-19.2 19.2-38.4 22.4-60.8l32 6.4c-3.2 22.4-9.6 44.8-22.4 67.2l-32-12.8z m121.6-80H272v-92.8h41.6c-6.4-16-12.8-28.8-22.4-38.4l28.8-12.8c12.8 12.8 22.4 28.8 28.8 44.8l-16 6.4H384c9.6-16 19.2-32 25.6-51.2l32 12.8c-6.4 12.8-16 25.6-22.4 38.4h38.4v92.8h-89.6c16 9.6 28.8 22.4 41.6 35.2l-22.4 19.2c-12.8-16-28.8-28.8-44.8-41.6l16-12.8z m41.6 73.6c12.8 0 16-3.2 16-25.6 9.6 6.4 19.2 9.6 28.8 12.8-3.2 32-12.8 41.6-44.8 41.6h-51.2c-38.4 0-51.2-9.6-51.2-38.4v-51.2h35.2v48c0 9.6 3.2 9.6 19.2 9.6l48 3.2z m-92.8-102.4H416v-35.2H307.2v35.2z m147.2 41.6c16 19.2 28.8 38.4 38.4 60.8l-28.8 12.8c-9.6-22.4-19.2-41.6-35.2-60.8l25.6-12.8z" fill="#00918e" p-id="14732"></path><path d="M825.6 960H204.8c-38.4 0-67.2-32-67.2-67.2V204.8c0-38.4 32-67.2 67.2-67.2h121.6c19.2 0 35.2 16 35.2 35.2s-16 35.2-35.2 35.2H204.8V896h617.6V204.8h-112c-19.2 0-35.2-16-35.2-35.2s16-35.2 35.2-35.2h112c38.4 0 67.2 32 67.2 67.2v688c3.2 38.4-28.8 70.4-64 70.4z" fill="#00918e" p-id="14733"></path><path d="M636.8 272h-240c-57.6 0-102.4-44.8-102.4-102.4s44.8-102.4 102.4-102.4h240c57.6 0 102.4 44.8 102.4 102.4s-48 102.4-102.4 102.4z m-243.2-137.6c-19.2 0-35.2 16-35.2 35.2s16 35.2 35.2 35.2h240c19.2 0 35.2-16 35.2-35.2s-16-35.2-35.2-35.2h-240z" fill="#00918e" p-id="14734"></path></svg> src/books/digitalDentalRestorationTechnology/assets/main.less
@@ -13,6 +13,24 @@ position: relative; } .imgBox-003 { width: 100%; height: 280px; margin-bottom: 18px; } .textarea-box { font-size: 1em; font-family: "Noto Sans SC"; width: 93%; max-width: 93%; border-color: #e9f2f3; &:focus { border-color: #40a8aa; outline: none; } } .bodystyle { padding: 0 13%; @@ -197,10 +215,26 @@ vertical-align: middle; } .fTitle { color: #40a8aa !important; font-size: 17px !important; margin-top: 20px !important; margin-bottom: 25px !important; margin-left: -16px !important; } .CaseStudy-title { background-color: #40a8aa; line-height: 21px; height: 21px; font-size: 14px; font-weight: 600; background-color: #00918e; color: #fff; padding-left: 20px; padding-left: 10px; } .fontGreen { color: #00918e !important; } .CaseStudy-content { @@ -257,9 +291,15 @@ .knowledgeExpansion-img { position: absolute; width: 100px; top: -25px; width: 80px; top: -20px; left: 30px; } .learngoalRange { margin-top: 1px !important; margin-bottom: -3px !important; text-indent: 0em; } /*<h2>二级标题*/ @@ -303,12 +343,30 @@ margin: 1em auto !important; } .s-pic { width: 12px; } .oneTitle { font-weight: 800; margin-top: 150px !important; margin-bottom: 150px !important; } h4.fourthTitle { font-size: 1.1em; line-height: 1.3em; text-indent: 2em; margin-top: 1em; color: #009290; } .titleLeftmove { margin-left: 10px !important; } .imgFloat { display: flex; } span.underline { @@ -410,10 +468,6 @@ color: #00918e; } /*图片说明居中加粗*/ .imgdescript-b { font-family: "汉仪楷体", "ETrump KaiTi", "方正仿宋", "FZFSJW--GB1-0"; @@ -441,7 +495,7 @@ margin: 0.3em auto; text-align: center; text-indent: 0em; color: #5A5A5A; color: #000; } /*右下角说明*/ @@ -507,42 +561,60 @@ } } } .summary-content { padding: 15px 0; background-color: #c9e1e1; width: 100%; display: flex; justify-content: space-around; flex-wrap: wrap; .summary-content-box { margin: 5px 0; width: 45%; overflow: hidden; display: flex; align-items: center; justify-content: center; cursor: pointer; } span { margin-left: 5px; width: 90%; overflow: hidden; white-space: nowrap; /* 强制文本在一行显示 */ text-overflow: ellipsis; /* 显示省略号 */ &:hover { color: #00918e; text-decoration: underline; } } } } .img-float { width: 310px; float: left; height: auto; margin: auto; margin-right: 20px; img { width: 100%; } p { margin: 0; .txtSurroundRight { .qrbodyPic { float: right; margin-left: 20px; } } .img-rights { width: 310px; float: right; height: auto; margin: auto; margin-left: 20px; img { width: 100%; } p { margin: 0 !important; .txtSurroundLeft { .qrbodyPic { float: left; margin-right: 20px; } } @@ -760,6 +832,13 @@ } } .fTitle { font-style: 15px !important; margin-top: 20px !important; margin-bottom: 20px !important; color: #00918e; } .custom-dialog { overflow: hidden !important; src/books/digitalDentalRestorationTechnology/view/components/chapter001.vue
@@ -3,26 +3,49 @@ <div class="page-box" page="7"> <div v-if="showPageList.indexOf(7) > -1"> <div class="bodystyle"> <h1 class="firstTitle-l mb-70 pt-70">绪论</h1> <div class="bodyPic"><img src="../../assets/images/0017-01.jpg" style="width:30%" alt="" active="true" /></div> <div class="bodyPic"><img src="../../assets/images/0017-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">素质目标</span></p> <p class="content">用发展的眼光看问题,积极拓展,勇于创新,致力于推动口腔医学技术发展。</p> <p class="center">........................</p> <p class="center"><span class="bold">知识目标</span></p> <p class="content">(1)掌握:计算机辅助设计与制造的定义;口腔修复CAD/CAM系统的组成。</p> <p class="content">(2)熟悉:口腔CAD软件的特点。</p> <p class="content">(3)了解:CAM设备可加工的材料范围。</p> <p class="center">........................</p> <p class="center"><span class="bold">能力目标</span></p> <p class="content">(1)能够运用思维导图总结口腔扫描原理。</p> <p class="content">(2)能够在义齿制作过程中根据实际需求选择适宜的扫描设备。</p> <p class="content">计算机辅助设计与制造(computer-aided design and <h1 class="firstTitle-l mb-70 pt-70 oneTitle"> 绪 论 </h1> <div class="learnGoal"> <img class="learnImg img-h" src="../../assets/images/learnGoal.png" alt="" /> <p class="center learngoalRange"> <span class="bold">素质目标</span> </p> <p class="content"> 用发展的眼光看问题,积极拓展,勇于创新,致力于推动口腔医学技术发展。 </p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"> <span class="bold">知识目标</span> </p> <p class="content"> (1)掌握:计算机辅助设计与制造的定义;口腔修复CAD/CAM系统的组成。 </p> <p class="content">(2)熟悉:口腔CAD软件的特点。</p> <p class="content">(3)了解:CAM设备可加工的材料范围。</p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"> <span class="bold">能力目标</span> </p> <p class="content">(1)能够运用思维导图总结口腔扫描原理。</p> <p class="content"> (2)能够在义齿制作过程中根据实际需求选择适宜的扫描设备。 </p> </div> <div class="knowledgeExpansion" @click="toUrl(getResourceInfo('A1'))"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>教学课件</span> </div> <div class="knowledgeExpansion-box"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>教学课件</span> </div> </div> <p class="content"> 计算机辅助设计与制造(computer-aided design and manufacturing,CAD/CAM)是将光电子技术、计算机技术与数控机械加工技术集于一体的一门技术。口腔修复CAD/CAM系统在组成上主要包括四个部分,即标准牙冠三维图形数据、数据获取设备、CAD(修复体设计程序)和CAM(数据加工设备和控制程序)。近30年来,随着设备软硬件系统的不断改进升级,以及配套可切削陶瓷材料种类及性能的持续改进,椅旁CAD/CAM技术在口腔临床的接受程度与应用范围不断扩大。目前,多种口腔修复体已可通过椅旁CAD/CAM技术加工制作,可以为医生提供精确、高效、椅旁一次完成的临床治疗手段,为患者提供高品质、高美观的修复体,引领口腔治疗技术进入数字化时代。 </p> </div> <div class="page-bottom-right">001</div> </div> @@ -30,16 +53,16 @@ <div class="page-box" page="8"> <div v-if="showPageList.indexOf(8) > -1"> <div class="page-header-left"> <div class="header-txt"> 数字化口腔修复技术 </div> <div class="header-txt">数字化口腔修复技术</div> </div> <div class="bodystyle"> <h3 class="thirdTitle">一、口腔CAD/CAM技术的发展</h3> <p class="content">20世纪40年代,以计算机和信息技术为核心的第三次工业革命浪潮在全球兴起,1983年法国牙医弗朗索瓦·杜雷(Francois <p class="content"> 20世纪40年代,以计算机和信息技术为核心的第三次工业革命浪潮在全球兴起,1983年法国牙医弗朗索瓦·杜雷(Francois Duret)研发的第一台牙科CAD/CAM样机在法国问世,开创了数字化口腔医学的新时代。20世纪60年代,该技术快速发展,它以计算机作为主要技术手段,处理各种数字信息和图形信息,辅助完成产品设计和制造中的各项活动。迄今为止,国内外市场上已有各种类型的口腔CAD/CAM系统。CAD/CAM技术普遍提高了技工室(技工中心)工艺制作流程的整体质量,缩短了修复体的制作周期,降低了修复体批量生产的制作成本。此外,根据口腔CAD/CAM系统的应用模式,其还可分为椅旁系统和技工室系统。椅旁系统主要用于数字化口腔诊室,由医生在口腔技师配合下在椅旁完成口内数字印模扫描、修复体设计及制作的工艺流程。椅旁系统的特点是配备口内扫描设备和小型椅旁加工设备,制作的修复材料以玻璃陶瓷和树脂类为主,制作的修复体类型多以单冠、嵌体、贴面为主,典型系统为Sirona CEREC系统。技工室系统主要由口腔技师完成数字化印模扫描(或通过网络获得临床扫描的数字印模)、修复体设计及制作的工艺流程。技工室系统的特点在于其软硬件系统面向口腔技师开发,CAD软件提供较多可供使用者调整的工艺设计参数,CAM设备则多以四轴、五轴的专业加工设备为主,可满足口腔临床对各种修复体类型及修复材料的制作需求,典型系统如3Shape、Exocad设计系统及Sirona Inlab、Dental wings、3 M Lava、R&K Dalron、DMG等系统。</p> Inlab、Dental wings、3 M Lava、R&K Dalron、DMG等系统。 </p> <p class="content"> 在义齿制作工艺数字化改革之风的驱动下,在“互联网+”背景下,医生探索使用VR、AR等虚拟现实技术,系统开发、设计形式多样的数字化资源,将抽象、复杂的产品设计和制造过程简单化、可视化,无须进行堆蜡、包埋、铸造、人工研磨等,操作简单,所需时间短,无印模材料、石膏材料等的形变,故产品可靠性、生物性、美观性均较好。 </p> @@ -47,12 +70,14 @@ <p class="content"> 按照操作流程,口腔CAD/CAM系统分成三个基本版块,分别为数字化扫描部分、数字化CAD流程及数字化CAM环节。这三部分分别完成口腔三维数据采集、义齿数字化设计和义齿数字化制造。三者协同配合,构成口腔CAD/CAM系统的有机整体。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0018-01.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0018-01.jpg" style="width: 70%" alt="图0-0-1 CAD/CAM系统构成" active="true" /> <p class="imgdescript-b">图0-0-1 CAD/CAM系统构成</p> <p class="imgdescript-l">A.口腔三维数据采集;B.义齿数字化设计;C.义齿数字化制造。</p> <p class="imgdescript-l imgtitleTop"> A.口腔三维数据采集;B.义齿数字化设计;C.义齿数字化制造。 </p> </div> </div> <div class="page-bottom-left">002</div> </div> @@ -64,17 +89,16 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0019-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图0-0-1(续图)</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0019-01.jpg" style="width: 75%" alt="图0-0-1(续图)" active="true" /> <p class="imgdescript-b">图0-0-1(续图)</p> </div> <p class="poemtitle-l">(一)口腔数字化扫描设备</p> <p class="poemtitle-l kTitle">(一)口腔数字化扫描设备</p> <p class="content"> 口腔数字化扫描设备作为数字化工艺流程的数据输入环节,其原理是借助各种三维扫描技术将牙颌石膏模型、印模、口内牙列及上下颌颌位关系、面部形态、颅颌面骨骼及软组织信息等转换成计算机中三维可视化的数字模型。三维数字模型是后续义齿设计的数据基础,可在专用的数字化CAD软件中实现三维观察和编辑,通常是一种开放格式的三角网格模型。其常见格式为基于三角形网格的三维图形文件格式,即STL(standard triangle language)格式。常用的三维扫描技术根据其技术原理可分为接触式扫描技术、光学扫描技术和影像学扫描技术等,根据其应用模式可分为口内扫描技术、牙颌模型扫描技术、颜面部扫描技术和体扫描技术等。 </p> </div> <div class="page-bottom-right">003</div> </div> @@ -82,36 +106,37 @@ <div class="page-box" page="10"> <div v-if="showPageList.indexOf(10) > -1"> <div class="page-header-left"> <div class="header-txt"> 数字化口腔修复技术 </div> <div class="header-txt">数字化口腔修复技术</div> </div> <div class="bodystyle"> <p class="poemtitle-l">(二)义齿数字化设计软件</p> <p class="poemtitle-l kTitle">(二)义齿数字化设计软件</p> <p class="content"> 义齿数字化设计软件(简称“CAD软件”)是数字化工艺流程中的设计环节,它的工作原理是基于三维扫描设备采集建立的口腔软硬组织数字模型,借助高度自动化智能化的计算机建模算法及义齿数据库的支持,采用人机交互式的操作模式,实现高精度的义齿数字模型设计。 </p> <p class="content"> 由于义齿形态设计的个性化需求,口腔技师在义齿制作的传统工艺中发挥着至关重要的作用。在雕蜡塑形的制作工艺中,技师人为因素对义齿精度的影响不可避免。CAD软件最突出的特点是可实现定量参数化控制下的三维精确设计,可最大限度地降低人为因素的不稳定性,控制义齿设计的各项关键指标精度。此外,CAD软件还具有强大的个性化参数设置能力和人机交互的灵活操作方式,可给予技师充分发挥经验与创造力的空间,从而获得兼顾关键部位精度与个性化特征表达的义齿CAD模型。与传统义齿蜡型制作工艺相比,义齿CAD设计的优势在于:CAD软件是一种凝结了义齿形态设计知识与经验的数学建模工具,可有效帮助年轻技师快速提高义齿设计水平和设计效率,降低技师学习成本,提高义齿生产效率。 </p> <p class="poemtitle-l">(三)义齿数字化加工设备</p> <p class="poemtitle-l kTitle">(三)义齿数字化加工设备</p> <p class="content"> 义齿数字化加工设备(又称“CAM设备”)是数字化工艺流程的输出环节,是实现义齿实物最终制作的技术手段,其工作原理是将CAD软件设计完成的义齿数字模型首先通过数控工艺规划软件生成CAM设备可识别的加工工艺文件,然后CAM设备再通过精确的软件程序控制执行相应工艺文件中的加工程序,从而完成满足一定精度要求的义齿实物制作。 </p> <p class="content">CAM设备按工作原理可分为数控加工(numerical control processing,简称“NC加工”)设备和三维打印(three-dimensional <p class="content"> CAM设备按工作原理可分为数控加工(numerical control processing,简称“NC加工”)设备和三维打印(three-dimensional printing,3DP)设备。目前可用CAM技术加工的材料涵盖了各种主流口腔金属、陶瓷及复合树脂,一些传统制作工艺难以加工或是无法加工的材料(如氧化锆陶瓷)目前只能采用CAM技术加工。 </p> <p class="content"> 口腔数字化技术的进步不断促使口腔医生的工作方式作出改变。数字化技术在口腔科中最显著的优势体现在简化临床修复流程,减少患者预约复诊次数,缩短临床手术和技工室修复体制作返回时间,并在不影响临床结果的前提下减少制造步骤、优化工作流程、提高工作效率。同时CAD/CAM修复材料具有质量稳定、成本较低、修复周期短等特点,促进了CAD/CAM修复材料的广泛使用。CAD/CAM的应用增加了修复体的精密度、准确度,可减少临床诊治时间和就诊次数,数字存档可显著提高数据保留率,更有利于以患者为中心的治疗和临床修复后随访。CAD/CAM制作的修复义齿在强度、刚度及耐腐蚀性等方面具有优势,提升了义齿与牙体之间的贴合度,增加了义齿的韧性、极限弯曲强度和弹性模量等。除此之外,CAD/CAM还可应用于过渡性粘接的修复体制作,或用来恢复咬合。虽然CAD/CAM技术还存在部分局限性,如初始成本高的,但其给口腔修复带来的诸多优点不容小觑。未来,CAD/CAM将更加广泛地应用于口腔修复,促进口腔修复技术的迅猛发展。 </p> <div class="bodyPic"><img src="../../assets/images/0020-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">全瓷修复</span></p> <p class="quotation"> 全瓷修复系统种类繁多,根据材料的不同可分为氧化铝陶瓷(如In-Ceram系统)、氧化锆陶瓷(如Cercon系统)、氧化硅陶瓷(IPS-Empress系统)等;根据加工工艺可分为粉浆涂塑(如In-Ceram等)、失蜡铸造(如IPS-Empress等)、机械切削(如Cercon)等;根据完成修复体最终外形和结构的不同可分为单层结构与双层结构。 </p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">全瓷修复</span></p> <p class="quotation"> 全瓷修复系统种类繁多,根据材料的不同可分为氧化铝陶瓷(如In-Ceram系统)、氧化锆陶瓷(如Cercon系统)、氧化硅陶瓷(IPS-Empress系统)等;根据加工工艺可分为粉浆涂塑(如In-Ceram等)、失蜡铸造(如IPS-Empress等)、机械切削(如Cercon)等;根据完成修复体最终外形和结构的不同可分为单层结构与双层结构。 </p> </div> </div> <div class="page-bottom-left">004</div> </div> </div> @@ -122,25 +147,94 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="bodyPic"><img src="../../assets/images/0021-01.jpg" style="width:80%" alt="" active="true" /></div> <div class="unitSummary"> <div class="summary-lift" @click="toUrl(getResourceInfo('B1'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span>考试知识点总结</span> </div> <div class="summary-right" @click="toUrl(getResourceInfo('C1'))"> <img src="../../assets/images/zongJie.svg" alt="" /> <span>本章小节</span> </div> </div> <div class="knowledgeExpansion"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>题库</span> </div> <div class="knowledgeExpansion-box"> <img src="../../assets/images/tuoZhan.svg" alt="" /> <span @click="openQuestion(getResourceInfo('AA1'))">拓展练习</span> </div> </div> <p class="right-info">(李文娟)</p> </div> <div class="page-bottom-right">005</div> </div> </div> <preView :md5="p_md5" :pdfTitle="somePdfTitleValue" ref="pdfDialogRef"></preView> <dialogExaminations :cardList="interfaceQuestion" :questionIDList="questionIDList" :page="questionNum" :questionTitle="questionTitleMain" ref="dialogRef"> </dialogExaminations> </div> </template> <script> import preView from "@/components/pdfview/index.vue"; import dialogExaminations from "@/components/dialogExaminations/index.vue"; export default { name: "chapterOne", props: { showPageList: { type: Array, }, getResourceInfo: { type: Function, // 明确指定它是一个函数 required: true }, interfaceQuestion: { type: Array, required: true, default: () => [], }, }, } components: { preView, dialogExaminations, }, data() { return { p_md5: "", somePdfTitleValue: "", // 题目相关 questionNum: 0, questionTitleMain: "", questionIDList: [], }; }, mounted() { }, methods: { toUrl(val) { if (val != null) { console.log(val, "val"); this.p_md5 = val.md5; this.somePdfTitleValue = val.resourceName; this.$refs.pdfDialogRef.openDialog(); } }, openQuestion(val) { if (val != undefined) { this.questionNum = val.pagination; this.questionTitleMain = val.resourceName; this.questionIDList = val.ids; this.$nextTick(() => { this.$refs.dialogRef.openDialogQuestion(); }); } }, }, }; </script> <style lang="less" scoped></style> <style lang="less" scoped></style> src/books/digitalDentalRestorationTechnology/view/components/chapter002.vue
@@ -9,32 +9,56 @@ </div> <div class="bodystyle"> <h1 class="firstTitle-l mb-70 pt-70">项目一 口腔扫描技术</h1> <div class="bodyPic"><img src="../../assets/images/0022-01.jpg" style="width:30%" alt="" active="true" /></div> <div class="bodyPic"><img src="../../assets/images/0017-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">素质目标</span></p> <p class="content">(1)具备严谨的科学态度,注重扫描数据的准确性和可靠性。</p> <p class="content">(2)具有团队协作意识,能够与口腔医生、护士、技师密切合作。</p> <p class="content">(3)提升学习能力,勇于尝试扫描方法和技术,提高扫描效率和质量。</p> <p class="center">........................</p> <p class="center"><span class="bold">知识目标</span></p> <p class="content">(1)掌握:口腔扫描技术的工艺流程。</p> <p class="content">(2)熟悉:激光、结构光和立体摄影等不同扫描技术的工作原理。</p> <p class="center">........................</p> <p class="content"><span class="bold">能力目标</span></p> <p class="content">(1)能够正确安装、调试口内扫描仪。</p> <p class="content">(2)能够熟练进行口腔扫描操作,正确扫描牙齿、牙周组织、咬合关系等。</p> <div class="learnGoal"> <img class="learnImg img-h" src="../../assets/images/learnGoal.png" alt="" /> <p class="center learngoalRange"><span class="bold">素质目标</span></p> <p class="content">(1)具备严谨的科学态度,注重扫描数据的准确性和可靠性。</p> <p class="content">(2)具有团队协作意识,能够与口腔医生、护士、技师密切合作。</p> <p class="content">(3)提升学习能力,勇于尝试扫描方法和技术,提高扫描效率和质量。</p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"><span class="bold">知识目标</span></p> <p class="content">(1)掌握:口腔扫描技术的工艺流程。</p> <p class="content">(2)熟悉:激光、结构光和立体摄影等不同扫描技术的工作原理。</p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"><span class="bold">能力目标</span></p> <p class="content">(1)能够正确安装、调试口内扫描仪。</p> <p class="content">(2)能够熟练进行口腔扫描操作,正确扫描牙齿、牙周组织、咬合关系等。</p> </div> <div class="knowledgeExpansion"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>教学课件</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A2'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目一 教学课件 口扫原理</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A3'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目一 教学课件 仓扫原理</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A4'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目一 教学课件 口腔扫描技术工艺流程</span> </div> </div> <p class="content"> 口腔扫描技术是口腔数字化工艺技术系统的第一环节,主要用于口腔牙颌数据采集,为医生诊断和技师设计修复体提供数据信息;通过口腔扫描设备,采集义齿设计制作需要的信息,如牙体、牙列、黏膜、颌位关系等,运用计算机技术整合数字模型,还原患者口腔结构,形成数字化印模。 </p> <h2 class="secondTitle">任务一 口腔扫描技术原理</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">患者,女,28岁。根管治疗后要求进行26烤瓷冠修复,门诊医生在治疗过程中为患者进行了牙体预备和口内扫描,并将数据传给口腔技工室。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">口内扫描技术是基于什么原理来工作的?</p> <div class="CaseStudy"> <div class="CaseStudy-title bold">任务案例</div> <div class="CaseStudy-content"> <p class="titleQuot-1 caseStudy1">【案例】</p> <p class="content">患者,女,28岁。根管治疗后要求进行26烤瓷冠修复,门诊医生在治疗过程中为患者进行了牙体预备和口内扫描,并将数据传给口腔技工室。</p> <p class="titleQuot-1 caseStudy1">【问题】</p> <p class="content">口内扫描技术是基于什么原理来工作的?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.one" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> </div> <div class="page-bottom-left">006</div> </div> @@ -46,31 +70,33 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="titleQuot-1">【任务分析】</p> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content">口腔扫描技术是借助各种扫描设备和软件来完成口腔组织形态信息的测量和数据分析的扫描测量技术。其数据采集方式、数据精度和数据采集效率与义齿制作流程紧密相关。</p> <p class="content"> 根据数据采集方式不同,可以将口腔扫描技术分为直接法和间接法。根据临床应用范围的不同,可以将口腔扫描技术分为口内扫描技术、牙颌模型扫描技术、颜面部扫描技术和CT扫描技术。根据扫描原理的不同,可以将口腔扫描技术分为接触式扫描技术和非接触式扫描技术;其中,非接触式扫描技术又可以分为光学扫描技术、立体摄影技术和影像学扫描技术。接触式扫描技术和光学扫描技术常用于采集口腔数字模型的数据,影像学扫描技术常用于采集颅颌面部组织的三维数据。下面针对常用扫描技术的原理和应用进行介绍。 </p> <h3 class="thirdTitle">一、口内扫描技术原理</h3> <div class="bodyPic"><img src="../../assets/images/0023-01.jpg" style="width:30%" alt="" active="true" /></div> <bookVideo :videoInfo="getResourceInfo('D2')" :BookId="config.activeBook.bookId"></bookVideo> <p class="content">口内扫描技术是通过直接采集数据的方式,将数字化扫描设备放置在患者口内,对口腔软硬组织进行扫描测量,实时获取数字化印模。</p> <p class="content"> 口内扫描技术可简化传统义齿制作中印模制取和模型灌注的流程,减少材料的消耗,节约成本;提升患者的舒适度,避免印模制取引起的患者不适;降低操作误差;实现口腔真色彩组织结构数字印模,方便进行比色、数字化设计和医患沟通;使医生能够即时检查预备体的形态,判断牙体预备质量,检查预备体的细节,如轴面聚合度、肩台形态、预备体边缘、软硬组织形态和倒凹、义齿就位道等,发现问题立即在患者口内进行调改;利于配合CAD/CAM系统实现快速设计制作临时及最终修复体,为患者带来更加理想的就诊体验。 </p> <p class="content">口内扫描技术的原理主要是光学三角测量法、共聚焦显微成像技术、主动波阵面采样技术。</p> <p class="poemtitle-l">(一)光学三角测量法</p> <p class="content"> 光学三角测量法是口内扫描技术的基础原理,通过待测点相对于光学基准线偏移产生的变化,计算该点的信息,从而构建三维结构。光源经透镜投射在被测模型表面的光线被反射后,经过接收器透镜由感光元件(charge coupled device,CCD)接收,通过已设定的发射光源角度和高度求解光路系统相似三角形,测定模型三维数据,根据平面处于不同位置时,感光元件上的成像位置的变化,生成三维数据模型(图1-1-1)。以光学三角测量法为基础,将光学扫描技术分为激光扫描技术、结构光扫描技术和立体摄影技术。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0023-02.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript-l">图1-1-1 三角测量法原理示意图</p> <p class="poemtitle-l kTitle">(一)光学三角测量法</p> <div class="txtSurroundRight"> <div class="qrbodyPic"> <img class="openImgBox" src="../../assets/images/0023-02.jpg" style="width:320px" alt="图1-1-1 三角测量法原理示意图" active="true" /> <p class="imgdescript-b">图1-1-1 三角测量法原理示意图</p> </div> <p class="content"> 光学三角测量法是口内扫描技术的基础原理,通过待测点相对于光学基准线偏移产生的变化,计算该点的信息,从而构建三维结构。光源经透镜投射在被测模型表面的光线被反射后,经过接收器透镜由感光元件(charge coupled device,CCD)接收,通过已设定的发射光源角度和高度求解光路系统相似三角形,测定模型三维数据,根据平面处于不同位置时,感光元件上的成像位置的变化,生成三维数据模型(图1-1-1)。以光学三角测量法为基础,将光学扫描技术分为激光扫描技术、结构光扫描技术和立体摄影技术。 </p> </div> <p class="content"><span class="bold">1.激光扫描技术</span> 由激光器经聚光透镜向被测物表面投射点状或线状光束,在被测物表面上形成光点或光线,并通过成像透镜反射成像在CCD上。随着光源或被测物体的移动或转动,图像传感器不断获取反射的光点或光线,每个光点都代表被测物体表面的三维空间坐标。利用采集到的三维数据信息,经计算机处理生成可视化的数字模型。 class="bold fontGreen">1.激光扫描技术</span> 由激光器经聚光透镜向被测物表面投射点状或线状光束,在被测物表面上形成光点或光线,并通过成像透镜反射成像在CCD上。随着光源或被测物体的移动或转动,图像传感器不断获取反射的光点或光线,每个光点都代表被测物体表面的三维空间坐标。利用采集到的三维数据信息,经计算机处理生成可视化的数字模型。 </p> </div> <div class="page-bottom-right">007</div> @@ -87,29 +113,31 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">2.结构光扫描技术</span> 具有扫描速度较快、盲区少、数据密度高、细节表现力好的优点,但由于多角度扫描拼接会产生大量的冗余数据和噪点,对扫描软件的后处理功能要求较高。 class="bold fontGreen">2.结构光扫描技术</span> 具有扫描速度较快、盲区少、数据密度高、细节表现力好的优点,但由于多角度扫描拼接会产生大量的冗余数据和噪点,对扫描软件的后处理功能要求较高。 </p> <p class="content"><span class="bold">3.立体摄影技术</span> 主要利用双目视觉原理,即双眼观察同一物体的位置和角度稍有不同,将双眼看到的影像送入大脑,合成具有长度、宽度和高度的立体影像。口腔扫描时,用照相机或摄像机从多个角度拍摄口腔结构形成影像,通过解析几何的方法,由计算机对所拍摄的二维影像进行运算处理,分析影像之间的空间位置,形成立体结构关系,计算出物体的三维坐标,从而建立出三维立体模型。 class="bold fontGreen">3.立体摄影技术</span> 主要利用双目视觉原理,即双眼观察同一物体的位置和角度稍有不同,将双眼看到的影像送入大脑,合成具有长度、宽度和高度的立体影像。口腔扫描时,用照相机或摄像机从多个角度拍摄口腔结构形成影像,通过解析几何的方法,由计算机对所拍摄的二维影像进行运算处理,分析影像之间的空间位置,形成立体结构关系,计算出物体的三维坐标,从而建立出三维立体模型。 </p> <p class="poemtitle-l">(二)共聚焦显微成像技术</p> <p class="content"> 共聚焦显微成像技术是利用放置在光源后和探测器前的共焦针孔形成点光源和点探测来成像的技术。光源发射的光经过照明针孔,在牙齿焦平面上的某点聚焦,其反射光线由原光路返回,在探测针孔内成像,非聚焦范围的反射光线无法在探测针孔内成像;通过逐层扫描,来获得牙齿不同位置的形貌数据,构建出牙的三维形态(图1-1-2)。共聚焦显微成像技术的优点是扫描精度较高、图像清晰,缺点是逐帧扫描的速度相对较慢。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0024-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript-l">图1-1-2 共聚焦显微成像技术示意图</p> <p class="poemtitle-l kTitle">(二)共聚焦显微成像技术</p> <div class="txtSurroundRight"> <div class="qrbodyPic "> <img class="openImgBox" src="../../assets/images/0024-01.jpg" style="width:250px" alt="图1-1-2 共聚焦显微成像技术示意图" active="true" /> <p class="imgdescript-b">图1-1-2 共聚焦显微成像技术示意图</p> </div> <p class="content"> 共聚焦显微成像技术是利用放置在光源后和探测器前的共焦针孔形成点光源和点探测来成像的技术。光源发射的光经过照明针孔,在牙齿焦平面上的某点聚焦,其反射光线由原光路返回,在探测针孔内成像,非聚焦范围的反射光线无法在探测针孔内成像;通过逐层扫描,来获得牙齿不同位置的形貌数据,构建出牙的三维形态(图1-1-2)。共聚焦显微成像技术的优点是扫描精度较高、图像清晰,缺点是逐帧扫描的速度相对较慢。 </p> <p class="content"> 由于口腔扫描是一个相对动态的过程,如患者的不自主运动,会使得下颌的位置发生变化,手持口腔扫描枪的动作也无法做到绝对稳定,因此扫描对象和空间的整体稳定性不如牙颌模型扫描。这就对数据采集和软件算法的精度提出了更高的要求。在共聚焦显微成像技术的基础上,加入光路振荡系统,可以设置周期性变换焦平面的位置并聚焦成像,在动态连续扫描牙齿的过程中,高效快速获取三维成像,速度接近动态摄像水平,这种技术称为超快光学切片技术。 </p> </div> <p class="content"> 由于口腔扫描是一个相对动态的过程,如患者的不自主运动,会使得下颌的位置发生变化,手持口腔扫描枪的动作也无法做到绝对稳定,因此扫描对象和空间的整体稳定性不如牙颌模型扫描。这就对数据采集和软件算法的精度提出了更高的要求。在共聚焦显微成像技术的基础上,加入光路振荡系统,可以设置周期性变换焦平面的位置并聚焦成像,在动态连续扫描牙齿的过程中,高效快速获取三维成像,速度接近动态摄像水平,这种技术称为超快光学切片技术。 </p> <p class="poemtitle-l">(三)主动波阵面采样技术</p> <p class="poemtitle-l kTitle">(三)主动波阵面采样技术</p> <p class="content"> 被扫描牙面的反射光线经过旋转偏心孔装置的过滤,在成像平面内形成圆形轨迹的失焦图像,通过已知光路系统参数和测量得到的失焦图像半径计算出牙面被测点的空间坐标,从而获得数字化图像。这种技术的优势在于偏心孔装置的光线过滤作用能够有效防止牙面不同区域的图像重合,提高图像的空间分辨率。要想充分发挥优势,需要扫描前在牙面均匀喷涂粉末,以增加牙面的可识别的纹理参考点。 </p> <h3 class="thirdTitle">二、牙颌模型扫描技术原理</h3> <div class="bodyPic"><img src="../../assets/images/0024-02.jpg" style="width:30%" alt="" active="true" /></div> <bookVideo :videoInfo="getResourceInfo('D19')" :BookId="config.activeBook.bookId"></bookVideo> <p class="content"> 牙颌模型扫描技术,又称仓扫技术,主要通过间接法采集数据。该技术用数字化扫描设备扫描石膏模型或精细印模,从模型或印模上测得口腔软硬组织形态的信息,生成三维数据模型。其原理主要是接触式扫描技术和光学三角测量法。 </p> @@ -129,27 +157,30 @@ <p class="content"> 牙颌模型扫描技术相较于口内扫描在以下三个方便具有明显优势:①现有口内扫描系统都是基于光学扫描技术来实现的,仍未能解决牙釉质半透明、高反光等特点对扫描测量精度的影响问题,特别是针对种植等模型扫描精度要求高的情况。②针对缺少明显解剖特征的无牙颌、长牙弓的可摘局部义齿、5单位以上长桥修复体基牙的数字印模获取,存在着口内扫描难度大、空间有限、精度低的问题。③牙颌模型固定在扫描底座上,使模型与扫描仪的相对空间位置关系稳定,静态咬合关系数据的拼接精度较高。因此,需要采用牙颌模型扫描技术才能满足CAD/CAM模型扫描数据精度的需求。 </p> <p class="poemtitle-l">(一)接触式扫描技术</p> <p class="poemtitle-l kTitle">(一)接触式扫描技术</p> <p class="content"> 通过测量探头(传感器)接触工作模型表面,感应探头反馈接触点的位置信息,并采集与工作模型接触点的三维坐标值,从而获得工作模型三维数据信息。由于扫描过程需要测量探头接触被测物体整个表面,因此数据准确可靠、细节表现力好。但是存在着效率较低,不能扫描印模,只能扫描硬质模型表面,且探头较粗,存在探查盲区的缺点。这种技术目前已很少应用。 </p> <p class="poemtitle-l">(二)光学三角测量法</p> <p class="poemtitle-l kTitle">(二)光学三角测量法</p> <p class="content">这部分原理与口内扫描原理相同。</p> <p class="content"><span class="bold">1.激光扫描技术</span> 具有扫描精度高、细节表现力好的特点。点光扫描由于扫描效率和细节表现力欠佳,目前应用较少。线光扫描多采用蓝色激光或LED光作为光源,具有较高的扫描精度和扫描效率,多应用在口腔技工室牙颌模型扫描设备中。根据扫描仪机械部件运动轴的自由度,可将扫描设备分为三轴、四轴、五轴等,通过增加扫描轨迹,能够减少扫描盲区,提高扫描精度。 class="bold fontGreen">1.激光扫描技术</span> 具有扫描精度高、细节表现力好的特点。点光扫描由于扫描效率和细节表现力欠佳,目前应用较少。线光扫描多采用蓝色激光或LED光作为光源,具有较高的扫描精度和扫描效率,多应用在口腔技工室牙颌模型扫描设备中。根据扫描仪机械部件运动轴的自由度,可将扫描设备分为三轴、四轴、五轴等,通过增加扫描轨迹,能够减少扫描盲区,提高扫描精度。 </p> <p class="content"><span class="bold">2.结构光扫描技术</span> 又称光栅扫描技术,与云纹相移法、数字散斑相关法、摩尔云纹测量法的原理相似。采用蓝光或白光作为光源,用物理或数字手段形成光栅(或散斑图),将其投影到被测物表面,光栅(或散斑图)条纹(图1-1-3)会随着物体表面的起伏而发生扭曲变形,利用图像传感器拍摄光栅条纹、数字散斑图像的变形程度,通过算法获得被测物表面的三维形态数据。将多角度、重叠区域的数据进行拼接融合,生成三维数据模型。结构光扫描原理的技工室三维扫描仪如图1-1-4所示。 class="bold fontGreen">2.结构光扫描技术</span> 又称光栅扫描技术,与云纹相移法、数字散斑相关法、摩尔云纹测量法的原理相似。采用蓝光或白光作为光源,用物理或数字手段形成光栅(或散斑图),将其投影到被测物表面,光栅(或散斑图)条纹(图1-1-3)会随着物体表面的起伏而发生扭曲变形,利用图像传感器拍摄光栅条纹、数字散斑图像的变形程度,通过算法获得被测物表面的三维形态数据。将多角度、重叠区域的数据进行拼接融合,生成三维数据模型。结构光扫描原理的技工室三维扫描仪如图1-1-4所示。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0025-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript-l">图1-1-3 被测物表面的光栅条纹</p> <div class="img-box"> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0025-01.jpg" style="width:100%" alt="图1-1-3 被测物表面的光栅条纹" active="true" /> <p class="imgdescript-b">图1-1-3 被测物表面的光栅条纹</p> </div> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0025-02.jpg" style="width:55%" alt="图1-1-4 结构光扫描原理的技工室三维扫描仪" active="true" /> <p class="imgdescript-b">图1-1-4 结构光扫描原理的技工室三维扫描仪</p> </div> </div> <div class="qrbodyPic"> <img src="../../assets/images/0025-02.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript-l">图1-1-4 结构光扫描原理的技工室三维扫描仪</p> </div> </div> <div class="page-bottom-right">009</div> </div> @@ -164,23 +195,25 @@ </div> </div> <div class="bodystyle"> <p class="content"><span class="bold">3.立体摄影技术</span> 牙颌模型扫描所获得二维影像需要通过运算分析和处理,形成立体结构关系,从而建立出三维立体模型。 <p class="content"><span class="bold fontGreen">3.立体摄影技术</span> 牙颌模型扫描所获得二维影像需要通过运算分析和处理,形成立体结构关系,从而建立出三维立体模型。 </p> <p class="content"> 目前,口腔技工室三维扫描设备以线光和结构光技术为主,导出数据包括STL、PLY、OBJ、PTY四种格式。STL数据,不带材质贴图,可用单色定义,可用于测量和设计;PLY数据,可带材质贴图,可用于编辑测量和设计。该设备适用于口腔各类固定、活动义齿数字化设计及制作的需求。根据我国《牙颌模型三维扫描仪技术要求》国家标准,扫描仪的扫描精度要求为连续10次扫描输出数据与真值数据对比,其正确度、精密度与形态精度测量值均应小于或等于30μm,扫描仪的输出数据应至少包含标准STL文件。 </p> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">下颌运动轨迹描记仪</span></p> <p class="quotation"> 下颌运动轨迹描记仪是利用磁电转换反映下颌运动轨迹的一种仪器,主要由磁钢、磁敏传感器和显示装置三部分构成。当下颌运动时,粘固在下颌中切牙唇侧的磁钢产生微量的磁场变化信号,经磁敏传感器转化为电信号,送至示波器放大显示在屏幕上,这个下颌中切牙的运动情况即为下颌运动轨迹。下颌运动轨迹描记仪能够描记矢状面、冠状面、水平面三个维度的轨迹,也可连接肌电图仪器,同步记录相关肌肉的肌电图,但不能记录髁突的运动轨迹,深覆<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />患者使用受限。</p> <p class="titleQuot-1">【任务评价】</p> <p class="content">口腔扫描技术任务评价标准见表1-1-1。</p> <p class="imgtitle">表1-1-1 口腔扫描技术任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0026-03.jpg" style="width:80%" alt="" active="true" /></div> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">下颌运动轨迹描记仪</span></p> <p class="quotation"> 下颌运动轨迹描记仪是利用磁电转换反映下颌运动轨迹的一种仪器,主要由磁钢、磁敏传感器和显示装置三部分构成。当下颌运动时,粘固在下颌中切牙唇侧的磁钢产生微量的磁场变化信号,经磁敏传感器转化为电信号,送至示波器放大显示在屏幕上,这个下颌中切牙的运动情况即为下颌运动轨迹。下颌运动轨迹描记仪能够描记矢状面、冠状面、水平面三个维度的轨迹,也可连接肌电图仪器,同步记录相关肌肉的肌电图,但不能记录髁突的运动轨迹,深覆𬌗患者使用受限。 </p> </div> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">口腔扫描技术任务评价标准见表1-1-1。</p> <p class="imgtitle imgdescript-b">表1-1-1 口腔扫描技术任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0026-03.jpg" style="width:100%;margin-top: -12px;" alt="表1-1-1 口腔扫描技术任务评价标准" active="true" /></div> </div> <div class="page-bottom-left">010</div> </div> @@ -195,34 +228,43 @@ </div> <div class="bodystyle"> <h2 class="secondTitle">任务二 口腔扫描技术工艺流程</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">某患者要求进行11烤瓷冠修复,门诊医生在治疗过程中为患者进行了口内扫描,并将数据传给口腔技工室。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.口内扫描的具体操作步骤是怎样的?</p> <p class="content">2.口内扫描技术和牙颌模型扫描技术有什么区别,各有什么优势?</p> <p class="titleQuot-1">【任务分析】</p> <div class="bodyPic"><img src="../../assets/images/0027-01.jpg" style="width:30%" alt="" active="true" /></div> <div class="CaseStudy"> <div class="CaseStudy-title bold">任务案例</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">某患者要求进行11烤瓷冠修复,门诊医生在治疗过程中为患者进行了口内扫描,并将数据传给口腔技工室。</p> <p class="titleQuot-1">【问题】</p> <p class="content">1.口内扫描的具体操作步骤是怎样的?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.two" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.口内扫描技术和牙颌模型扫描技术有什么区别,各有什么优势?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.three" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 口腔扫描技术主要包括口内扫描技术和牙颌模型扫描技术两种。口内扫描技术是将口内扫描仪的光学扫描头伸入患者口内,直接对牙齿、黏膜等软硬组织表面形态进行扫描,实时重建扫描区域的三维数字模型,快速获取光学印模的方法。牙颌模型扫描技术是将口腔印模或口腔模型放置在台式扫描仪中,获取印模或模型数据,生成三维数字化模型的方法。本任务主要介绍这两种扫描技术的工艺流程。 </p> <h3 class="thirdTitle">一、口内扫描技术工艺流程</h3> <bookVideo :videoInfo="getResourceInfo('D19')" :BookId="config.activeBook.bookId"></bookVideo> <p class="poemtitle-l">(一)口内扫描仪的组成</p> <p class="content">口内扫描仪是由扫描枪、支架、扫描头、校准头(或标定仪)、软件、加密狗及电源适配线等构成的,使用时需要与电脑连接。</p> <p class="poemtitle-l">(二)扫描前的准备工作</p> <p class="content"><span class="bold">1.连接</span> 将扫描仪与电脑进行连接,确保电源和数据线已正确连接。</p> <p class="content"><span class="bold">2.检查程序和更新</span> 确定电脑上安装了相应的驱动程序和软件,查看是否有软件更新,检查扫描仪是否正常工作。</p> <p class="content"><span class="bold fontGreen">1.连接</span> 将扫描仪与电脑进行连接,确保电源和数据线已正确连接。</p> <p class="content"><span class="bold">3.校准</span> 对扫描仪做好日常维护,一般7天左右进行一次校准。校准时,将扫描头取下,连接校准头。根据系统提示,完成校准。通过校准,能够更准确地采集口腔软硬组织形态和患者的牙齿颜色,利于开展数字化比色和高清照片的拍摄(图1-2-1)。 class="bold fontGreen">2.检查程序和更新</span> 确定电脑上安装了相应的驱动程序和软件,查看是否有软件更新,检查扫描仪是否正常工作。</p> <p class="content"><span class="bold fontGreen">3.校准</span> 对扫描仪做好日常维护,一般7天左右进行一次校准。校准时,将扫描头取下,连接校准头。根据系统提示,完成校准。通过校准,能够更准确地采集口腔软硬组织形态和患者的牙齿颜色,利于开展数字化比色和高清照片的拍摄(图1-2-1)。 </p> </div> <div class="page-bottom-right">011</div> </div> </div> <!-- Page 18 (偶数页) --> <div class="page-box" page="18"> <div v-if="showPageList.indexOf(18) > -1"> @@ -232,34 +274,48 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0028-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l-b">图1-2-1 校准前后采集的图像对比</p> <p class="imgdescript">A.校准前;B.校准后。</p> <div class="imgBox-003 openImgBox"> <div class="swiper-container swiper-img"> <div class="swiper-wrapper"> <div class="swiper-slide"> <div class="imgBox" style="width: 100%; height: 100%"> <img src="../../assets/images/0028-01-01.png" alt="图1-2-1 校准前后采集的图像对比" /> </div> </div> <div class="swiper-slide"> <div class="imgBox" style="width: 100%; height: 100%"> <img src="../../assets/images/0028-01-02.png" alt="图1-2-1 校准前后采集的图像对比" /> </div> </div> </div> <div class="swiper-button-next"></div> <div class="swiper-button-prev"></div> </div> </div> <p class="content"><span class="bold">4.感染防控</span> 为患者准备一次性使用的扫描口镜或保护套。</p> <p class="content"><span class="bold">5.调节体位</span> 患者呈仰卧位,医生位于患者右后方,医生肘部与患者头部平行。扫描上颌牙时,患者<img <p class="imgdescript-b">图1-2-1 校准前后采集的图像对比</p> <p class="imgdescript-l">A.校准前;B.校准后。</p> <p class="content"><span class="bold fontGreen">4.感染防控</span> 为患者准备一次性使用的扫描口镜或保护套。</p> <p class="content"><span class="bold fontGreen">5.调节体位</span> 患者呈仰卧位,医生位于患者右后方,医生肘部与患者头部平行。扫描上颌牙时,患者<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />平面与地面成45°~90°;扫描下颌牙时,<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />平面尽量与地面平行。</p> <p class="content"><span class="bold">6.医患沟通</span> 向患者解释扫描操作过程,说明操作过程中的注意事项,嘱患者尽量保持静止不动。扫描前请患者漱口去除口内的残渣,放置吸唾管或棉卷,吸干扫描区域的唾液。 class="bold fontGreen">6.医患沟通</span> 向患者解释扫描操作过程,说明操作过程中的注意事项,嘱患者尽量保持静止不动。扫描前请患者漱口去除口内的残渣,放置吸唾管或棉卷,吸干扫描区域的唾液。 </p> <p class="poemtitle-l">(三)操作步骤</p> <p class="poemtitle-l kTitle">(三)操作步骤</p> <p class="content">口内扫描的临床操作主要包括三个步骤,即创建订单、获取数据、数据处理及上传(图1-2-2)。技工室接到数据后,在数据的基础上,加工出树脂牙颌模型和义齿。</p> <div class="qrbodyPic"> <img src="../../assets/images/0028-04.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图1-2-2 口内扫描临床操作步骤</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0028-04.jpg" style="width:100%" alt="图1-2-2 口内扫描临床操作步骤" active="true" /> <p class="imgdescript-b">图1-2-2 口内扫描临床操作步骤</p> </div> <p class="content"><span class="bold">1.创建订单</span> 建立新患者,填写患者基本信息,方便日后查找。创建新病例订单(图1-2-3)。根据患者的适应证,详细填写牙位及其修复的设计方案、修复材料等信息。 class="bold fontGreen">1.创建订单</span> 建立新患者,填写患者基本信息,方便日后查找。创建新病例订单(图1-2-3)。根据患者的适应证,详细填写牙位及其修复的设计方案、修复材料等信息。 </p> </div> <div class="page-bottom-left">012</div> </div> </div> <!-- Page 19 (奇数页) --> <div class="page-box" page="19"> <div v-if="showPageList.indexOf(19) > -1"> @@ -268,38 +324,39 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0029-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图1-2-3 新病例订单界面</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0029-01.jpg" style="width:75%" alt="图1-2-3 新病例订单界面" active="true" /> <p class="imgdescript-b">图1-2-3 新病例订单界面</p> </div> <p class="content"><span class="bold">2.获取数据</span> 按照下颌→上颌→咬合的顺序,依次完成口内扫描(图1-2-4)。</p> <p class="content">(1)<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面扫描:先定位,扫描头对准牙列末端磨牙的<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面;再按开始键,由一侧向另一侧扫描牙列<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面。扫描枪头始终朝向患者咽部。后牙区保持镜头平行于<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面,前牙区镜头可适当向舌侧倾斜,做小幅度唇舌侧翻转,以扫全切端信息,避免数据分层。</p> <p class="content">(2)舌面扫描(图1-2-5):扫描<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面后,将镜头朝向牙弓舌侧,使扫描枪尽量垂直于牙弓(或平行于牙体长轴),适当扭转镜头确保扫描到舌侧近远中邻面。</p> <div class="qrbodyPic"> <img src="../../assets/images/0029-07.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript-l">图1-2-4 <img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面扫描</p> <p class="content"><span class="bold fontGreen">2.获取数据</span> 按照下颌→上颌→咬合的顺序,依次完成口内扫描(图1-2-4)。</p> <p class="content"> (1)𬌗面扫描:先定位,扫描头对准牙列末端磨牙的𬌗面;再按开始键,由一侧向另一侧扫描牙列𬌗面。扫描枪头始终朝向患者咽部。后牙区保持镜头平行于𬌗面,前牙区镜头可适当向舌侧倾斜,做小幅度唇舌侧翻转,以扫全切端信息,避免数据分层。 </p> <div class="txtSurroundRight"> <div class="qrbodyPic "> <img class="openImgBox" src="../../assets/images/0029-07.jpg" style="width:250px" alt="𬌗面扫描" active="true" /> <p class="imgdescript-b fontGreen">图1-2-4 <span>𬌗</span>面扫描</p> </div> <p class="content">(2)舌面扫描(图1-2-5):扫描𬌗面后,将镜头朝向牙弓舌侧,使扫描枪尽量垂直于牙弓(或平行于牙体长轴),适当扭转镜头确保扫描到舌侧近远中邻面。 </p> <p class="content"> 扫描末端磨牙的远中面时,可嘱患者嘴巴稍微闭小一些,将扫描枪枪柄抬离𬌗面,使镜头尽量伸向末端磨牙的远中;在取景器内看到远中面信息后,保持1~2秒,平稳调整镜头角度,可做小幅度的颊舌侧转动,确保扫全远中面的信息。 </p> <p class="content">扫描上颌硬腭时,可以做S形曲线,避免遗漏。</p> </div> <p class="content">扫描末端磨牙的远中面时,可嘱患者嘴巴稍微闭小一些,将扫描枪枪柄抬离<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面,使镜头尽量伸向末端磨牙的远中;在取景器内看到远中面信息后,保持1~2秒,平稳调整镜头角度,可做小幅度的颊舌侧转动,确保扫全远中面的信息。</p> <p class="content">扫描上颌硬腭时,可以做S形曲线,避免遗漏。</p> <div class="qrbodyPic"> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0029-10.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-b">图1-2-5 舌面扫描顺序</p> <p class="imgdescript">A.下颌;B.上颌。</p> <p class="imgdescript-l">A.下颌;B.上颌。</p> </div> </div> <div class="page-bottom-right">013</div> </div> </div> <!-- Page 20 (偶数页) --> <div class="page-box" page="20"> <div v-if="showPageList.indexOf(20) > -1"> @@ -310,35 +367,37 @@ </div> <div class="bodystyle"> <p class="content"> (3)唇颊面扫描(图1-2-6):在扫描唇颊侧时,为了增加患者的舒适度,可分别从磨牙远中向中线进行扫描。扫描前牙时,镜头贴近牙面,牵拉唇侧软组织;扫描后牙时,镜头与<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面大约成45°,在取景器中能同时看到<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面和颊面,避免数据分层。扫描前牙唇面时,扫描枪可以横向握持,扫描头指向牙弓同侧。</p> (3)唇颊面扫描(图1-2-6):在扫描唇颊侧时,为了增加患者的舒适度,可分别从磨牙远中向中线进行扫描。扫描前牙时,镜头贴近牙面,牵拉唇侧软组织;扫描后牙时,镜头与𬌗面大约成45°,在取景器中能同时看到𬌗面和颊面,避免数据分层。扫描前牙唇面时,扫描枪可以横向握持,扫描头指向牙弓同侧。 </p> <p class="content"> (4)咬合扫描(图1-2-7):检查患者正中咬合,用口镜牵拉口角,将扫描头放在颊侧,使镜头处于上下颌中间,在取景器内能同时看到上下颌牙及其咬合状态。保持镜头贴近颊侧牙弓,从后牙向前牙波浪式移动,依次完成双侧咬合扫描。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0030-03.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图1-2-6 唇颊面扫描</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0030-04.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图1-2-7 咬合扫描</p> <div class="img-box"> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0030-03.jpg" style="width:90%" alt="图1-2-6 唇颊面扫描" active="true" /> <p class="imgdescript-b">图1-2-6 唇颊面扫描</p> </div> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0030-04.jpg" style="width:90%" alt="图1-2-7 咬合扫描" active="true" /> <p class="imgdescript-b">图1-2-7 咬合扫描</p> </div> </div> <p class="content">(5)检查及修整:扫描完成后,需要进行实时检查和整体检查,并进行修整。</p> <p class="content">1)实时检查:单颌扫描完成后,实时检查扫描图像,确保扫描图像的完整性。一般从前牙切端、颊舌侧近中和远中邻面、末端磨牙远中、<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面和牙龈组织五个方面进行检查。根据需要,可以重新扫描遗漏或模糊的区域。如果图像完整,可对扫描图像的边缘进行修整(图1-2-8)。</p> <div class="qrbodyPic"> <img src="../../assets/images/0030-06.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图1-2-8 实时检查及修整</p> <p class="content"> 1)实时检查:单颌扫描完成后,实时检查扫描图像,确保扫描图像的完整性。一般从前牙切端、颊舌侧近中和远中邻面、末端磨牙远中、𬌗面和牙龈组织五个方面进行检查。根据需要,可以重新扫描遗漏或模糊的区域。如果图像完整,可对扫描图像的边缘进行修整(图1-2-8)。 </p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0030-06.jpg" style="width:70%" alt="图1-2-8 实时检查及修整" active="true" /> <p class="imgdescript-b">图1-2-8 实时检查及修整</p> </div> </div> <div class="page-bottom-left">014</div> </div> </div> <!-- Page 21 (奇数页) --> <div class="page-box" page="21"> <div v-if="showPageList.indexOf(21) > -1"> @@ -352,22 +411,23 @@ (6)注意事项:①扫描前,需移开无影灯,避免其他外部光源影响扫描结果。②吹干或拭干预备体周围、邻牙、咬合面的唾液。③镜头始终贴近牙面,保持牙列始终位于镜头中间。④扫描枪连续平稳移动。⑤对于邻间隙、肩台、倒凹区等缝隙部位,应适当转动扫描头,使得镜面正对组织表面,保证光线能够到达。⑥注意牵拉唇部软组织。 </p> <p class="content"><span class="bold">3.数据处理及上传</span> 在软件中编辑和优化扫描数据,生成三维数字模型。由技师在椅旁为患者进行即刻设计制作,或将数据发送给技工室进行后续3D模型打印或CAD/CAM操作。将扫描数据保存在患者病例档案中,定期备份,以防丢失。 class="bold fontGreen">3.数据处理及上传</span> 在软件中编辑和优化扫描数据,生成三维数字模型。由技师在椅旁为患者进行即刻设计制作,或将数据发送给技工室进行后续3D模型打印或CAD/CAM操作。将扫描数据保存在患者病例档案中,定期备份,以防丢失。 </p> <h3 class="thirdTitle">二、牙颌模型扫描技术工艺流程</h3> <p class="content">牙颌模型扫描即对口腔石膏模型进行扫描,工艺比较成熟,扫描精度稳定可靠,是口腔技师必须掌握的一项基本技能。下面以单冠修复为例,介绍牙颌模型扫描技术工艺的基本流程。 </p> <p class="poemtitle-l">(一)牙颌模型扫描仪的组成</p> <p class="poemtitle-l kTitle">(一)牙颌模型扫描仪的组成</p> <p class="content">牙颌模型扫描仪主要由扫描盘、扫描摄像头、校准工具、软件、加密狗及电源适配线等构成,使用时需要与电脑连接。扫描精度不低于30μm,可开放式输出STL格式文件。 </p> <p class="poemtitle-l">(二)扫描前的准备工作</p> <p class="poemtitle-l kTitle">(二)扫描前的准备工作</p> <p class="content"><span class="bold">1.扫描仪校准</span> 扫描仪应定期校准,一般每周校准1~2次,如扫描仪长时间未使用或被移动,则应在使用前进行校准。首先确认扫描仪已连接,打开扫描软件,进入主界面,执行校准功能,根据提示放入校准块,扫描仪自动进行校准操作,校准结束后,系统提示校准完成。 class="bold fontGreen">1.扫描仪校准</span> 扫描仪应定期校准,一般每周校准1~2次,如扫描仪长时间未使用或被移动,则应在使用前进行校准。首先确认扫描仪已连接,打开扫描软件,进入主界面,执行校准功能,根据提示放入校准块,扫描仪自动进行校准操作,校准结束后,系统提示校准完成。 </p> <p class="content"><span class="bold">2.模型检查</span> 扫描检查模型是否完整,有无缺损、断裂情况,已分割预备体能否准确就位,对位咬合关系是否准确稳定。 <p class="content"><span class="bold fontGreen">2.模型检查</span> 扫描检查模型是否完整,有无缺损、断裂情况,已分割预备体能否准确就位,对位咬合关系是否准确稳定。 </p> <p class="poemtitle-l">(三)操作步骤</p> <p class="content"><span class="bold">1.创建订单</span></p> <p class="poemtitle-l kTitle">(三)操作步骤</p> <p class="content"><span class="bold fontGreen">1.创建订单</span></p> <p class="content">(1)基本信息:包括建立准确订单号、订单发出单位和医生、加工企业名称和操作技师、患者基本信息,便于以后查找。</p> <p class="content">(2)修复体信息(图1-2-9)</p> <p class="content">1)选择牙位:点击需要修复的牙位,根据相关选项选择修复类型后牙齿将被颜色标记,有文字标注。</p> @@ -378,7 +438,6 @@ <div class="page-bottom-right">015</div> </div> </div> <!-- Page 22 (偶数页) --> <div class="page-box" page="22"> <div v-if="showPageList.indexOf(22) > -1"> @@ -388,19 +447,20 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0032-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图1-2-9 修复体信息</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0032-01.jpg" style="width:75%" alt="图1-2-9 修复体信息" active="true" /> <p class="imgdescript-b">图1-2-9 修复体信息</p> </div> <p class="content">4)选择设计修复体类型:全冠、嵌体、贴面、蜡型、精密附件、咬合板、全口义齿、可摘义齿等。</p> <p class="content">5)选择修复体材料:蜡、钴铬、纯钛、氧化锆、玻璃陶瓷等(图1-2-10)。</p> <div class="qrbodyPic"> <img src="../../assets/images/0032-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图1-2-10 修复体类型及材料选择</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0032-02.jpg" style="width:75%" alt="图1-2-10 修复体类型及材料选择" active="true" /> <p class="imgdescript-b">图1-2-10 修复体类型及材料选择</p> </div> <p class="content">修复种类越多、材料越丰富,适应证的范围越大。可以根据具体情况参考旧义齿、模型或照片,增加美学设计。</p> <p class="content">(3)订单确认:订单填写完成后,点击“确认”保存。开始采集数据后,上述信息无法更改。</p> <p class="content"><span class="bold">2.获取数据</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">2.获取数据</span></p> <p class="content"> (1)固定模型:将上、下颌模型固定在扫描盘上。使牙弓按照扫描板的马蹄形摆放,确保模型固定后处于垂直视野下倒凹区域较少的位置。若扫描已分割模型,应注意确定代型完全就位,避免因抬高代型位置而造成修复体咬合低的情况。使扫描板底部的三个半球形凹槽与扫描盘上的三个半球形突起分别相对,扫描板即可被磁性吸附在扫描盘上,确保模型位置稳定。 </p> @@ -409,7 +469,6 @@ <div class="page-bottom-left">016</div> </div> </div> <!-- Page 23 (奇数页) --> <div class="page-box" page="23"> <div v-if="showPageList.indexOf(23) > -1"> @@ -428,12 +487,14 @@ <p class="content"> 3)扫描上颌模型(图1-2-13):对上颌模型进行初步扫描,在初步扫描图形上标记牙位,选定基牙、邻牙、对颌牙等作为精细扫描区域。如果需要参照对侧同名牙设计义齿,也可进行全牙列精细扫描。精细扫描结束,程序处理后,生成高精度的三维数字模型。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0033-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图1-2-11 扫描咬合关系</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0033-01.jpg" style="width:70%" alt="图1-2-11 扫描咬合关系" active="true" /> <p class="imgdescript-b imgTitleRange">图1-2-11 扫描咬合关系</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0033-02.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0033-02.jpg" style="width:70%" alt="图1-2-12 扫描下颌模型" active="true" /> <p class="imgdescript-b">图1-2-12 扫描下颌模型</p> <p class="imgdescript-l">A.初步扫描;B.补扫;C.修整模型图像。</p> </div> @@ -442,7 +503,6 @@ <div class="page-bottom-right">017</div> </div> </div> <!-- Page 24 (偶数页) --> <div class="page-box" page="24"> <div v-if="showPageList.indexOf(24) > -1"> @@ -452,21 +512,21 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0034-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图1-2-12(续图)</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0034-01.jpg" style="width:75%" alt="图1-2-12(续图)" active="true" /> <p class="imgdescript-b">图1-2-12(续图)</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0034-02.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0034-02.jpg" style="width:75%" alt="图1-2-13 扫描上颌模型" active="true" /> <p class="imgdescript-b">图1-2-13 扫描上颌模型</p> <p class="imgdescript">A.初步扫描;B.补扫。</p> <p class="imgdescript-l">A.初步扫描;B.补扫。</p> </div> </div> <div class="page-bottom-left">018</div> </div> </div> <!-- Page 25 (奇数页) --> <div class="page-box" page="25"> <div v-if="showPageList.indexOf(25) > -1"> @@ -475,16 +535,16 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0035-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图1-2-13(续图)</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0035-01.jpg" style="width:75%" alt="图1-2-13(续图)" active="true" /> <p class="imgdescript-b">图1-2-13(续图)</p> </div> <p class="content"> 4)咬合拼接(图1-2-14):根据咬合情况,使用软件对上、下颌数字模型进行咬合拼接。若咬合关系拼接不佳,可选择手动拼接,在上、下颌模型上根据对应点关系配准到咬合模型上,软件根据算法自动生成最优匹配位置;技师通过调整三维模型的方向,观察虚拟模型与实物模型的咬合关系是否一致,确认无误后进行下一步。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0035-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图1-2-14 咬合拼接</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0035-02.jpg" style="width:75%" alt="图1-2-14 咬合拼接" active="true" /> <p class="imgdescript-b">图1-2-14 咬合拼接</p> </div> <p class="content"> 5)代型扫描与匹配:如模型已经分割,则需根据软件提示进行代型扫描。将代型模型取下,固定在扫描盘中央,使代型唇颊面朝向扫描盘前端,多单位代型扫描时,可使用多功能扫描盘有序扫描。</p> @@ -495,7 +555,6 @@ <div class="page-bottom-right">019</div> </div> </div> <!-- Page 26 (偶数页) --> <div class="page-box" page="26"> <div v-if="showPageList.indexOf(26) > -1"> @@ -508,23 +567,21 @@ <p class="content"> (3)整体检查:上下颌牙列扫描完成后,转动数字模型,检查整体数据是否匹配,有无数据缺失或重叠,上、下颌咬合关系是否紧密,磨耗面是否吻合。如有问题,需要点击“上一步”,重新处理。</p> <p class="content"><span class="bold">3.数据处理及上传</span> 数据处理结束后,观察软件界面中间上方的扫描操作步骤,均显示为绿色时,扫描流程全部完成(图1-2-15)。保存模型,上传数据,准备进行CAD设计。 class="bold fontGreen">3.数据处理及上传</span> 数据处理结束后,观察软件界面中间上方的扫描操作步骤,均显示为绿色时,扫描流程全部完成(图1-2-15)。保存模型,上传数据,准备进行CAD设计。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0036-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图1-2-15 扫描完成</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0036-01.jpg" style="width:75%" alt="图1-2-15 扫描完成" active="true" /> <p class="imgdescript-b">图1-2-15 扫描完成</p> </div> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">椅旁操作系统</span></p> <p class="quotation">椅旁操作系统通常包括口内扫描单元和口腔修复专业软件两部分。口腔医生使用手持三维扫描设备,放入患者口腔中分别获取患者牙列<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面、颊侧、舌侧、近远中邻面,以及对颌牙列及周围组织的各个角度的图像。操作过程中医生可以在显示器上观察图像采集进度和清晰程度,直至采集到满意的图像,根据患者的咬合关系数据,通过计算机软件处理,形成三维数字模型。技师利用口腔修复软件在数字模型上设计出适合患者的修复体,医生向患者讲解修复体设计情况,使得医患沟通更直接、清晰明了。最后将修复体数据经数字化处理生成数控机床加工指令文件,控制CAM设备在临床上直接完成修复体的加工。患者一次就诊就可以戴上修复体。可以说,椅旁操作系统是一种真正意义上的全数字化系统。 </p> <p class="titleQuot-1">【任务评价】</p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">椅旁操作系统</span></p> <p class="quotation"> 椅旁操作系统通常包括口内扫描单元和口腔修复专业软件两部分。口腔医生使用手持三维扫描设备,放入患者口腔中分别获取患者牙列𬌗面、颊侧、舌侧、近远中邻面,以及对颌牙列及周围组织的各个角度的图像。操作过程中医生可以在显示器上观察图像采集进度和清晰程度,直至采集到满意的图像,根据患者的咬合关系数据,通过计算机软件处理,形成三维数字模型。技师利用口腔修复软件在数字模型上设计出适合患者的修复体,医生向患者讲解修复体设计情况,使得医患沟通更直接、清晰明了。最后将修复体数据经数字化处理生成数控机床加工指令文件,控制CAM设备在临床上直接完成修复体的加工。患者一次就诊就可以戴上修复体。可以说,椅旁操作系统是一种真正意义上的全数字化系统。 </p> </div> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">口内扫描技术工艺流程任务评价标准见表1-2-1。</p> </div> <div class="page-bottom-left">020</div> </div> @@ -538,27 +595,134 @@ </div> <div class="bodystyle"> <p class="imgtitle">表1-2-1 口内扫描技术工艺流程任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0037-01.jpg" style="width:80%" alt="" <p class="imgtitle imgdescript-b">表1-2-1 口内扫描技术工艺流程任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0037-01.jpg" style="width:100%" alt="" active="true" /></div> <div class="bodyPic"><img src="../../assets/images/0037-02.jpg" style="width:80%" alt="" active="true" /></div> <div class="unitSummary mb-20"> <div class="summary-content"> <div class="summary-content-box" @click="toUrl(getResourceInfo('B2'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span>项目一 考试知识点 口腔扫描技术原理</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B3'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目一 考试知识点 口腔扫描技术流程">项目一 考试知识点 口腔扫描技术流程</span> </div> </div> </div> <div class="unitSummary"> <div class="summary-content"> <div class="summary-content-box" @click="toUrl(getResourceInfo('C2'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span> 项目一 口腔扫描技术工艺流程 小结 </span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C3'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span>项目一 口内扫描技术的原理 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C4'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span>项目一 仓扫技术原理 小结</span> </div> </div> </div> <div class="knowledgeExpansion"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>题库</span> </div> <div class="knowledgeExpansion-box"> <img src="../../assets/images/tuoZhan.svg" alt="" /> <span @click="openQuestion(getResourceInfo('AA2'))">拓展练习</span> </div> </div> <p class="right-info">(徐佳音 刘小雷 罗峰)</p> </div> <div class="page-bottom-right">021</div> </div> </div> <preView :md5="p_md5" :pdfTitle="somePdfTitleValue" ref="pdfDialogRef"></preView> <dialogExaminations :cardList="interfaceQuestion" :questionIDList="questionIDList" :page="questionNum" :questionTitle="questionTitleMain" ref="dialogRef"> </dialogExaminations> </div> </template> <script> import preView from "@/components/pdfview/index.vue"; import bookVideo from "@/components/bookVideo/index.vue"; import dialogExaminations from "@/components/dialogExaminations/index.vue"; export default { name: "chapterTwo", props: { showPageList: { type: Array, }, getResourceInfo: { type: Function, // 明确指定它是一个函数 required: true, }, interfaceQuestion: { type: Array, required: true, default: () => [], }, }, components: { preView, bookVideo, dialogExaminations, }, data() { return { p_md5: "", somePdfTitleValue: "", // 题目相关 questionNum: 0, questionTitleMain: "", questionIDList: [], questionData: { one: "", two: "", three: "" } }; }, mounted() { this.getQuestionData() }, methods: { toUrl(val) { if (val != null) { this.p_md5 = val.md5; this.somePdfTitleValue = val.resourceName; this.$refs.pdfDialogRef.openDialog(); } }, openQuestion(val) { if (val != undefined) { this.questionNum = val.pagination; this.questionTitleMain = val.resourceName; this.questionIDList = val.ids; this.$nextTick(() => { this.$refs.dialogRef.openDialogQuestion(); }); } }, setQuestionData() { localStorage.setItem( "digitalDentalRestorationTechnology-book-chapter02-questionData", JSON.stringify(this.questionData) ); }, getQuestionData() { let questionData = localStorage.getItem("digitalDentalRestorationTechnology-book-chapter02-questionData"); if (questionData) { this.questionData = JSON.parse(questionData); } }, }, } </script> src/books/digitalDentalRestorationTechnology/view/components/chapter003.vue
@@ -4,31 +4,67 @@ <div class="page-box" page="28"> <div v-if="showPageList.indexOf(28) > -1"> <div class="bodystyle"> <h1 class="firstTitle-l mb-70 pt-70">项目二 固定修复设计工艺</h1> <div class="bodyPic"><img src="../../assets/images/0038-01.jpg" style="width:30%" alt="" active="true" /></div> <div class="bodyPic"><img src="../../assets/images/0017-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">素质目标</span></p> <p class="content">(1)树立知行合一的意识,愿意运用所学知识分析、解决工作中的问题。</p> <p class="content">(2)学会自主学习,持续关注行业技术发展,在新材料、新技术领域开拓义齿设计的新方法及新思路。</p> <p class="center">........................</p> <p class="center"><span class="bold">知识目标</span></p> <p class="content">(1)掌握:固定修复体数字化设计的基本知识,包括不同类型固定修复体的设计步骤。</p> <p class="content">(2)了解:各类固定修复体的参数设置。</p> <p class="center">........................</p> <p class="content"><span class="bold">能力目标</span></p> <p class="content">(1)能以思维导图的方式呈现全冠设计的流程。</p> <p class="content">(2)能根据制作需要,绘制嵌体、全冠、基底冠等修复体边缘线。</p> <p class="content">(3)能从牙冠库中选择适合患者的牙冠形态,并根据不同患者咬合特点做个性化修改。</p> <h1 class="firstTitle-l mb-70 pt-70 oneTitle">项目二 固定修复设计工艺</h1> <div class="learnGoal"> <img class="learnImg img-h" src="../../assets/images/learnGoal.png" alt="" /> <p class="center learngoalRange"><span class="bold">素质目标</span></p> <p class="content">(1)树立知行合一的意识,愿意运用所学知识分析、解决工作中的问题。</p> <p class="content">(2)学会自主学习,持续关注行业技术发展,在新材料、新技术领域开拓义齿设计的新方法及新思路。</p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"><span class="bold">知识目标</span></p> <p class="content">(1)掌握:固定修复体数字化设计的基本知识,包括不同类型固定修复体的设计步骤。</p> <p class="content">(2)了解:各类固定修复体的参数设置。</p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"><span class="bold">能力目标</span></p> <p class="content">(1)能以思维导图的方式呈现全冠设计的流程。</p> <p class="content">(2)能根据制作需要,绘制嵌体、全冠、基底冠等修复体边缘线。</p> <p class="content">(3)能从牙冠库中选择适合患者的牙冠形态,并根据不同患者咬合特点做个性化修改。</p> </div> <div class="knowledgeExpansion"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>教学课件</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A5'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目二 教学课件 全冠设计</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A6'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span> 项目二 教学课件 嵌体设计</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A7'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目二 教学课件 固定桥设计</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A8'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目二 教学课件 基底冠</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A9'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目二 教学课件 贴面设计</span> </div> </div> <h2 class="secondTitle">任务一 全冠设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">门诊送来设计订单,要求做26全瓷冠修复。模型数据已上传,进行26解剖冠设计。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.解剖冠设计的具体步骤是什么?</p> <p class="content">2.全瓷冠修复的间隙剂参数要求是什么?</p> <div class="CaseStudy"> <div class="CaseStudy-title">任务案例</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">门诊送来设计订单,要求做26全瓷冠修复。模型数据已上传,进行26解剖冠设计。</p> <p class="titleQuot-1">【问题】</p> <p class="content">1.解剖冠设计的具体步骤是什么?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.one" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.全瓷冠修复的间隙剂参数要求是什么?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.two" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> </div> <div class="page-bottom-left">022</div> </div> @@ -41,14 +77,14 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="titleQuot-1">【任务分析】</p> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 全冠设计根据其制作原理不同主要分为解剖冠设计和基底冠设计。解剖冠是基底部和咬合部用一种材质加工完成的一体全冠。本任务主要介绍解剖冠的设计步骤,基底冠的具体内容详见本项目任务四。</p> <h3 class="thirdTitle">一、创建订单</h3> <p class="content">Exocad软件的订单建立采用牙位图电子技工单形式,订单设置如下:26牙位选择解剖式牙冠,根据医生提供的设计单选择修复材料(图2-1-1)。</p> <div class="qrbodyPic"> <img src="../../assets/images/0039-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-1-1 订单界面</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0039-01.jpg" style="width:80%" alt="图2-1-1 订单界面" active="true" /> <p class="imgdescript-b">图2-1-1 订单界面</p> </div> <h3 class="thirdTitle">二、扫描或导入数据</h3> <p class="content">利用Exocad扫描软件完成工作模型和对颌模型的扫描。</p> @@ -67,7 +103,6 @@ <div class="page-bottom-right">023</div> </div> </div> <!-- Page 30 (偶数页) --> <div class="page-box" page="30"> <div v-if="showPageList.indexOf(30) > -1"> @@ -78,24 +113,24 @@ </div> <div class="bodystyle"> <p class="content">3.数字代型与实物边缘线完全吻合后,进一步精细检测颈缘线的准确性。</p> <div class="qrbodyPic"> <img src="../../assets/images/0040-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-1-2 颈缘线自动识别</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0040-01.jpg" style="width:75%" alt="图2-1-2 颈缘线自动识别" active="true" /> <p class="imgdescript-b">图2-1-2 颈缘线自动识别</p> </div> <h3 class="thirdTitle">四、确定就位道方向</h3> <p class="content"> 点击“下一步”进行就位道方向设定,软件会自动生成就位道方向,并自动计算和显示出倒凹区域。一般情况下,此就位道是软件计算出的倒凹面积最小的方向。把基牙摆放好,沿设定好的就位道方向从预备体验面向颈部观察,应能看到所有此前设定的边缘线范围,无倒凹(图2-1-3)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0040-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-1-3 检查就位道</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0040-02.jpg" style="width:75%" alt="图2-1-3 检查就位道" active="true" /> <p class="imgdescript-b">图2-1-3 检查就位道</p> </div> </div> <div class="page-bottom-left">024</div> </div> </div> <!-- Page 31 (奇数页) --> <div class="page-box" page="31"> <div v-if="showPageList.indexOf(31) > -1"> @@ -108,17 +143,17 @@ <p class="content"> 1.在软件中选择合适的间隙剂,这与传统工艺技术涂布间隙剂的目的一样,都是为义齿和预备体之间的粘接剂提供空隙,其决定着冠的松紧度,一般根据所需的加工材料、预备体的条件及加工方式选择相应的参数(图2-1-4)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0041-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-1-4 间隙剂参数设置</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0041-01.jpg" style="width:75%" alt="图2-1-4 间隙剂参数设置" active="true" /> <p class="imgdescript-b">图2-1-4 间隙剂参数设置</p> </div> <p class="content">(1)“粘接间隙”:冠边缘区域预留的间隙剂空间,调整此数值会影响冠就位的松紧度。</p> <p class="content">(2)“额外间隙”:冠内部除边缘区域外,整体预留的间隙剂空间,一般厚于边缘区域,调整此数值会影响冠整体的松紧度。</p> <p class="content">(3)“到边缘线的距离”:对应于“黏着剂间隙”设定值所影响的冠边缘区域宽度,一般设为1~2mm。</p> <p class="content">(4)“平滑距离”:冠边缘区域过渡到内部区域的距离,即由“黏着剂间隙”平滑过渡到“额外黏着剂间隙”的渐变区域范围。</p> <p class="content">2.对于较尖锐的前牙(如下颌前牙),可将间隙剂厚度适当增大;如对于<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />龈径短、聚合角度小的基牙,可将间隙剂厚度适当调小,确保制作的修复体密合就位。常用的参数值如下。</p> <p class="content"> 2.对于较尖锐的前牙(如下颌前牙),可将间隙剂厚度适当增大;如对于𬌗龈径短、聚合角度小的基牙,可将间隙剂厚度适当调小,确保制作的修复体密合就位。常用的参数值如下。</p> <p class="content">(1)氧化锆冠:“粘接间隙”0.02mm,“额外间隙”0.025mm。</p> <p class="content">(2)纯钛冠:“粘接间隙”0~0.02mm,“额外间隙”0.02~0.04mm。</p> <p class="content">(3)激光烧结冠:“粘接间隙”0~0.06mm,“额外间隙”0.02~0.09mm。</p> @@ -147,19 +182,19 @@ <div class="bodystyle"> <h3 class="thirdTitle">六、修复体形态设计</h3> <p class="content"><span class="bold">1.选择牙冠形态</span> 完成上述步骤后,软件会自动生成推荐的修复体形态,此时可根据患者的年龄、性别、同名牙形态、邻牙形态,在软件预装的牙冠形态库中选择适合患者的牙冠形态(图2-1-5)。 class="bold fontGreen">1.选择牙冠形态</span> 完成上述步骤后,软件会自动生成推荐的修复体形态,此时可根据患者的年龄、性别、同名牙形态、邻牙形态,在软件预装的牙冠形态库中选择适合患者的牙冠形态(图2-1-5)。 </p> <p class="content"><span class="bold">2.排列牙冠</span> 除镜像复制牙冠外,也可按照牙列的咬合、曲线、空间大小及医生的个性化要求,从软件的牙冠数据库中挑选适合的标准牙冠,软件可根据近远中邻接关系,自动将牙冠初步排列(图2-1-6)。 class="bold fontGreen">2.排列牙冠</span> 除镜像复制牙冠外,也可按照牙列的咬合、曲线、空间大小及医生的个性化要求,从软件的牙冠数据库中挑选适合的标准牙冠,软件可根据近远中邻接关系,自动将牙冠初步排列(图2-1-6)。 </p> <p class="content">应用工具栏提供的移动、旋转、缩放功能可校正牙冠摆位,使牙冠适合牙列空间。</p> <div class="qrbodyPic"> <img src="../../assets/images/0042-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-1-5 牙冠形态库</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0042-01.jpg" style="width:76%" alt="图2-1-5 牙冠形态库" active="true" /> <p class="imgdescript-b">图2-1-5 牙冠形态库</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0042-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-1-6 排列牙冠</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0042-02.jpg" style="width:76%" alt="图2-1-6 排列牙冠" active="true" /> <p class="imgdescript-b">图2-1-6 排列牙冠</p> </div> </div> @@ -176,11 +211,11 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">3.自由造型</span> 进入这一步时,调整完形态的牙冠会按预先设定的参数自动密合连接到颈缘线。Exocad软件具备丰富的形态调改工具,可进行整体和局部的变形、光顺及数字蜡刀的应用(图2-1-7)。 class="bold fontGreen">3.自由造型</span> 进入这一步时,调整完形态的牙冠会按预先设定的参数自动密合连接到颈缘线。Exocad软件具备丰富的形态调改工具,可进行整体和局部的变形、光顺及数字蜡刀的应用(图2-1-7)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0043-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-1-7 自由造型</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0043-01.jpg" style="width:75%" alt="图2-1-7 自由造型" active="true" /> <p class="imgdescript-b">图2-1-7 自由造型</p> </div> <p class="content"> (1)牵拉工具:选择软件“自由造型”工具栏下的“解剖形态”,根据牵拉范围分为“牙尖”“部分牙齿”“整个牙齿”“嵴”4个调整区域。可根据需要选择相关区域进行形态牵拉调整。</p> @@ -190,15 +225,10 @@ </p> <p class="content">(4)附件体:常用于种植体的开孔和精密附着体的插件等,可自行开发并从软件后台添加常用的附件模型,方便调用。</p> <h3 class="thirdTitle">七、修复体动态咬合设计</h3> <p class="content">正确的<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />关系可使修复体的长期性和功能性得到保证,否则可能在使用中出现各种问题。目前Exocad软件已集成多款数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架,并与实物<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架的参数相匹配。</p> <p class="content">1.临床上如果提供了面弓信息,技师可通过Exocad牙颌模型扫描仪,将颌位关系从实体牙架准确转移到软件的数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架中,设置好相关数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架参数后,即可对数字修复体进行咬合检查及调整。</p> <p class="content">2.如果没有临床的面弓信息,也可设定均值参数进行咬合检查。下面以均值为例,介绍Exocad软件数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架的使用。</p> <p class="content">正确的𬌗关系可使修复体的长期性和功能性得到保证,否则可能在使用中出现各种问题。目前Exocad软件已集成多款数字𬌗架,并与实物𬌗架的参数相匹配。</p> <p class="content"> 1.临床上如果提供了面弓信息,技师可通过Exocad牙颌模型扫描仪,将颌位关系从实体牙架准确转移到软件的数字𬌗架中,设置好相关数字𬌗架参数后,即可对数字修复体进行咬合检查及调整。</p> <p class="content">2.如果没有临床的面弓信息,也可设定均值参数进行咬合检查。下面以均值为例,介绍Exocad软件数字𬌗架的使用。</p> </div> <div class="page-bottom-right">027</div> @@ -214,54 +244,36 @@ </div> </div> <div class="bodystyle"> <p class="content">(1)打开工具,点击启动<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架。 <p class="content">(1)打开工具,点击启动𬌗架。 </p> <p class="content">(2)校准上下颌位置:模型导入数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架后,用鼠标移动、旋转模型,使上颌模型的中线、牙位尽量与数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架上对齐。也可自动校准上下颌位置。</p> <p class="content">(3)设置<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架参数:可将医生提供的患者个性化测量值输入相应品牌数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架的参数中,如Bennett L、Bennett R、左侧髁斜度和右侧髁斜度等,若没有提供测量值,也可将<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架设置为平均值使用(推荐前伸髁导30°,侧方髁导15°)。</p> <p class="content">(4)动态咬合分析:修复体的设计不但要保证静态咬合稳定状态,还要保证在咬合运动中无<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />干扰状态,因此还必须进一步检查修复体功能运动状态下的<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />接触关系(包括前伸、侧方、后退等功能运动),并对<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />干扰进行分析和去除。</p> <p class="content">下面介绍数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架技术的应用。 <p class="content">(2)校准上下颌位置:模型导入数字𬌗架后,用鼠标移动、旋转模型,使上颌模型的中线、牙位尽量与数字𬌗架上对齐。也可自动校准上下颌位置。</p> <p class="content">(3)设置𬌗架参数:可将医生提供的患者个性化测量值输入相应品牌数字𬌗架的参数中,如Bennett L、Bennett R、左侧髁斜度和右侧髁斜度等,若没有提供测量值,也可将𬌗架设置为平均值使用(推荐前伸髁导30°,侧方髁导15°)。</p> <p class="content"> (4)动态咬合分析:修复体的设计不但要保证静态咬合稳定状态,还要保证在咬合运动中无𬌗干扰状态,因此还必须进一步检查修复体功能运动状态下的𬌗接触关系(包括前伸、侧方、后退等功能运动),并对𬌗干扰进行分析和去除。 </p> <p class="content">在软件数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架功能中勾选碰撞设计和记录接触,并点击“咬合罗盘”按钮,在模拟下颌运动时,软件会针对不同运动方向的<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />干扰,使用不同颜色对接触进行着色。</p> <p class="content">下面介绍数字𬌗架技术的应用。 </p> <p class="content">在软件数字𬌗架功能中勾选碰撞设计和记录接触,并点击“咬合罗盘”按钮,在模拟下颌运动时,软件会针对不同运动方向的𬌗干扰,使用不同颜色对接触进行着色。</p> <p class="content">1)黑色:前伸运动,方向为矢状面与中线平行。</p> <p class="content">2)蓝色:侧方运动,与前伸运动约为90°夹角,由尖牙引导。</p> <p class="content">3)黄色:侧前伸运动。</p> <p class="content">4)绿色:趋中运动,即工作侧向中线运动。由外到内,工作侧做趋中运动的同时,非工作侧做侧方运动。</p> <p class="content">5)橙色:侧前趋中运动,在前伸运动和趋中运动之间。</p> <p class="content">6)红色:后退运动和迅速侧移。</p> <p class="content">根据<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />罗盘国际色码的颜色分区,可分析出此位置在哪个方向运动有<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />干扰,从而分析修复体咬合接触点的位置、大小、高低是否正确,确定咬合面尖、窝、沟、嵴的位置及方向。例如,从接触点向凹陷部位的运动较为容易,不易产生<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />干扰;而从<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />触点向突起部位运动,易产生<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />干扰,将易产生<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />干扰的位置降低,或是重新设计<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />触点,使运动过程顺畅无干扰,运动后可以使用蜡刀的减法功能去除干扰位置,也可以通过<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架运动后自动去除高点功能去除高点,从而完成修复体的动态咬合设计。</p> <h3 class="thirdTitle">八、设计邻接点位置</h3> <p class="content">良好的邻牙接触区可防止食物嵌塞,同时使邻牙互相支持、互相依靠,便于分散<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />力,有利于牙齿的稳固。若接触太紧,除会感到不适外,因牙齿受到过大推力,牙周组织易受损;若接触太松,容易引起食物嵌塞、龈乳头发炎,引起牙周疾病,且因<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />力传导不好,易造成牙齿移位。可参考以下要点设计邻接点。</p> <p class="content">1.前牙区邻接点的位置应偏向唇侧,越往远中位置逐渐偏向中1/3。</p> <p class="content">2.颊面观时邻接点的位置与纵<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />曲线一致。</p> <p class="content">3.切牙接触区近切缘处,切龈径大于唇舌径。</p> <p class="content">4.后牙接触区近<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />缘部,远中稍下,颊舌径大于<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />龈径。 <p class="content"> 根据𬌗罗盘国际色码的颜色分区,可分析出此位置在哪个方向运动有𬌗干扰,从而分析修复体咬合接触点的位置、大小、高低是否正确,确定咬合面尖、窝、沟、嵴的位置及方向。例如,从接触点向凹陷部位的运动较为容易,不易产生𬌗干扰;而从𬌗触点向突起部位运动,易产生𬌗干扰,将易产生𬌗干扰的位置降低,或是重新设计𬌗触点,使运动过程顺畅无干扰,运动后可以使用蜡刀的减法功能去除干扰位置,也可以通过𬌗架运动后自动去除高点功能去除高点,从而完成修复体的动态咬合设计。 </p> <p class="content">5.前磨牙、第一磨牙近中接触区在<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />1/3偏颊侧。</p> <h3 class="thirdTitle">八、设计邻接点位置</h3> <p class="content"> 良好的邻牙接触区可防止食物嵌塞,同时使邻牙互相支持、互相依靠,便于分散𬌗力,有利于牙齿的稳固。若接触太紧,除会感到不适外,因牙齿受到过大推力,牙周组织易受损;若接触太松,容易引起食物嵌塞、龈乳头发炎,引起牙周疾病,且因𬌗力传导不好,易造成牙齿移位。可参考以下要点设计邻接点。 </p> <p class="content">1.前牙区邻接点的位置应偏向唇侧,越往远中位置逐渐偏向中1/3。</p> <p class="content">2.颊面观时邻接点的位置与纵𬌗曲线一致。</p> <p class="content">3.切牙接触区近切缘处,切龈径大于唇舌径。</p> <p class="content">4.后牙接触区近𬌗缘部,远中稍下,颊舌径大于𬌗龈径。 </p> <p class="content">5.前磨牙、第一磨牙近中接触区在𬌗1/3偏颊侧。</p> </div> <div class="page-bottom-left">028</div> @@ -276,35 +288,32 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="content">6.第一磨牙远中、第二磨牙接触区多在<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />1/3的中1/3处。</p> <p class="content">6.第一磨牙远中、第二磨牙接触区多在𬌗1/3的中1/3处。</p> <h3 class="thirdTitle">九、保存设计</h3> <p class="content">1.对修复体进行最后的检查,用蜡刀的润滑工具将修复体表面进行光顺,对修复体外展隙、外形高点、<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />外展隙进行细微修整,确保修复体与天然牙<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />缘之间不形成台阶。</p> <p class="content">1.对修复体进行最后的检查,用蜡刀的润滑工具将修复体表面进行光顺,对修复体外展隙、外形高点、𬌗外展隙进行细微修整,确保修复体与天然牙𬌗缘之间不形成台阶。 </p> <p class="content">2.保存设计结果数据,完成CAD设计流程。</p> <p class="content">3.软件会在指定的文件夹内生成STL格式的修复体数据,需要将修复体数据复制并传送给CAM部门,以便进行后续义齿的生产加工。</p> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">数字</span><img class="s-pic" src="../../assets/images/0026_02.png" alt="" /><span class="bold">架</span></p> <p class="quotation">数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架是基于虚拟现实技术研发的一种软件工具。其以仿真的软件环境取代真实的机械装置,利用计算机的数据与图像处理能力在数字化三维空间中模拟下颌运动,记录并分析咬合关系,可以解决机械式半可调<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架模拟下颌运动的限制。其模拟机体的咬合关系的程度类似于全可调<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架的精度,但数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架的临床使用步骤更加简洁,可有效减少椅旁操作时间。</p> <p class="titleQuot-1">【任务评价】</p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="quotation center"> <span class="bold">数字</span>𬌗<span class="bold">架</span> </p> <p class="quotation"> 数字𬌗架是基于虚拟现实技术研发的一种软件工具。其以仿真的软件环境取代真实的机械装置,利用计算机的数据与图像处理能力在数字化三维空间中模拟下颌运动,记录并分析咬合关系,可以解决机械式半可调𬌗架模拟下颌运动的限制。其模拟机体的咬合关系的程度类似于全可调𬌗架的精度,但数字𬌗架的临床使用步骤更加简洁,可有效减少椅旁操作时间。 </p> </div> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">全冠设计任务评价标准见表2-1-1。</p> <p class="imgtitle">表2-1-1 全冠设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0045-09.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold">表2-1-1 全冠设计任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0045-09.jpg" style="width:100%;margin-bottom: -10px;" alt="表2-1-1 全冠设计任务评价标准" active="true" /></div> </div> <div class="page-bottom-right">029</div> </div> </div> <!-- Page 36 (偶数页) --> <div class="page-box" page="36"> <div v-if="showPageList.indexOf(36) > -1"> @@ -315,14 +324,25 @@ </div> <div class="bodystyle"> <h2 class="secondTitle">任务二 嵌体设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">接到某门诊送来的设计订单,要求对16进行嵌体修复。模型数据已上传,进行16嵌体设计。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.嵌体设计的具体步骤是怎样的?</p> <p class="content">2.该类修复体设计的要点有哪些?</p> <p class="titleQuot-1">【任务分析】</p> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">接到某门诊送来的设计订单,要求对16进行嵌体修复。模型数据已上传,进行16嵌体设计。</p> <p class="titleQuot-1">【问题】</p> <p class="content">1.嵌体设计的具体步骤是怎样的?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.three" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.该类修复体设计的要点有哪些?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.fore" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 嵌体(inlay)是用修复材料嵌入牙体内部,用以修复牙体缺损的部分。它能够恢复牙齿的功能和形态。高嵌体(onlay)是由嵌体演化而来,适合大面积牙齿咬合面缺损的情况。嵌体是为患者牙体缺损部分量身定做的修复体,通过粘接剂将其粘在缺损的牙齿上,在形态、硬度等方面与天然牙吻合度较高。设计者需对义齿形态具有准确把控能力,才能制作出合格的嵌体。 </p> @@ -339,7 +359,6 @@ <div class="page-bottom-left">030</div> </div> </div> <!-- Page 37 (奇数页) --> <div class="page-box" page="37"> <div v-if="showPageList.indexOf(37) > -1"> @@ -352,38 +371,35 @@ <p class="content">参考本项目任务一“五、间隙剂参数设置”。</p> <h3 class="thirdTitle">六、修复体形态设计</h3> <p class="content">根据患者的情况及口内余留牙的情况,选择适合此病例的牙齿形态,也可复制对侧同名牙形态。</p> <p class="content">1.使用“雕刻”“牵拉”等制作工具,根据邻牙、对颌牙及剩余牙体牙尖高度情况,对嵌体的大小、外形、<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />曲线进行调整(图2-2-1)。</p> <p class="content">2.在数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架上检查设计的嵌体有无<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />干扰。对有<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />干扰的区域进行分析和去除,以达到运行顺畅的目的。</p> <div class="bodyPic"><img src="../../assets/images/0047-05.jpg" style="width:30%" alt="" active="true" /></div> <p class="content">1.使用“雕刻”“牵拉”等制作工具,根据邻牙、对颌牙及剩余牙体牙尖高度情况,对嵌体的大小、外形、𬌗曲线进行调整(图2-2-1)。</p> <p class="content">2.在数字𬌗架上检查设计的嵌体有无𬌗干扰。对有𬌗干扰的区域进行分析和去除,以达到运行顺畅的目的。</p> <p class="content">3.根据15邻接的位置及大小对设计的16嵌体近中邻接进行调整,通常做成小面式或面式的接触形式。</p> <p class="content">保存设计结果,完成CAD设计流程。对设计好的数据进行输出。</p> <div class="qrbodyPic"> <img src="../../assets/images/0047-06.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-2-1 修复体形态调整</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0047-06.jpg" style="width:70%" alt="图2-2-1 修复体形态调整" active="true" /> <p class="imgdescript-b">图2-2-1 修复体形态调整</p> </div> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">高嵌体修复材料与粘接技术</span></p> <p class="quotation"> 高嵌体修复材料主要有4种,分别为树脂、全瓷、金属和二氧化锆。其中,金属具有很好的强度、打磨方便等优势,属于高嵌体材料的首选。但是金属也有缺陷,比如粘接性能较差,所以对其固位要求较高;为了增强其固定性能,会将健康牙齿打磨得更多。当前人们不断追求牙齿美观程度,但由于金属颜色与牙齿存在较大的区别,所以金属材料的美学性能较差。硅酸锂陶瓷是全瓷中常用到的硅基陶瓷。具有很好的粘接性能和较好的美观性能,近年来越来越多地应用于后牙牙体缺损治疗。然而硅酸锂陶瓷属于一种脆性材料,其弯曲强度比金属低很多,所以用作牙齿修复材料会存在一定的不足,有必要对其进行修复效果研究。 </p> <p class="quotation"> 高嵌体粘接前需进行表面处理,常见的处理方式分2种——机械法与化学法。但从处理方法的总体看,刻蚀、喷砂和使用硅烷偶联剂是比较常用的方法。但从临床效果看,酸蚀与硅烷偶联剂联合使用具有更加良好的表现。酸蚀所使用的主要试剂有氟化氢铵和氢氟酸溶液,其可以选择性地溶解高嵌体材料中的基质,暴露其基本结构,因此可以使得高嵌体材料的表面更加粗糙。粗化高嵌体材料后,使用硅烷偶联剂可以使得修复体与预备体的连接处形成氢键与共价键,提高了化学粘接力,故其粘接强度也得到提高。 </p> <p class="quotation"> 同时高嵌体材料的表面清洁程度也会影响粘接强度,高嵌体材料经过处理后,其表面粘接能力提升,但也更易被污染。在修复过程中,患者唾液中的蛋白质、酶、细菌及各种电解质等会改变高嵌体材料的表面自由能,且可能影响粘接剂的性能,因此在修复过程中如出现污染,则应使用正磷酸溶液清洗或再次使用氢氟酸进行酸蚀。经过处理之后,高嵌体材料需要通过粘接剂与预备体结合,经学界多次研究讨论后得出的结论表明,树脂类粘接剂表现效果远远优于其他类型的粘接剂,但不同的高嵌体材料适用不同的树脂类粘接剂。 </p> <bookVideo :videoInfo="getResourceInfo('D5')" :BookId="config.activeBook.bookId"></bookVideo> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">高嵌体修复材料与粘接技术</span></p> <p class="quotation"> 高嵌体修复材料主要有4种,分别为树脂、全瓷、金属和二氧化锆。其中,金属具有很好的强度、打磨方便等优势,属于高嵌体材料的首选。但是金属也有缺陷,比如粘接性能较差,所以对其固位要求较高;为了增强其固定性能,会将健康牙齿打磨得更多。当前人们不断追求牙齿美观程度,但由于金属颜色与牙齿存在较大的区别,所以金属材料的美学性能较差。硅酸锂陶瓷是全瓷中常用到的硅基陶瓷。具有很好的粘接性能和较好的美观性能,近年来越来越多地应用于后牙牙体缺损治疗。然而硅酸锂陶瓷属于一种脆性材料,其弯曲强度比金属低很多,所以用作牙齿修复材料会存在一定的不足,有必要对其进行修复效果研究。 </p> <p class="quotation"> 高嵌体粘接前需进行表面处理,常见的处理方式分2种——机械法与化学法。但从处理方法的总体看,刻蚀、喷砂和使用硅烷偶联剂是比较常用的方法。但从临床效果看,酸蚀与硅烷偶联剂联合使用具有更加良好的表现。酸蚀所使用的主要试剂有氟化氢铵和氢氟酸溶液,其可以选择性地溶解高嵌体材料中的基质,暴露其基本结构,因此可以使得高嵌体材料的表面更加粗糙。粗化高嵌体材料后,使用硅烷偶联剂可以使得修复体与预备体的连接处形成氢键与共价键,提高了化学粘接力,故其粘接强度也得到提高。 </p> <p class="quotation"> 同时高嵌体材料的表面清洁程度也会影响粘接强度,高嵌体材料经过处理后,其表面粘接能力提升,但也更易被污染。在修复过程中,患者唾液中的蛋白质、酶、细菌及各种电解质等会改变高嵌体材料的表面自由能,且可能影响粘接剂的性能,因此在修复过程中如出现污染,则应使用正磷酸溶液清洗或再次使用氢氟酸进行酸蚀。经过处理之后,高嵌体材料需要通过粘接剂与预备体结合,经学界多次研究讨论后得出的结论表明,树脂类粘接剂表现效果远远优于其他类型的粘接剂,但不同的高嵌体材料适用不同的树脂类粘接剂。 </p> </div> </div> <div class="page-bottom-right">031</div> </div> </div> <!-- Page 38 (偶数页) --> <div class="page-box" page="38"> <div v-if="showPageList.indexOf(38) > -1"> @@ -393,18 +409,15 @@ </div> </div> <div class="bodystyle"> <p class="titleQuot-1">【任务评价】</p> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">嵌体设计任务评价标准见表2-2-1。</p> <p class="imgtitle">表2-2-1 嵌体设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0048-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle imgdescript-b">表2-2-1 嵌体设计任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0048-01.jpg" style="width:100%" alt="表2-2-1 嵌体设计任务评价标准" active="true" /></div> </div> <div class="page-bottom-left">032</div> </div> </div> <!-- Page 39 (奇数页) --> <div class="page-box" page="39"> <div v-if="showPageList.indexOf(39) > -1"> @@ -414,40 +427,43 @@ </div> <div class="bodystyle"> <h2 class="secondTitle">任务三 固定桥设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">接到某门诊送来两个设计订单。</p> <p class="content">订单一:25缺失,要求以24、26为基牙,做解剖式固定桥。</p> <p class="content">订单二:11、21缺失,以13、12、22、23为基牙制作烤瓷基底桥。</p> <p class="content">模型数据已上传。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">解剖式固定桥设计和基底桥设计的具体操作区别是什么?</p> <p class="titleQuot-1">【任务分析】</p> <div class="bodyPic"><img src="../../assets/images/0049-01.jpg" style="width:30%" alt="" active="true" /></div> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">接到某门诊送来两个设计订单。</p> <p class="content">订单一:25缺失,要求以24、26为基牙,做解剖式固定桥。</p> <p class="content">订单二:11、21缺失,以13、12、22、23为基牙制作烤瓷基底桥。</p> <p class="content">模型数据已上传。</p> <p class="titleQuot-1">【问题】</p> <p class="content">解剖式固定桥设计和基底桥设计的具体操作区别是什么?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.five" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> <bookVideo :videoInfo="getResourceInfo('D3')" :BookId="config.activeBook.bookId"></bookVideo> <bookVideo :videoInfo="getResourceInfo('D4')" :BookId="config.activeBook.bookId"></bookVideo> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content">固定桥设计根据其制作原理不同主要分为解剖固定桥设计和基底桥设计。</p> <h3 class="thirdTitle">一、解剖固定桥设计</h3> <div class="bodyPic"><img src="../../assets/images/0049-02.jpg" style="width:30%" alt="" active="true" /></div> <p class="content">以3单位固定桥修复为例,介绍解剖桥设计工艺流程。</p> <p class="content"> 此病例25缺失,以24、26为基牙,设计解剖式固定桥。订单设置如下:25牙位选择牙冠桥体,24、26牙位选择解剖牙冠,根据医生提供的设计单选择材料,并用连接杆将24、25、26牙位连为一个整体。 </p> <p class="poemtitle-l">(一)扫描或导入数据</p> <p class="poemtitle-l kTitle">(一)扫描或导入数据</p> <p class="content">根据技工单信息建立订单,选择“导入扫描数据”,按照软件提示的顺序分别选择工作模型和对颌模型扫描数据。</p> <p class="poemtitle-l">(二)确定颈缘线</p> <p class="poemtitle-l kTitle">(二)确定颈缘线</p> <p class="content">分别修改多颗基牙的颈缘线形态,方法同单冠修复部分。</p> <p class="poemtitle-l">(三)确定共同就位道方向</p> <p class="poemtitle-l kTitle">(三)确定共同就位道方向</p> <p class="content"> 在设计软件中,按单冠设计方法依次定义24基牙和26基牙的边缘范围,软件可自动生成24—26的共同就位道方向,当生成的就位道不理想时可以校正。也可直接选择手绘。最后从咬合面俯视观察,以看到所有基牙边缘线上的绿点为佳(图2-3-1)。 </p> </div> <div class="page-bottom-right">033</div> </div> </div> <!-- Page 40 (偶数页) --> <div class="page-box" page="40"> <div v-if="showPageList.indexOf(40) > -1"> @@ -457,26 +473,27 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0050-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图2-3-1 检查共同就位道方向</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0050-01.jpg" style="width:60%" alt="图2-3-1 检查共同就位道方向" active="true" /> <p class="imgdescript-b">图2-3-1 检查共同就位道方向</p> </div> <p class="poemtitle-l">(四)间隙剂参数设置</p> <p class="poemtitle-l kTitle">(四)间隙剂参数设置</p> <p class="content">由于固定桥的就位较单冠困难,所以间隙剂厚度可比单冠的稍厚,其余参数设置参考全冠设计部分,需分别设置各基牙参数并进行边缘和倒凹的检查。</p> <p class="poemtitle-l">(五)修复体形态设计</p> <p class="poemtitle-l kTitle">(五)修复体形态设计</p> <p class="content"><span class="bold">1.牙冠整体排列设计</span> 间隙剂设置完成后,根据患者信息及邻牙状况,从牙齿形态库中选择解剖牙冠调入牙列相应部位。然后进行牙齿位置排列,通过移动、旋转、缩放将固定桥的多个牙冠调整,使其与邻牙、对颌牙的大小和位置协调(图2-3-2)。点击“下一步”即可生成牙冠,将修复体边缘与代型颈缘线密贴连接,进入自由造型阶段。 class="bold fontGreen">1.牙冠整体排列设计</span> 间隙剂设置完成后,根据患者信息及邻牙状况,从牙齿形态库中选择解剖牙冠调入牙列相应部位。然后进行牙齿位置排列,通过移动、旋转、缩放将固定桥的多个牙冠调整,使其与邻牙、对颌牙的大小和位置协调(图2-3-2)。点击“下一步”即可生成牙冠,将修复体边缘与代型颈缘线密贴连接,进入自由造型阶段。 </p> <p class="content"><span class="bold">2.牙体形态设计</span> 使用单冠设计部分介绍的“自由造型”,对牙冠形态进行调整。使用“解剖形态”调整修复体的大小、长短、突度,使其与邻牙、对颌牙协调,建立正常的覆<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />、覆盖关系,可调整静态咬合切除咬合高点,还可借助“虚拟蜡刀”光滑咬合面并获得满意的外形(图2-3-3)。</p> <p class="content"><span class="bold">3.桥体形态设计</span> 设计桥体时可先把牙冠底部拉到牙龈,切除底部数值为0,使桥体与牙槽嵴贴合,再使用虚拟蜡刀或牵拉工具进行形态修整,最后使桥体组织面与牙槽嵴轻微接触(图2-3-4)。 class="bold fontGreen">2.牙体形态设计</span> 使用单冠设计部分介绍的“自由造型”,对牙冠形态进行调整。使用“解剖形态”调整修复体的大小、长短、突度,使其与邻牙、对颌牙协调,建立正常的覆𬌗、覆盖关系,可调整静态咬合切除咬合高点,还可借助“虚拟蜡刀”光滑咬合面并获得满意的外形(图2-3-3)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0050-03.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图2-3-2 排列牙齿位置</p> <p class="content"><span class="bold fontGreen">3.桥体形态设计</span> 设计桥体时可先把牙冠底部拉到牙龈,切除底部数值为0,使桥体与牙槽嵴贴合,再使用虚拟蜡刀或牵拉工具进行形态修整,最后使桥体组织面与牙槽嵴轻微接触(图2-3-4)。 </p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0050-03.jpg" style="width:60%" alt="图2-3-2 排列牙齿位置" active="true" /> <p class="imgdescript-b">图2-3-2 排列牙齿位置</p> </div> </div> @@ -492,27 +509,27 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0051-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图2-3-3 切除咬合高点</p> <div class="qrbodyPic openImgBox" style="margin-bottom: 25px;"> <img src="../../assets/images/0051-01.jpg" style="width:60%" alt="图2-3-3 切除咬合高点" active="true" /> <p class="imgdescript-b">图2-3-3 切除咬合高点</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0051-02.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript-l">图2-3-4 桥体组织面与牙槽嵴轻微接触</p> <div class="qrbodyPic openImgBox" style="margin-bottom: 25px;"> <img src="../../assets/images/0051-02.jpg" style="width:60%" alt="图2-3-4 桥体组织面与牙槽嵴轻微接触" active="true" /> <p class="imgdescript-b">图2-3-4 桥体组织面与牙槽嵴轻微接触</p> </div> <p class="content"> 设计桥体时需要注意减径,一个桥体时减为制作修复体大小的90%,两个桥体时减为制作修复体大小的75%,三个桥体时减为制作修复体大小的50%。在实际工作中,桥体具体减径量也要注意遵照医生和患者的要求。 </p> <p class="content"><span class="bold">4.细节修整和外形光顺</span> 使用蜡刀工具对修复体的外形高点、窝沟、牙尖等细节结构进行精细修整,并进行整体光顺。 <p class="content"><span class="bold fontGreen">4.细节修整和外形光顺</span> 使用蜡刀工具对修复体的外形高点、窝沟、牙尖等细节结构进行精细修整,并进行整体光顺。 </p> <p class="poemtitle-l">(六)修复体咬合接触设计</p> <p class="poemtitle-l kTitle">(六)修复体咬合接触设计</p> <p class="content">三单位固定桥咬合接触设计步骤如下。</p> <p class="content">1.根据左侧上颌第一前磨牙、第二前磨牙、第一磨牙对颌的主动中位设定咬合接触点,直至牙尖交错位时与对颌牙发生接触达到A、B、C三点接触。</p> <p class="content">2.在数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架中检查运动状态下的<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />关系。</p> <p class="content">3.检查最终的咬合情况,达到牙尖交错<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />时无早接触,前伸<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />、侧方<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />时无干扰,具体步骤如下。</p> <p class="content">2.在数字𬌗架中检查运动状态下的𬌗关系。</p> <p class="content">3.检查最终的咬合情况,达到牙尖交错𬌗时无早接触,前伸𬌗、侧方𬌗时无干扰,具体步骤如下。</p> <p class="content">(1)观察上、下颌模型的对位关系和咬合类型。</p> </div> @@ -529,32 +546,26 @@ </div> </div> <div class="bodystyle"> <p class="content">(2)利用软件中的修改工具,调整牙冠的覆<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />、覆盖关系。</p> <p class="content">(3)将数字模型放置矢状面观察,根据前后牙及对颌模型,将生成牙冠的纵<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />曲线调改至正常。</p> <p class="content">(4)将数字模型放置冠状面观察,观察横<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />曲线的位置是否正确,并进行修改。</p> <p class="content">(5)从<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面观察数字模型,观察修复体与邻牙是否协调、与对侧同名牙大小、形态是否一致,观察横<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />曲线与纵<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />曲线,并进行修改。</p> <p class="content">(2)利用软件中的修改工具,调整牙冠的覆𬌗、覆盖关系。</p> <p class="content">(3)将数字模型放置矢状面观察,根据前后牙及对颌模型,将生成牙冠的纵𬌗曲线调改至正常。</p> <p class="content">(4)将数字模型放置冠状面观察,观察横𬌗曲线的位置是否正确,并进行修改。</p> <p class="content">(5)从𬌗面观察数字模型,观察修复体与邻牙是否协调、与对侧同名牙大小、形态是否一致,观察横𬌗曲线与纵𬌗曲线,并进行修改。</p> <p class="content">4.咬合点位置及数量的设计,参考单冠设计部分。</p> <p class="poemtitle-l">(七)邻接区位置设计</p> <p class="content">参考单冠设计部分。24的邻接区设计在<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />1/3偏颊侧,26的邻接区设计在<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />1/3的中1/3处(图2-3-5)。</p> <div class="qrbodyPic"> <img src="../../assets/images/0052-09.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图2-3-5 邻接区位置设计</p> <p class="poemtitle-l kTitle">(七)邻接区位置设计</p> <p class="content">参考单冠设计部分。24的邻接区设计在𬌗1/3偏颊侧,26的邻接区设计在𬌗1/3的中1/3处(图2-3-5)。</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0052-09.jpg" style="width:50%" alt="图2-3-5 邻接区位置设计" active="true" /> <p class="imgdescript-b">图2-3-5 邻接区位置设计</p> </div> <p class="poemtitle-l">(八)连接体设计</p> <p class="poemtitle-l kTitle">(八)连接体设计</p> <p class="content"> 点击“下一步”,开始设计连接体。选择连接体面积大小。通过调整牙冠邻面上的辅助和中心点,可调整连接体的位置、形态及面积大小(图2-3-6)。应根据实际情况适当增加默认连接体的截面积,以保证固定桥的结构强度。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0052-10.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图2-3-6 连接体形态调整</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0052-10.jpg" style="width:50%" alt="图2-3-6 连接体形态调整" active="true" /> <p class="imgdescript-b">图2-3-6 连接体形态调整</p> </div> </div> @@ -570,28 +581,27 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="poemtitle-l">(九)组件融合</p> <p class="poemtitle-l kTitle">(九)组件融合</p> <p class="content">连接体设计完成后,点击“下一步”将前序步骤设计的所有组件融为一体,完成解剖桥的设计。</p> <h3 class="thirdTitle">二、基底桥设计</h3> <p class="content">回切法基底桥设计即先根据邻牙及对颌牙信息恢复预期修复体,在此基础上设定数值,回切出均匀的瓷层空间,从而提高烤瓷牙的弧度。下面介绍Exocad软件回切法基底桥设计。 </p> <p class="content">病例设定为15缺失,14、16为桥基牙,金瓷桥修复。选择牙位14、16,选择“回切全冠”,15选择“回切缺失牙”,材料选择非贵金属,确定后点击“设计”进入主界面。 </p> <p class="poemtitle-l">(一)扫描或导入数据</p> <p class="poemtitle-l kTitle">(一)扫描或导入数据</p> <p class="content">扫描方法参考牙颌模型扫描工艺部分,注意事项同解剖桥部分,扫描完成具有咬合关系的上、下颌数字模型。</p> <p class="poemtitle-l">(二)确定颈缘线</p> <p class="poemtitle-l kTitle">(二)确定颈缘线</p> <p class="content">方法同解剖桥部分。使用边缘线检测器绘制基牙边缘范围,并修改各基牙边缘线形态,方法同单冠修复。</p> <p class="poemtitle-l">(三)确定共同就位道方向</p> <p class="poemtitle-l kTitle">(三)确定共同就位道方向</p> <p class="content"> 参考解剖桥设计部分的方法,确定所有基牙的共同就位道方向。当桥的跨度较长且同时覆盖前牙和后牙时,需照顾前牙的美观性,将倒凹向后牙调整。软件自动计算的就位道方向通常是整体(所有基牙)倒凹最优的角度,上述个性化的调整可采用从视图观察角度设定就位道的方法。 </p> <p class="poemtitle-l">(四)间隙剂参数设置</p> <p class="poemtitle-l kTitle">(四)间隙剂参数设置</p> <p class="content"> Exocad软件在“底部参数”设置间隙剂厚度、冠边缘、倒凹处理与刀具补偿的参数。金属基底粘接间隙可设定为0.02mm,金属基底冠边缘厚度可设置为0.1~0.3mm。</p> <p class="poemtitle-l">(五)预期修复体形态设计</p> <p class="poemtitle-l kTitle">(五)预期修复体形态设计</p> <p class="content">1.根据余留牙和患者脸型等信息,从牙齿数据库的上颌前牙组合库中选择适合的牙冠形态,用于设计预期的牙冠修复体。</p> <p class="content">2.排列牙齿位置,通过移动、旋转、缩放调整固定桥的多个牙冠,调整牙齿位置、大小和倾斜度,建立正确的覆<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />、覆盖关系。</p> <p class="content">2.排列牙齿位置,通过移动、旋转、缩放调整固定桥的多个牙冠,调整牙齿位置、大小和倾斜度,建立正确的覆𬌗、覆盖关系。</p> <p class="content"> 3.进行桥体形态设计。设计桥体时先可把牙冠底部拉到牙龈,切除底部数值为0,使桥体与牙槽嵴贴合,再使用虚拟蜡刀或牵拉工具进行形态修整,最后使桥体组织面与牙槽嵴轻微接触。</p> <p class="content">4.通过“智能执行参数”调整预期修复体的厚度、咬合和邻接,方法同全冠设计部分。</p> @@ -611,24 +621,21 @@ </div> </div> <div class="bodystyle"> <p class="poemtitle-l">(六)预期修复体<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />接触设计</p> <p class="content">根据临床医生提供的面弓相关参数,可使用数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架功能模拟下颌运动,精细调整预期修复体<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面形态,方法参考全冠、解剖桥部分,不同之处在于前牙要恢复患者的前牙导向功能。通过设定数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架上的切导斜度,模拟前伸和侧方运动,先去掉<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />干扰部分,然后在12、11、21、22的近远中边缘嵴上建立前伸导向,在13、23上建立侧方导向。</p> <p class="poemtitle-l">(七)预期修复体回切</p> <p class="content"><span class="bold">1.设置回切参数</span> 牙冠的回切功能包括以下参数选项。</p> <p class="poemtitle-l kTitle">(六)预期修复体𬌗接触设计</p> <p class="content"> 根据临床医生提供的面弓相关参数,可使用数字𬌗架功能模拟下颌运动,精细调整预期修复体𬌗面形态,方法参考全冠、解剖桥部分,不同之处在于前牙要恢复患者的前牙导向功能。通过设定数字𬌗架上的切导斜度,模拟前伸和侧方运动,先去掉𬌗干扰部分,然后在12、11、21、22的近远中边缘嵴上建立前伸导向,在13、23上建立侧方导向。 </p> <p class="poemtitle-l kTitle">(七)预期修复体回切</p> <p class="content"><span class="bold fontGreen titleLeftmove">1.设置回切参数</span> 牙冠的回切功能包括以下参数选项。</p> <p class="content">(1)回切大小:指预期修复体形态要回切掉的瓷层空间。</p> <p class="content">(2)最小厚度:保证基底冠结构强度的最薄厚度,即使回切量不够,厚度也不允许低于此值。最小厚度一般设置为0.4mm。</p> <p class="content"><span class="bold">2.设置回切范围</span> 金属边、金属咬合面、金属舌背等设计需要外露金属。可手动定义回切范围:勾画缺失牙舌侧金属带,宽度与弧度尽量保持一致。修整完成后点击“应用”,软件对修复体外形进行均匀回切。 class="bold fontGreen titleLeftmove">2.设置回切范围</span> 金属边、金属咬合面、金属舌背等设计需要外露金属。可手动定义回切范围:勾画缺失牙舌侧金属带,宽度与弧度尽量保持一致。修整完成后点击“应用”,软件对修复体外形进行均匀回切。 </p> <p class="content"><span class="bold">3.模型修整</span> 冠表面修整、回切完成后,基底冠表面可能会有凹凸不平之处,用“自由造型”中的数字蜡刀光顺回切冠表面,去除过锐的地方。</p> <p class="poemtitle-l">(八)连接体设计</p> class="bold fontGreen titleLeftmove">3.模型修整</span> 冠表面修整、回切完成后,基底冠表面可能会有凹凸不平之处,用“自由造型”中的数字蜡刀光顺回切冠表面,去除过锐的地方。 </p> <p class="poemtitle-l kTitle">(八)连接体设计</p> <p class="content"> 1.根据固定修复连接体的设计原则,调整连接体的位置、形态和横截面积。连接体过大或位置不当,会导致烤瓷牙外展隙打不开,牙齿缺乏立体感,影响美观;反之,连接体过小,则会影响整体连桥强度。正常情况下,连接体应位于牙齿的邻面接触区,但考虑到前牙的美观,往往只能牺牲舌外展隙,以保证其强度。 </p> @@ -637,17 +644,18 @@ <p class="content">(2)金属烤瓷后牙冠桥:6~9mm²。</p> <p class="content">(3)氧化锆前牙冠桥:8~10mm²。</p> <p class="content">(4)氧化锆后牙冠桥:12~14mm²。</p> <p class="poemtitle-l">(九)组件融合</p> <p class="poemtitle-l kTitle">(九)组件融合</p> <p class="content">连接体设置完成后,软件最后一步是将前序步骤设计的所有组件融为一体,用虚拟蜡刀光顺融合痕迹,完成设计。</p> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">锥形束CT</span></p> <p class="quotation">锥形束CT(cone beam CT,CBCT)是投照计算机重组断层影像设备,其工作原理是利用锥形X线束和面积探测器对受检者做360°旋转的数字式投照,通过测量被扫描组织结构的容积,获取所需数据,即可重建出三个维度上的断层影像。锥形束CT可显示平行牙弓、垂直牙弓和垂直身体长轴三个方向上的断层影像,还可以根据临床需要显示曝光范围内任意部位和方向的断层影像。 </p> <p class="quotation"> 锥形束CT具有下列优点:①体素小,空间分辨率高,图像质量好;②显著提高X线的利用率,辐射剂量相对较小;③有很高的各向同性空间分辨力。锥形束CT广泛用于检查口腔颌面部硬组织,如牙种植术、颞下颌关节疾病、根尖周病变、牙周疾病、埋伏牙等,曝光范围较大的机型可用于颌骨肿瘤、创伤、畸形等疾病的诊断。 </p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">锥形束CT</span></p> <p class="quotation">锥形束CT(cone beam CT,CBCT)是投照计算机重组断层影像设备,其工作原理是利用锥形X线束和面积探测器对受检者做360°旋转的数字式投照,通过测量被扫描组织结构的容积,获取所需数据,即可重建出三个维度上的断层影像。锥形束CT可显示平行牙弓、垂直牙弓和垂直身体长轴三个方向上的断层影像,还可以根据临床需要显示曝光范围内任意部位和方向的断层影像。 </p> <p class="quotation"> 锥形束CT具有下列优点:①体素小,空间分辨率高,图像质量好;②显著提高X线的利用率,辐射剂量相对较小;③有很高的各向同性空间分辨力。锥形束CT广泛用于检查口腔颌面部硬组织,如牙种植术、颞下颌关节疾病、根尖周病变、牙周疾病、埋伏牙等,曝光范围较大的机型可用于颌骨肿瘤、创伤、畸形等疾病的诊断。 </p> </div> </div> <div class="page-bottom-left">038</div> @@ -662,22 +670,40 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="titleQuot-1">【任务评价】</p> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">固定桥设计任务评价标准见表2-3-1。</p> <p class="imgtitle">表2-3-1 固定桥设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0055-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold fontGreen">表2-3-1 固定桥设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0055-01.jpg" style="width:100%;margin-top: -12px;" alt="表2-3-1 固定桥设计任务评价标准" active="true" /></div> <h2 class="secondTitle">任务四 基底冠设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">接到某门诊送来的设计订单,要求做26烤瓷冠修复,模型数据已上传。先设计26的基底冠,完成后进入下一环节。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.基底冠设计的具体步骤是怎样的?</p> <p class="content">2.各类金属基底冠的厚度要求是多少?</p> <p class="content">3.回切法和均匀增厚法哪个操作更简单?</p> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">接到某门诊送来的设计订单,要求做26烤瓷冠修复,模型数据已上传。先设计26的基底冠,完成后进入下一环节。</p> <p class="titleQuot-1">【问题】</p> <p class="content">1.基底冠设计的具体步骤是怎样的?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.six" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.各类金属基底冠的厚度要求是多少?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.seven" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">3.回切法和均匀增厚法哪个操作更简单?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.eight" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> </div> <div class="page-bottom-right">039</div> </div> </div> @@ -691,7 +717,7 @@ </div> </div> <div class="bodystyle"> <p class="titleQuot-1">【任务分析】</p> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 基底冠的有效强度和预留瓷层有效厚度是保证烤瓷冠修复强度的前提。为了保证修复效果,基底冠设计时需要预留出薄厚均匀的瓷层空间并恢复基本支撑形态。基底冠的设计可分为均匀增厚法和回切法两种,下面分别介绍。 </p> @@ -700,22 +726,23 @@ <p class="content"> 首先进行扫描或导入数据、模型处理、确定就位道方向、确定边缘线、确定间隙剂厚度,同全冠设计。下面详细介绍基底冠设计的各参数设置。①壁厚:基底冠各面的厚度,一般根据修复体材料和加工设备的要求,设置为可接受的最薄厚度。②壁高度:由基底冠边缘厚度平滑过渡到轴壁厚度(即壁厚)的距离。③边缘线补偿基底冠边缘厚度。④补偿角度:延伸补偿斜面与水平面的夹角,主要用于调整金属边向外敞开的角度。⑤延伸补偿:基底冠边缘外伸的宽度。 </p> <p class="content"><span class="bold">1.冠厚(壁厚)</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">1.冠厚(壁厚)</span></p> <p class="content">(1)金属烤瓷基底冠厚度不低于0.4mm。</p> <p class="content">(2)氧化锆烤瓷基底冠厚度不低于0.5mm。</p> <p class="content"><span class="bold">2.边缘厚度(延伸补偿)</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">2.边缘厚度(延伸补偿)</span></p> <p class="content">(1)金属解剖全冠和金属烤瓷基底冠边缘厚度建议为0.1~0.3mm。</p> <p class="content">(2)氧化锆烤瓷基底冠边缘厚度建议为0.2~0.3mm。</p> <p class="content"><span class="bold">3.金属边</span> 设计金属烤瓷基底冠时,一般要在舌侧制作金属边来增加强度。勾选“舌带”选项框内的“应用”选项,可设定金属边结构参数。</p> class="bold fontGreen titleLeftmove">3.金属边</span> 设计金属烤瓷基底冠时,一般要在舌侧制作金属边来增加强度。勾选“舌带”选项框内的“应用”选项,可设定金属边结构参数。 </p> <p class="content"> (1)起始角度和终点角度:控制金属边的起止点位置,即预备体颈缘线上出现的蓝色和红色控制点,滚动鼠标滚轮可调整控制点位置。舌侧金属边可延伸至邻面,达近远中边缘嵴咬合接触点的正下方,以预防边缘嵴力过大导致边缘崩瓷(图2-4-1)。 </p> <p class="content">(2)补偿角度:此参数可调改金属边敞开的角度,需要参考邻牙颊舌侧外形高点曲线,不要形成悬突,此数值一般设置为65°~80°(图2-4-2)。</p> <p class="content">(3)补偿:此参数为金属边的高度。一般舌侧金属边高度为0.5~1.0mm,做360°金属边时,唇颊侧高度应适当缩窄以免影响美观。</p> <p class="content"> (4)在有保护的表面进行雕刻:预备体肩台高低起伏、宽窄不均,金属边可能出现扉边,这时可在雕刻界面勾选此项,并用蜡刀具进行手动调整。后牙近远中邻面间距超过1.5mm时,金属烤瓷基底冠邻面金属边应有承托<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />力的结构。</p> (4)在有保护的表面进行雕刻:预备体肩台高低起伏、宽窄不均,金属边可能出现扉边,这时可在雕刻界面勾选此项,并用蜡刀具进行手动调整。后牙近远中邻面间距超过1.5mm时,金属烤瓷基底冠邻面金属边应有承托𬌗力的结构。 </p> </div> <div class="page-bottom-left">040</div> @@ -730,19 +757,21 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0057-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-4-1 调整金属边起止点</p> <div class="qrbodyPic openImgBox" style="margin-bottom: 30px;"> <img src="../../assets/images/0057-02.jpg" style="width:70%" alt="图2-4-1 调整金属边起止点" active="true" /> <p class="imgdescript-b">图2-4-1 调整金属边起止点</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0057-03.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图2-4-2 均匀增厚基底冠剖切面观察舌侧边缘</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0057-03.jpg" style="width:70%" alt="图2-4-2 均匀增厚基底冠剖切面观察舌侧边缘" active="true" /> <p class="imgdescript-b">图2-4-2 均匀增厚基底冠剖切面观察舌侧边缘</p> </div> <p class="content"><span class="bold">4.预留修复体瓷层空间</span> 各种修复类型推荐的预留瓷层空间如下。①纯钛烤瓷:0.8~1.2mm。②钴铬烤瓷:1.5~2.0mm。③氧化锆烤瓷:1.0~2.0mm。 class="bold fontGreen titleLeftmove">4.预留修复体瓷层空间</span> 各种修复类型推荐的预留瓷层空间如下。①纯钛烤瓷:0.8~1.2mm。②钴铬烤瓷:1.5~2.0mm。③氧化锆烤瓷:1.0~2.0mm。 </p> <p class="content">观察纵<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />曲线及对颌牙磨耗痕迹等信息,分析最终修复体形态,判断预备体各部位的备牙量是否能满足修复空间的需要(图2-4-3)。若修复空间较大,可使用“雕刻工具包”中的牵拉和加减具,调整基底冠形态,留出均匀瓷层空间。若修复空间不足,可与医生沟通进一步的设计方案,如制作金属咬合预备等。使用此方法,要求设计者有较丰富的工作经验和对义齿形态的准确把控能力,才能制作出合格的基底冠。 <p class="content"> 观察纵𬌗曲线及对颌牙磨耗痕迹等信息,分析最终修复体形态,判断预备体各部位的备牙量是否能满足修复空间的需要(图2-4-3)。若修复空间较大,可使用“雕刻工具包”中的牵拉和加减具,调整基底冠形态,留出均匀瓷层空间。若修复空间不足,可与医生沟通进一步的设计方案,如制作金属咬合预备等。使用此方法,要求设计者有较丰富的工作经验和对义齿形态的准确把控能力,才能制作出合格的基底冠。 </p> <p class="content"> 设计完成后点击“下一步”,在弹出的对话框内,如选择“是”,则低于设定最薄厚度的部位会自动填补到指定厚度;如选择“否”,则会保留现有设计,不做任何局部增厚处理。保存和输出数据同全冠设计。</p> @@ -761,17 +790,18 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0058-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-4-3 设计修复空间</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0058-01.jpg" style="width:70%" alt="图2-4-3 设计修复空间" active="true" /> <p class="imgdescript-b">图2-4-3 设计修复空间</p> </div> <h3 class="thirdTitle">二、回切法基底冠设计</h3> <p class="content"> 回切法基底冠设计即根据邻牙及对颌牙信息恢复预期修复体,在此基础上设定数值回切出均匀的瓷层空间,从而提高烤瓷牙的弧度。传统工艺蜡型制作时,用此种方法效率太低,且不易掌握回切量,但是在软件中能事半功倍。下面介绍Exocad软件回切法基底冠设计(图2-4-4)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0058-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图2-4-4 基底冠Exocad软件设计界面</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0058-02.jpg" style="width:70%" alt="" active="true" /> <p class="imgdescript-b">图2-4-4 基底冠Exocad软件设计界面</p> </div> <p class="content"> 牙位选择:Exocad软件的订单建立采用牙位图电子技工单形式,相关设置方法如前。扫描或导入数据后,点击订单页面右侧的“设计”按钮,进入修复体设计界面。模型修整确定边缘线、确定就位道方向等步骤的操作与均匀增厚法基本相同。 @@ -791,16 +821,16 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">1.间隙剂参数设置</span> Exocad软件设置间隙剂厚度冠边缘参数、倒凹处理与刀具补偿的参数对话框见图2-4-5,各参数意义与3Shape软件类似,但需注意,冠边缘厚度要在此处设定(参数设置参考全冠设计)。不同口腔科材料推荐的参数同均匀增厚法。导入数据、绘制边缘线、排列牙齿位置如图2-4-6~图2-4-8所示。 class="bold fontGreen">1.间隙剂参数设置</span> Exocad软件设置间隙剂厚度冠边缘参数、倒凹处理与刀具补偿的参数对话框见图2-4-5,各参数意义与3Shape软件类似,但需注意,冠边缘厚度要在此处设定(参数设置参考全冠设计)。不同口腔科材料推荐的参数同均匀增厚法。导入数据、绘制边缘线、排列牙齿位置如图2-4-6~图2-4-8所示。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0059-01.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0059-01.jpg" style="width:80%" alt="图2-4-5 参数对话框" active="true" /> <p class="imgdescript-b">图2-4-5 参数对话框</p> <p class="imgdescript-l">A.间隙剂厚度冠边缘参数;B.倒凹处理参数;C.刀具补偿参数。</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0059-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-4-6 导入数据</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0059-02.jpg" style="width:80%" alt="图2-4-6 导入数据" active="true" /> <p class="imgdescript-b">图2-4-6 导入数据</p> </div> </div> @@ -819,13 +849,13 @@ <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0060-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-4-7 绘制边缘线</p> <p class="imgdescript-b">图2-4-7 绘制边缘线</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0060-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-4-8 排列牙齿位置</p> <p class="imgdescript-b">图2-4-8 排列牙齿位置</p> </div> <p class="content"><span class="bold">2.预期修复体设计</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">2.预期修复体设计</span></p> <p class="content"> (1)恢复牙齿外形后,对牙齿进行自由造型,调整咬合关系(图2-4-9)。修整舌侧外形,根据订单要求选择回切参数,选择舌侧加强带,这样有基牙的外形会自动生成金属边缘,手动勾画缺失位金属带,注意金属带的弧度、宽度尽量保持一致(图2-4-10)。画好之后,点击“应用”。回切后进行金属内冠形态的调整,把金属带调整到一条线上,方便后续添加连接体。调整牙龈压迫、牙齿弧度,进行下一步,添加连接体。合并牙桥后对连接杆进行修整,使用“加”的工具把金属带连接到一起。 </p> @@ -845,13 +875,14 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0061-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-4-9 制作牙冠</p> <div class="qrbodyPic openImgBox" style="margin-bottom: 30px;"> <img src="../../assets/images/0061-01.jpg" style="width:70%" alt="图2-4-9 制作牙冠" active="true" /> <p class="imgdescript-b">图2-4-9 制作牙冠</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0061-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图2-4-10 舌侧金属带内冠桥制作完成</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0061-02.jpg" style="width:70%" alt="图2-4-10 舌侧金属带内冠桥制作完成" active="true" /> <p class="imgdescript-b">图2-4-10 舌侧金属带内冠桥制作完成</p> </div> <p class="content"> (2)设置回切范围:在设计具有锆背、锆面结构的氧化锆基底冠时,抑或在设计具有舌侧金属边、金属咬合面的金属基底冠时,可以在预期修复体上涂画不需要烤瓷的部分,方法为点击并拖动鼠标,用蓝色光圈直接涂抹范围,按Shift键+鼠标滚轮可调整光圈大小,按Shift键并拖动鼠标可擦除涂抹。选中“保留已选部分”选项,点击“应用”后,软件将只针对非选择区域进行形态回切。 @@ -859,7 +890,6 @@ <p class="content"> (3)回切并修整基底冠:对于未进行区域选择的情况,软件将基于设计好的预期修复体外形进行整体的均匀回切(在保证最小厚度的前提下),从而获得具有一定解剖形态的基底冠。之后可对基底冠表面进行光滑修整,完成回切法基底冠的设计。 </p> </div> <div class="page-bottom-right">045</div> </div> @@ -874,17 +904,18 @@ </div> </div> <div class="bodystyle"> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">全口义齿数字化技术</span></p> <p class="quotation"> 第四次全国口腔健康流行病学调查显示,随着我国社会进入老龄化阶段,无牙颌患者大于1000万人。考虑到患者全身身体条件、颌骨条件及经济情况等,常规黏膜支持可摘式全口义齿(包括单颌总义齿)仍然是一种广泛的临床选择,其无创可逆的修复特点尤其适合老年患者。总义齿设计和制作涉及印模、颌位关系、咬合关系及美学等多个环节,并需要充分考虑义齿的功能、稳定和固位等,通常需要患者多次就诊,是口腔修复中最为复杂的一种修复技术。全口义齿数字化技术(如快速设计和打印个性化“诊断义齿”——一种闭口式个别托盘)可在一定程度上降低临床和技师操作难度,简化流程和制作工艺,从而可相对容易地获得符合规范的终印模和颌位关系记录,为最终的全口义齿质量奠定良好的基础,也减少了患者的就诊次数。主流口腔修复设计软件(如3Shape、Exocad等)通常包括全口义齿设计模板,其牙列支持一一调整的模式,符合口腔技师的传统操作习惯,临床也有较大的自由度。技师需要经过一定时间的学习和适应,才能熟练地使用软件进行一一排牙。我国自主研发的数字化全口义齿系统,采用义齿数据库模板多参数匹配的策略,在个性化终印模和颌位关系的数据基础上,可快速实现符合咬合关系的上下颌牙列,再辅以个性化的基托形态,大大简化了临床医生和技师的操作难度和流程。 </p> <p class="titleQuot-1">【任务评价】</p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">全口义齿数字化技术</span></p> <p class="quotation"> 第四次全国口腔健康流行病学调查显示,随着我国社会进入老龄化阶段,无牙颌患者大于1000万人。考虑到患者全身身体条件、颌骨条件及经济情况等,常规黏膜支持可摘式全口义齿(包括单颌总义齿)仍然是一种广泛的临床选择,其无创可逆的修复特点尤其适合老年患者。总义齿设计和制作涉及印模、颌位关系、咬合关系及美学等多个环节,并需要充分考虑义齿的功能、稳定和固位等,通常需要患者多次就诊,是口腔修复中最为复杂的一种修复技术。全口义齿数字化技术(如快速设计和打印个性化“诊断义齿”——一种闭口式个别托盘)可在一定程度上降低临床和技师操作难度,简化流程和制作工艺,从而可相对容易地获得符合规范的终印模和颌位关系记录,为最终的全口义齿质量奠定良好的基础,也减少了患者的就诊次数。主流口腔修复设计软件(如3Shape、Exocad等)通常包括全口义齿设计模板,其牙列支持一一调整的模式,符合口腔技师的传统操作习惯,临床也有较大的自由度。技师需要经过一定时间的学习和适应,才能熟练地使用软件进行一一排牙。我国自主研发的数字化全口义齿系统,采用义齿数据库模板多参数匹配的策略,在个性化终印模和颌位关系的数据基础上,可快速实现符合咬合关系的上下颌牙列,再辅以个性化的基托形态,大大简化了临床医生和技师的操作难度和流程。 </p> </div> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">基底冠设计任务评价标准见表2-4-1。</p> <p class="imgtitle">表2-4-1 基底冠设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0062-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold" style="margin-top: -10px;">表2-4-1 基底冠设计任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0062-01.jpg" style="width:100%;margin-top: -10px;" alt="表2-4-1 基底冠设计任务评价标准" active="true" /></div> </div> <div class="page-bottom-left">046</div> @@ -899,15 +930,30 @@ </div> <div class="bodystyle"> <h2 class="secondTitle">任务五 贴面设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">接到某门诊送来的设计订单,要求做11瓷贴面修复。模型数据已上传,设计11的瓷贴面。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.贴面设计的具体步骤是怎样的?</p> <p class="content">2.贴面不同部位的厚度要求是多少?</p> <p class="content">3.微笑设计在贴面设计的过程中起到什么作用?</p> <p class="titleQuot-1">【任务分析】</p> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">接到某门诊送来的设计订单,要求做11瓷贴面修复。模型数据已上传,设计11的瓷贴面。</p> <p class="titleQuot-1">【问题】</p> <p class="content">1.贴面设计的具体步骤是怎样的?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.nine" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.贴面不同部位的厚度要求是多少?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.ten" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">3.微笑设计在贴面设计的过程中起到什么作用?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.eleven" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 贴面(veneer)是目前临床口腔美学修复的一种修复体。在牙体表面色、形、质不理想的情况下,贴面修复被称为牙齿贴面修复。它是一种在尽量保存活髓、少磨牙或不磨牙的前提下,使用全瓷等优质修复材料,通过先进的粘接技术,来恢复牙齿正常形态和色泽的修复方式。随着粘接技术的不断发展和各种贴面修复材料的广泛应用,牙齿贴面修复已成为一种越来越受欢迎的修复方法。在牙体预备过程中,贴面修复能够最大限度地保存天然牙体组织,对牙齿的伤害较小,同时能够达到理想的修复效果。这项技术逐渐获得普遍认可,已经成为临床实践中常用的修复方法。贴面的切端形态有几种,根据切端与牙体的接触方式不同大致可以分为三种类型:开窗型、对接型、包绕型。传统方法可采用热压铸造陶瓷法和粉浆涂塑烤瓷法,现在广泛使用CAD/CAM方法加工制作。 </p> @@ -915,7 +961,7 @@ <p class="content">以右上颌中切牙贴面修复为例,介绍Exocad软件的瓷贴面设计工艺流程。</p> <p class="content">此病例对11牙位制作瓷贴面,订单设置如下:11牙位选择贴面,根据医生提供的设计单选择贴面材料。下面介绍Exocad软件贴面设计。</p> <p class="content"><span class="bold">1.扫描或导入数据</span> 牙位选择:Exocad软件的订单建立采用牙位图电子技工单形式,相关设置方法如前。点击订单页面右侧的“设计”按钮,进入贴面修复体设计界面,扫描或导入患者工作模型及对颌模型数据(图2-5-1)。 class="bold fontGreen">1.扫描或导入数据</span> 牙位选择:Exocad软件的订单建立采用牙位图电子技工单形式,相关设置方法如前。点击订单页面右侧的“设计”按钮,进入贴面修复体设计界面,扫描或导入患者工作模型及对颌模型数据(图2-5-1)。 </p> </div> @@ -932,20 +978,21 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0064-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-5-1 导入数据</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0064-01.jpg" style="width:70%" alt="图2-5-1 导入数据" active="true" /> <p class="imgdescript-b">图2-5-1 导入数据</p> </div> <p class="content"><span class="bold">2.确定边缘线</span> 边缘线的调整方法与全冠颈缘线的调整方法一致(图2-5-2),边缘线的精确提取对于后期贴面的边缘密合度及美观性具有直接影响,因此必须进行细致的调整(图2-5-3)。 class="bold fontGreen">2.确定边缘线</span> 边缘线的调整方法与全冠颈缘线的调整方法一致(图2-5-2),边缘线的精确提取对于后期贴面的边缘密合度及美观性具有直接影响,因此必须进行细致的调整(图2-5-3)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0064-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-5-2 绘制边缘线</p> <div class="qrbodyPic openImgBox" style="margin-bottom: 30px;"> <img src="../../assets/images/0064-02.jpg" style="width:70%" alt="图2-5-2 绘制边缘线" active="true" /> <p class="imgdescript-b">图2-5-2 绘制边缘线</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0064-03.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-5-3 精细调节边缘线</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0064-03.jpg" style="width:70%" alt="图2-5-3 精细调节边缘线" active="true" /> <p class="imgdescript-b">图2-5-3 精细调节边缘线</p> </div> </div> @@ -962,21 +1009,23 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">3.确定就位道方向</span> 贴面的定位方向与冠桥修复存在差异,通常情况下,应从唇侧向舌侧进行定位并粘接。针对切端包绕的情形,必须依据不同贴面的实际定位方向进行相应的调整(图2-5-4)。 class="bold fontGreen">3.确定就位道方向</span> 贴面的定位方向与冠桥修复存在差异,通常情况下,应从唇侧向舌侧进行定位并粘接。针对切端包绕的情形,必须依据不同贴面的实际定位方向进行相应的调整(图2-5-4)。 </p> <p class="content"><span class="bold">4.确定间隙剂厚度</span> 依据不同的贴面条件,设定相应的间隙剂厚度。本例中,右上颌中切牙的间隙剂厚度设定为0.025mm(图2-5-5),旨在便于后期贴面的紧密粘接。 class="bold fontGreen">4.确定间隙剂厚度</span> 依据不同的贴面条件,设定相应的间隙剂厚度。本例中,右上颌中切牙的间隙剂厚度设定为0.025mm(图2-5-5),旨在便于后期贴面的紧密粘接。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0065-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-5-4 确定就位道方向</p> <div class="qrbodyPic openImgBox" style="margin-bottom: 30px;"> <img src="../../assets/images/0065-01.jpg" style="width:70%" alt="图2-5-4 确定就位道方向" active="true" /> <p class="imgdescript-b">图2-5-4 确定就位道方向</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0065-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-5-5 确定间隙剂厚度</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0065-02.jpg" style="width:70%" alt="图2-5-5 确定间隙剂厚度" active="true" /> <p class="imgdescript-b">图2-5-5 确定间隙剂厚度</p> </div> <p class="content"><span class="bold">5.设计牙冠解剖外形</span> 依据对侧同名牙齿的解剖形态,从牙冠数据库中选取适合的标准牙冠,或利用镜像技术复制对侧同名牙齿的解剖形态(图2-5-6)。对解剖牙冠的形态进行细致调整,从多个角度审视其协调性与美观度(图2-5-7)。运用边缘线连接工具实现牙冠边缘与预备体颈缘线的无缝对接。 class="bold fontGreen">5.设计牙冠解剖外形</span> 依据对侧同名牙齿的解剖形态,从牙冠数据库中选取适合的标准牙冠,或利用镜像技术复制对侧同名牙齿的解剖形态(图2-5-6)。对解剖牙冠的形态进行细致调整,从多个角度审视其协调性与美观度(图2-5-7)。运用边缘线连接工具实现牙冠边缘与预备体颈缘线的无缝对接。 </p> @@ -994,15 +1043,18 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0066-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图2-5-6 镜像技术复制对侧同名牙齿的解剖形态</p> <div class="qrbodyPic openImgBox" style="margin-bottom: 30px;"> <img src="../../assets/images/0066-01.jpg" style="width:70%" alt="图2-5-6 镜像技术复制对侧同名牙齿的解剖形态" active="true" /> <p class="imgdescript-b">图2-5-6 镜像技术复制对侧同名牙齿的解剖形态</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0066-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图2-5-7 牙冠边缘与预备体颈缘线的连接融合</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0066-02.jpg" style="width:70%" alt="图2-5-7 牙冠边缘与预备体颈缘线的连接融合" active="true" /> <p class="imgdescript-b">图2-5-7 牙冠边缘与预备体颈缘线的连接融合</p> </div> <p class="content"><span class="bold">6.调整咬合关系及邻接关系(图2-5-8)</span> 要注意以下几点。</p> <p class="content"><span class="bold fontGreen titleLeftmove">6.调整咬合关系及邻接关系(图2-5-8)</span> 要注意以下几点。 </p> <p class="content">(1)在进行前伸运动和侧方运动检查时,应确保修复体无阻碍,并消除所有早接触点。</p> <p class="content"> (2)检查邻牙的邻接区位置,确保其高度适中,既不过高也不过低。前牙区域的邻接点应偏向唇侧,而随着位置向远中移动,邻接点应逐渐移至中1/3区域。同时,检查邻接区域的面积,确保其既不过大也不过小,以避免食物嵌塞。 @@ -1022,16 +1074,17 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0067-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图2-5-8 调整咬合关系及邻接关系</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0067-01.jpg" style="width:75%" alt="图2-5-8 调整咬合关系及邻接关系" active="true" /> <p class="imgdescript-b">图2-5-8 调整咬合关系及邻接关系</p> </div> <p class="content"><span class="bold">7.生成贴面</span> 软件能够依据牙体预备的边缘线轮廓,对调整完毕的牙冠外形进行进一步的优化(图2-5-9)。尽管算法致力于实现自然的衔接效果,但仍然需要通过手工方式对边缘衔接的过渡部分进行细致的微调。在进行形态调整时,特别需要注意确保贴面的整体厚度及边缘厚度,以防因厚度不足而在后续加工过程中出现崩瓷现象。最终,完成设计工作后,应保存并输出数据(图2-5-10)。 class="bold fontGreen">7.生成贴面</span> 软件能够依据牙体预备的边缘线轮廓,对调整完毕的牙冠外形进行进一步的优化(图2-5-9)。尽管算法致力于实现自然的衔接效果,但仍然需要通过手工方式对边缘衔接的过渡部分进行细致的微调。在进行形态调整时,特别需要注意确保贴面的整体厚度及边缘厚度,以防因厚度不足而在后续加工过程中出现崩瓷现象。最终,完成设计工作后,应保存并输出数据(图2-5-10)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0067-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-5-9 生成贴面</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0067-02.jpg" style="width:75%" alt="图2-5-9 生成贴面" active="true" /> <p class="imgdescript-b">图2-5-9 生成贴面</p> </div> </div> @@ -1048,22 +1101,24 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0068-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-5-10 完成设计</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0068-01.jpg" style="width:70%" alt="图2-5-10 完成设计" active="true" /> <p class="imgdescript-b">图2-5-10 完成设计</p> </div> <h3 class="thirdTitle">二、贴面的DSD设计</h3> <p class="content">随着医疗人员与患者需求的日益增长,预测治疗前的修复效果已成为可能,这得益于数字微笑设计(digital smile design,DSD)技术的应用。DSD技术将二维美学设计转化为三维贴面或修复体设计,使得患者、医生及技师能够更全面且直观地观察到修复体在患者口腔内的形态、位置及颜色。这一技术在医疗人员、患者与技师之间的沟通中扮演了至关重要的角色。 </p> <p class="content">为确保患者隐私,采用仿真头模型进行演示。下面以右上颌中切牙贴面修复为例,介绍Exocad软件在瓷贴面DSD设计工艺流程中的应用。</p> <p class="content"><span class="bold">1.建立订单</span> 此病例右上颌中切牙要进行贴面设计,在牙弓视图上点击“11”,选择“Smile <p class="content"><span class="bold fontGreen">1.建立订单</span> 此病例右上颌中切牙要进行贴面设计,在牙弓视图上点击“11”,选择“Smile design”建立订单。</p> <p class="content"><span class="bold">2.DSD设计照片的处理及导入</span> 导入患者的微笑照片和牵引器下扩口照(图2-5-11),根据软件提示完成牵引器的照片及微笑照片位置的摆放。</p> <div class="qrbodyPic"> <img src="../../assets/images/0068-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图2-5-11 导入牵引器下扩口照</p> class="bold fontGreen">2.DSD设计照片的处理及导入</span> 导入患者的微笑照片和牵引器下扩口照(图2-5-11),根据软件提示完成牵引器的照片及微笑照片位置的摆放。 </p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0068-02.jpg" style="width:75%" alt="图2-5-11 导入牵引器下扩口照" active="true" /> <p class="imgdescript-b">图2-5-11 导入牵引器下扩口照</p> </div> </div> @@ -1080,17 +1135,19 @@ </div> <div class="bodystyle"> <p class="content">3.点击瞳孔、鼻翼和口角六个定位点确定面部中线,绘制唇线轮廓(图2-5-12)。</p> <div class="qrbodyPic"> <img src="../../assets/images/0069-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-5-12 绘制唇线轮廓</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0069-01.jpg" style="width:75%" alt="图2-5-12 绘制唇线轮廓" active="true" /> <p class="imgdescript-b">图2-5-12 绘制唇线轮廓</p> </div> <p class="content">4.选择扩口照下的同牙位同名解剖标记点,进行同名牙复制(图2-5-13)。</p> <div class="qrbodyPic"> <img src="../../assets/images/0069-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图2-5-13 扩口照下的同牙位同名解剖标记点</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0069-02.jpg" style="width:75%" alt="图2-5-13 扩口照下的同牙位同名解剖标记点" active="true" /> <p class="imgdescript-b">图2-5-13 扩口照下的同牙位同名解剖标记点</p> </div> <p class="content"><span class="bold">5.选择牙齿形态类型进行DSD设计</span> 选择患者同名牙齿形态的数据类型,点击对称设计及连接的设计,对牙齿的长宽比进行调整,此调整可以完成对称同名牙长宽比、大小和牙齿轴向的设计。选择自由形态可以编辑牙齿的半径范围及绘制平滑的范围。选择镜像牙齿功能可以对已经调整好的设计进行对侧同名牙的复制,减小设计强度。 class="bold fontGreen">5.选择牙齿形态类型进行DSD设计</span> 选择患者同名牙齿形态的数据类型,点击对称设计及连接的设计,对牙齿的长宽比进行调整,此调整可以完成对称同名牙长宽比、大小和牙齿轴向的设计。选择自由形态可以编辑牙齿的半径范围及绘制平滑的范围。选择镜像牙齿功能可以对已经调整好的设计进行对侧同名牙的复制,减小设计强度。 </p> <p class="content">DSD设计的修复结果可让患者和医生进行参考,以决定最后的设计方案(图2-5-14)。</p> @@ -1109,36 +1166,36 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0070-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图2-5-14 DSD设计结果</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0070-01.jpg" style="width:75%" alt="图2-5-14 DSD设计结果" active="true" /> <p class="imgdescript-b">图2-5-14 DSD设计结果</p> </div> <p class="content"> 将设计好的DSD设计数据导出,可将其导入Exocad修复设计软件中进行贴面的3D设计。此时无须重新建立订单,利用已有的电子订单,导入患者口内扫描或模型扫描的牙列数据,以及颜面三维扫描数据。在贴面设计过程中,可导入二维DSD设计照片,比对参考下完成贴面设计或美学蜡型设计。 </p> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">传统贴面修复</span></p> <p class="quotation">近百年来,烤瓷贴面技术一直存在,最初的瓷贴面修复都是通过此技术实现的。</p> <p class="quotation"> 烤瓷材料本身强度不高,加上早期粘接材料的局限性,导致早期烤瓷贴面的成功率不高,许多医生因此放弃了这种修复方法。然而,随着粘接材料技术的飞速进步,粘接强度和粘接树脂的自身强度显著提升,使得原本强度不足的烤瓷贴面在得到良好的粘接基础后,展现出极佳的强度,其长期使用的有效性得到认可,因此越来越多的医生开始重新采用烤瓷贴面技术进行修复。烤瓷技术包括粉浆涂塑烤瓷技术和热压铸造陶瓷技术。 </p> <p class="quotation">1.粉浆涂塑烤瓷技术 是目前为技师更多选择且应用的烤瓷贴面制作技术。这种技术的基本步骤如下。</p> <p class="quotation">(1)翻制代型工作模型。</p> <p class="quotation">(2)复制耐火材料代型(可抽插式)。</p> <p class="quotation">(3)在可抽插耐火材料代型上堆塑瓷粉,形成瓷贴面。</p> <p class="quotation">(4)将耐火代型和瓷贴面共同进炉进行烤制。</p> <p class="quotation">(5)调整、修饰、上釉。</p> <p class="quotation">(6)利用喷砂的方式去除耐火代型。</p> <p class="quotation"> 2.热压铸造陶瓷技术 由于烤瓷贴面的强度较低,其加工与操作均较为复杂,口腔医学技术专家与材料学研究者持续致力于开发新的材料与技术,以适应瓷贴面的加工需求。随着热压铸造陶瓷技术的成熟,它已被有效地应用于贴面修复体的制作,几乎成为贴面技术的代名词。 </p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">传统贴面修复</span></p> <p class="quotation">近百年来,烤瓷贴面技术一直存在,最初的瓷贴面修复都是通过此技术实现的。</p> <p class="quotation"> 烤瓷材料本身强度不高,加上早期粘接材料的局限性,导致早期烤瓷贴面的成功率不高,许多医生因此放弃了这种修复方法。然而,随着粘接材料技术的飞速进步,粘接强度和粘接树脂的自身强度显著提升,使得原本强度不足的烤瓷贴面在得到良好的粘接基础后,展现出极佳的强度,其长期使用的有效性得到认可,因此越来越多的医生开始重新采用烤瓷贴面技术进行修复。烤瓷技术包括粉浆涂塑烤瓷技术和热压铸造陶瓷技术。 </p> <p class="quotation">1.粉浆涂塑烤瓷技术 是目前为技师更多选择且应用的烤瓷贴面制作技术。这种技术的基本步骤如下。</p> <p class="quotation">(1)翻制代型工作模型。</p> <p class="quotation">(2)复制耐火材料代型(可抽插式)。</p> <p class="quotation">(3)在可抽插耐火材料代型上堆塑瓷粉,形成瓷贴面。</p> <p class="quotation">(4)将耐火代型和瓷贴面共同进炉进行烤制。</p> <p class="quotation">(5)调整、修饰、上釉。</p> <p class="quotation">(6)利用喷砂的方式去除耐火代型。</p> <p class="quotation"> 2.热压铸造陶瓷技术 由于烤瓷贴面的强度较低,其加工与操作均较为复杂,口腔医学技术专家与材料学研究者持续致力于开发新的材料与技术,以适应瓷贴面的加工需求。随着热压铸造陶瓷技术的成熟,它已被有效地应用于贴面修复体的制作,几乎成为贴面技术的代名词。 </p> </div> </div> <div class="page-bottom-left">054</div> </div> </div> <!-- Page 61 (奇数页) --> <div class="page-box" page="61"> <div v-if="showPageList.indexOf(61) > -1"> @@ -1154,30 +1211,168 @@ <p class="quotation">(4)进行打磨、塑形、修饰、着色和上釉等工序。</p> <p class="quotation"> 自从热压铸造陶瓷技术推出以来,已经经历了数代产品的更新换代。尽管它们的基本成分存在差异,但操作步骤和主要性能却大致相同。它们之间最显著的差异在于强度的持续提升。</p> <p class="titleQuot-1">【任务评价】</p> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">贴面设计任务评价标准见表2-5-1。</p> <p class="imgtitle">表2-5-1 贴面设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0071-01.jpg" style="width:80%" alt="" active="true" /></div> <div class="bodyPic"><img src="../../assets/images/0071-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold">表2-5-1 贴面设计任务评价标准</p> <div class="bodyPic openImgBox"> <img src="../../assets/images/0071-01.jpg" style="width:100%;margin-top: -10px;" alt="表2-5-1 贴面设计任务评价标准" active="true" /> </div> <div class="unitSummary mb-20"> <div class="summary-content"> <div class="summary-content-box" @click="toUrl(getResourceInfo('B4'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目二 考试知识点 基底冠设计">项目二 考试知识点 基底冠设计</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B5'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目二 考试知识点 基底桥设计">项目二 考试知识点 基底桥设计</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B6'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目二 考试知识点 嵌体设计">项目二 考试知识点 嵌体设计</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B7'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目二 考试知识点 全冠设计">项目二 考试知识点 全冠设计</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B8'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目二 考试知识点 贴面设计">项目二 考试知识点 贴面设计</span> </div> </div> </div> <div class="unitSummary"> <div class="summary-content"> <div class="summary-content-box" @click="toUrl(getResourceInfo('C5'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目二 固定桥设计 小结">项目二 固定桥设计 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C6'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目二 基底冠设计 小结">项目二 基底冠设计 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C7'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目二 嵌体设计 小结">项目二 嵌体设计 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C8'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目二 全冠设计 小结">项目二 全冠设计 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C9'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目二 贴面设计 小结">项目二 贴面设计 小结</span> </div> </div> </div> <div class="knowledgeExpansion"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>题库</span> </div> <div class="knowledgeExpansion-box"> <img src="../../assets/images/tuoZhan.svg" alt="" /> <span @click="openQuestion(getResourceInfo('AA3'))">拓展练习</span> </div> </div> <p class="right-info">(曹玲玲 王梦圆 徐佳音 黄碧坤)</p> </div> <div class="page-bottom-right">055</div> </div> </div> <preView :md5="p_md5" :pdfTitle="somePdfTitleValue" ref="pdfDialogRef"></preView> <dialogExaminations :cardList="interfaceQuestion" :questionIDList="questionIDList" :page="questionNum" :questionTitle="questionTitleMain" ref="dialogRef"> </dialogExaminations> </div> </template> <script> import preView from "@/components/pdfview/index.vue"; import bookVideo from "@/components/bookVideo/index.vue"; import dialogExaminations from "@/components/dialogExaminations/index.vue"; export default { name: "chapterThree", props: { showPageList: { type: Array, }, getResourceInfo: { type: Function, // 明确指定它是一个函数 required: true, }, interfaceQuestion: { type: Array, required: true, default: () => [], }, }, components: { preView, bookVideo, dialogExaminations, }, data() { return { p_md5: "", somePdfTitleValue: "", // 题目相关 questionNum: 0, questionTitleMain: "", questionIDList: [], questionData: { one: "", two: "", three: "", fore: "", five: "", six: "", seven: "", eight: "", nine: "", ten: "", eleven: "" } }; }, mounted() { this.getQuestionData() }, methods: { toUrl(val) { if (val != null) { this.p_md5 = val.md5; this.somePdfTitleValue = val.resourceName; this.$refs.pdfDialogRef.openDialog(); } }, openQuestion(val) { if (val != undefined) { this.questionNum = val.pagination; this.questionTitleMain = val.resourceName; this.questionIDList = val.ids; this.$nextTick(() => { this.$refs.dialogRef.openDialogQuestion(); }); } }, setQuestionData() { localStorage.setItem( "digitalDentalRestorationTechnology-book-chapter03-questionData", JSON.stringify(this.questionData) ); }, getQuestionData() { let questionData = localStorage.getItem("digitalDentalRestorationTechnology-book-chapter03-questionData"); if (questionData) { this.questionData = JSON.parse(questionData); } }, }, } </script> src/books/digitalDentalRestorationTechnology/view/components/chapter004.vue
@@ -9,32 +9,52 @@ </div> </div> <div class="bodystyle"> <h1 class="firstTitle-l mb-70 pt-70">项目三 活动义齿修复设计工艺</h1> <div class="bodyPic"><img src="../../assets/images/0072-01.jpg" style="width:30%" alt="" active="true" /></div> <div class="bodyPic"><img src="../../assets/images/0017-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">素质目标</span></p> <p class="content">(1)具备探索未知领域的科学精神,保持对活动义齿设计新材料、新技术的持续关注,开发新的设计思路,解决口腔牙列缺损的临床问题。</p> <p class="content">(2)提升科学分析能力,用发展的眼光看待活动义齿修复前景。</p> <p class="center">........................</p> <p class="center"><span class="bold">知识目标</span></p> <p class="content">(1)掌握:肯氏分类牙列缺损修复的义齿特点,以及其对应的支架设计要点与设计方法。</p> <p class="content"> (2)熟悉:口腔修复学、解剖生理学知识在RPD数字支架制作中的应用,如口腔软硬组织的结构特点、咀嚼运动规律对义齿设计的影响;常用数字化设计软件的功能模块和操作技巧,如模型分析、支架设计等内容。 </p> <p class="content">(3)了解:游离端牙齿缺失情况下功能性印模制取的必要性;常用数字支架制作材料的性能特点;活动支架数字化设计与制作的基本流程。</p> <p class="center">........................</p> <p class="content"><span class="bold">能力目标</span></p> <p class="content">(1)能够根据患者口腔的具体情况进行有效的临床分析与判断,设计双侧游离缺失的义齿支架。</p> <p class="content">(2)能用思维导图的方式总结、梳理可摘局部义齿支架设计流程。</p> <h1 class="firstTitle-l mb-70 pt-70 oneTitle">项目三 活动义齿修复设计工艺</h1> <div class="learnGoal"> <img class="learnImg img-h" src="../../assets/images/learnGoal.png" alt="" /> <p class="center learngoalRange"><span class="bold">素质目标</span></p> <p class="content">(1)具备探索未知领域的科学精神,保持对活动义齿设计新材料、新技术的持续关注,开发新的设计思路,解决口腔牙列缺损的临床问题。</p> <p class="content">(2)提升科学分析能力,用发展的眼光看待活动义齿修复前景。</p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"><span class="bold">知识目标</span></p> <p class="content">(1)掌握:肯氏分类牙列缺损修复的义齿特点,以及其对应的支架设计要点与设计方法。</p> <p class="content"> (2)熟悉:口腔修复学、解剖生理学知识在RPD数字支架制作中的应用,如口腔软硬组织的结构特点、咀嚼运动规律对义齿设计的影响;常用数字化设计软件的功能模块和操作技巧,如模型分析、支架设计等内容。 </p> <p class="content">(3)了解:游离端牙齿缺失情况下功能性印模制取的必要性;常用数字支架制作材料的性能特点;活动支架数字化设计与制作的基本流程。</p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"><span class="bold">能力目标</span></p> <p class="content">(1)能够根据患者口腔的具体情况进行有效的临床分析与判断,设计双侧游离缺失的义齿支架。</p> <p class="content">(2)能用思维导图的方式总结、梳理可摘局部义齿支架设计流程。</p> </div> <div class="knowledgeExpansion"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>教学课件</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A10'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span title="项目三 教学课件 肯氏二类支架设计">项目三 教学课件 肯氏二类支架设计</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A11'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span title="项目三 教学课件 肯氏三类支架设计">项目三 教学课件 肯氏三类支架设计</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A12'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span title="项目三 教学课件 肯氏四类支架设计">项目三 教学课件 肯氏四类支架设计</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A13'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span title="项目三 教学课件 肯氏一类支架设计">项目三 教学课件 肯氏一类支架设计</span> </div> </div> <p class="content"> 目前,借助CAD/CAM技术,可摘局部义齿的基底部支架设计技术已经相对成熟。通过这种技术生产的义齿支架精度高,参数化设计的合理应用使得支架结构的强度控制更趋精准,进而实现了相较于传统方法更加理想的修复效果。在活动支架数字化设计流程中,通常会将义齿支架各部件进行独立设计,最终通过连接体将这些部件连接为一个整体,完成整个支架结构的设计。 </p> <p class="content"> 可摘局部义齿修复主要针对患者口腔内牙列缺损的情况。牙列缺损是指患者上颌或下颌的牙列内有数目不等、位置不同的整颗牙齿缺失,同时有余留牙存在的情况。这种情况十分复杂。肯氏分类法作为一种对缺牙情况的分类系统,有助于将这种复杂性转化为具有规律性的分类,从而指导牙科专业人员更系统地设计个性化的修复方案。 </p> </div> <div class="page-bottom-left">056</div> </div> @@ -52,35 +72,34 @@ <p class="content">可摘局部义齿(removable partial denture,RPD)支架主要由金属材料制作而成,确保了耐用性与稳定性,其设计是牙科修复领域内的一项重要技能。以下是RPD支架设计的一些基本原则和要求。</p> <p class="content"><span class="bold">1.生物相容性和稳定性</span> 支架材料必须具有生物相容性,确保长期佩戴时不会引起组织反应或过敏。设计应确保RPD在口腔内的稳定性,防止在咀嚼或说话时移动或脱落。 class="bold fontGreen">1.生物相容性和稳定性</span> 支架材料必须具有生物相容性,确保长期佩戴时不会引起组织反应或过敏。设计应确保RPD在口腔内的稳定性,防止在咀嚼或说话时移动或脱落。 </p> <p class="content"><span class="bold">2.功能性要求</span> 应恢复患者咀嚼、发音和美观的功能,设计时考虑牙列的咬合关系,以确保义齿与对颌牙的正确接触和功能运动。</p> class="bold fontGreen">2.功能性要求</span> 应恢复患者咀嚼、发音和美观的功能,设计时考虑牙列的咬合关系,以确保义齿与对颌牙的正确接触和功能运动。</p> <p class="content"><span class="bold">3.保护剩余牙和牙周组织</span> 支架设计应减少对剩余牙齿的损伤和应力集中,预防进一步的牙齿移动和牙周组织损伤,设计要考虑到牙槽骨的保护,避免由于义齿负载造成的过重压力。 class="bold fontGreen">3.保护剩余牙和牙周组织</span> 支架设计应减少对剩余牙齿的损伤和应力集中,预防进一步的牙齿移动和牙周组织损伤,设计要考虑到牙槽骨的保护,避免由于义齿负载造成的过重压力。 </p> <p class="content"><span class="bold">4.美观性、舒适性、耐用性</span> 支架应尽可能模仿自然牙齿的外观,包括颜色和形状,以满足美学需求;设计应确保患者佩戴舒适、无异物感,不会在口腔内造成不适或疼痛;支架应便于患者清洁和维护,包括易于摘戴和冲洗,从而延长使用寿命。 class="bold fontGreen">4.美观性、舒适性、耐用性</span> 支架应尽可能模仿自然牙齿的外观,包括颜色和形状,以满足美学需求;设计应确保患者佩戴舒适、无异物感,不会在口腔内造成不适或疼痛;支架应便于患者清洁和维护,包括易于摘戴和冲洗,从而延长使用寿命。 </p> <p class="content"><span class="bold">5.遵循生物安全性和生物力学原理</span> 根据临床需求选择合适的支架材料,如合金(钴铬合金、钛及钛合金)或义齿基托树脂(如聚甲基丙烯酸甲酯),确保材料的强度、耐腐蚀性和耐久性,满足长期使用要求。同时支架设计应根据生物力学原理进行,确保力量在牙齿和牙槽骨上的适当分布,以减少对组织的压力和潜在损伤。 class="bold fontGreen">5.遵循生物安全性和生物力学原理</span> 根据临床需求选择合适的支架材料,如合金(钴铬合金、钛及钛合金)或义齿基托树脂(如聚甲基丙烯酸甲酯),确保材料的强度、耐腐蚀性和耐久性,满足长期使用要求。同时支架设计应根据生物力学原理进行,确保力量在牙齿和牙槽骨上的适当分布,以减少对组织的压力和潜在损伤。 </p> <p class="content"><span class="bold">6.遵守行业法规和标准</span> 根据每个患者的具体情况(如牙槽骨情况、剩余牙齿的位置和数量、咬合关系等)进行个性化设计,考虑患者的个人需求和偏好,确保设计符合其特定的生活方式。在设计和制作过程中,遵守国家和国际的相关法律法规,以及牙科行业标准。 class="bold fontGreen">6.遵守行业法规和标准</span> 根据每个患者的具体情况(如牙槽骨情况、剩余牙齿的位置和数量、咬合关系等)进行个性化设计,考虑患者的个人需求和偏好,确保设计符合其特定的生活方式。在设计和制作过程中,遵守国家和国际的相关法律法规,以及牙科行业标准。 </p> <p class="content">综合以上原则和要求,RPD支架设计需要牙科医生、修复技师和患者之间进行良好的沟通和协调,以确保最终的修复结果达到功能性和美学的完美平衡。</p> <h3 class="thirdTitle">二、RPD支架的主要构成</h3> <p class="content"><span class="bold">1.固位体(retainer)</span> 主要用来抵抗脱位力作用,是为义齿提供固位、稳定和支持的重要部件,分为直接固位体和间接固位体。</p> class="bold fontGreen">1.固位体(retainer)</span> 主要用来抵抗脱位力作用,是为义齿提供固位、稳定和支持的重要部件,分为直接固位体和间接固位体。 </p> <p class="content">(1)直接固位体(direct retainer):主要安放在邻近缺隙基牙或毗邻间隙基牙上的金属部件,卡环型固位体是最常用的直接固位体。常用卡环种类如下,设计时可根据患者口腔组织情况选择应用。</p> <p class="content">1)三臂卡环:主要用于肯氏Ⅲ类、Ⅳ类设计。安放在前磨牙和磨牙上,固位、稳定、支持效果都好(图3-0-1)。</p> <p class="content">2)圈形卡环:主要安放在远中孤立的磨牙上,基牙向近中颊倾(多为上颌)或近中舌倾(多为下颌),同时近远中<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托为对称设计(图3-0-2)。</p> <p class="content">2)圈形卡环:主要安放在远中孤立的磨牙上,基牙向近中颊倾(多为上颌)或近中舌倾(多为下颌),同时近远中𬌗支托为对称设计(图3-0-2)。</p> <p class="content"> 3)间隙卡环或联合卡环:主要用于肯氏Ⅱ类、Ⅲ类、Ⅳ类设计。常用于基牙牙冠短而稳固,相邻两牙间有间隙的情况,有时也可当作一种间接固位体使用(图3-0-3、图3-0-4)。</p> <p class="content">4)RPI组合式卡环:主要用于肯氏Ⅰ类、Ⅱ类设计。由近中<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托、远中邻面板、颊侧I杆卡组成(图3-0-5)。</p> <p class="content">4)RPI组合式卡环:主要用于肯氏Ⅰ类、Ⅱ类设计。由近中𬌗支托、远中邻面板、颊侧I杆卡组成(图3-0-5)。</p> </div> <div class="page-bottom-right">057</div> @@ -96,37 +115,47 @@ </div> </div> <div class="bodystyle"> <p class="content">5)RPA组合式卡环:主要用于肯氏Ⅰ类、Ⅱ类设计。由近中<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托、远中邻面板、颊侧Aker圆环形卡环(非I杆卡适应证条件下调换)组成(图3-0-6)。 <p class="content">5)RPA组合式卡环:主要用于肯氏Ⅰ类、Ⅱ类设计。由近中𬌗支托、远中邻面板、颊侧Aker圆环形卡环(非I杆卡适应证条件下调换)组成(图3-0-6)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0074-02.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-0-1 三臂卡环</p> <div class="imgFloat"> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0074-02.jpg" style="width:80%" alt="图3-0-1 三臂卡环" active="true" /> <p class="imgdescript-b">图3-0-1 三臂卡环</p> </div> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0074-03.jpg" style="width:80%" alt="图3-0-2 圈形卡环" active="true" /> <p class="imgdescript-b">图3-0-2 圈形卡环</p> </div> </div> <div class="qrbodyPic"> <img src="../../assets/images/0074-03.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-0-2 圈形卡环</p> <div class="imgFloat"> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0074-04.jpg" style="width:80%" alt="图3-0-3 间隙卡环" active="true" /> <p class="imgdescript-b">图3-0-3 间隙卡环</p> </div> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0074-05.jpg" style="width:80%" alt="图3-0-4 联合卡环" active="true" /> <p class="imgdescript-b">图3-0-4 联合卡环</p> </div> </div> <div class="qrbodyPic"> <img src="../../assets/images/0074-04.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-0-3 间隙卡环</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0074-05.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-0-4 联合卡环</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0074-06.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-0-5 RPI组合式卡环</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0074-07.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-0-6 RPA组合式卡环</p> <div class="imgFloat"> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0074-06.jpg" style="width:80%" alt="图3-0-5 RPI组合式卡环" active="true" /> <p class="imgdescript-b">图3-0-5 RPI组合式卡环</p> </div> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0074-07.jpg" style="width:80%" alt="图3-0-6 RPA组合式卡环" active="true" /> <p class="imgdescript-b">图3-0-6 RPA组合式卡环</p> </div> </div> <p class="content">(2)间接固位体(indirect retainer):通常放置在远离缺隙区域的基牙上,防止义齿发生下沉、翘起、摆动、旋转的不稳定现象。间接固位体种类有很多,常见种类如下。</p> <p class="content">1)支托:后牙咬合面的<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托,前牙舌隆突上的舌支托(常放置在上颌尖牙上)、前牙切缘上的切支托(美观性较差,非必要不设计)。</p> <p class="content">1)支托:后牙咬合面的𬌗支托,前牙舌隆突上的舌支托(常放置在上颌尖牙上)、前牙切缘上的切支托(美观性较差,非必要不设计)。</p> <p class="content"> 2)Kennedy杆:即双舌杆,由舌杆与Kennedy杆(连续杆、舌隆突杆)组成。通常用于以下情况:当前牙牙周支持不足需要间接固位时;前牙存在较大的天然牙间隙时;多个后牙缺失需要在前牙上获得间接固位时;牙周炎或外科手术导致前牙之间有过大的间隙,使用舌板影响前牙美观性时。 </p> @@ -145,7 +174,7 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">2.连接体(connectors)</span> 连接体功能包括连接义齿部件、提供跨弓稳定性、传递力量,并分散咬合力以减轻基牙和牙周压力。连接体分为大连接体和小连接体。 class="bold fontGreen">2.连接体(connectors)</span> 连接体功能包括连接义齿部件、提供跨弓稳定性、传递力量,并分散咬合力以减轻基牙和牙周压力。连接体分为大连接体和小连接体。 </p> <p class="content">(1)大连接体</p> <p class="content"> @@ -162,18 +191,17 @@ 3)金属塑料结合区小连接体:离开工作模型0.5mm以上,以便树脂基托包埋;有一定强度,厚度≥1.5mm,网状支架与树脂基托结合处有小于90°的内外终止线;铸网一般稍稍超过牙槽嵴顶的唇颊侧即可,游离端的上颌铸网应达到上颌结节的前部,下颌应达到磨牙后垫之前,咬合紧时应更长。 </p> <p class="content"><span class="bold">3.支托(rest)</span> 是肯氏分类支架设计中的重要元素,可以分散咬合力,降低对基牙的扭力和侧向力,有助于保持义齿的稳定性和固位,防止义齿的不规则移动或旋转。 class="bold fontGreen">3.支托(rest)</span> 是肯氏分类支架设计中的重要元素,可以分散咬合力,降低对基牙的扭力和侧向力,有助于保持义齿的稳定性和固位,防止义齿的不规则移动或旋转。 </p> <p class="content">(1)作为间接固位体的支托(同前述间接固位体内容)。</p> <p class="content"> (2)作为直接固位体卡环上的支托:在牙支持式义齿中,支托位于近缺隙的基牙上,并直接与小连接体相连以传递咬合力;而在混合支持式义齿中,支托通常置于远离游离区的位置,例如,在远中游离缺失的情况下使用近中支托,有助于减少基牙的扭力并使游离端基托下的组织受力均匀。 </p> <p class="content"><span class="bold">4.邻面板(lingual bar)</span> 常用于游离端义齿设计。宽度一般大于基牙颊舌径2/3,厚度为0.8~1.0mm,靠近<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面部位呈移形状,与基牙密切接触。</p> <p class="content"><span class="bold">5.加强带(major <p class="content"><span class="bold fontGreen">4.邻面板(lingual bar)</span> 常用于游离端义齿设计。宽度一般大于基牙颊舌径2/3,厚度为0.8~1.0mm,靠近𬌗面部位呈移形状,与基牙密切接触。</p> <p class="content"><span class="bold fontGreen">5.加强带(major retainer)</span> 位于大连接体与网状连接体相连处,表面应形成便于塑料连接的锯齿状形态,其宽度通常为1.5~2.0mm,厚度≥0.7mm。</p> <p class="content"><span class="bold">6.支架支点(fulcrum line)、支撑杆(abutment <p class="content"><span class="bold fontGreen">6.支架支点(fulcrum line)、支撑杆(abutment res)</span> 通常安放在牙槽嵴侧面,形成2mm×2mm的方形或圆形金属突起。常用于游离端义齿设计,防止网状连接体在制作义齿及充填塑料时下沉。支撑杆一般在义齿跨度较长的部位需要增加,防止支架在制作过程中发生变形移位。 </p> @@ -203,16 +231,27 @@ 肯氏分类有亚类。亚类是指主缺隙除外的另外缺隙数目,即除主缺隙外,另外还有几个缺隙,即几亚类,应用方法遵循Applegate法则:①分类以患者拔牙后为基准;②肯氏Ⅰ类、Ⅱ类、Ⅲ类有亚类,Ⅳ类无亚类;③前后都有缺牙,以最后的缺牙间隙为主缺隙;④牙弓两侧后牙都有缺失,以远中游离端缺牙间隙为主缺隙;⑤若第二、第三磨牙修复,则考虑在分类之列中;不修复则不考虑。 </p> <h2 class="secondTitle">任务一 肯氏Ⅰ类支架设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content"> 患者,女,55岁。右上第一、第二磨牙,左上第一前磨牙,第一、第二磨牙全部缺失;余留牙齿状况良好,牙周健康,无明显牙周炎或牙齿松动,有稳定的咬合关系和足够的剩余牙齿支持。根据患者口腔组织情况,进行科学合理的活动支架设计。 </p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.肯氏Ⅰ类RPD设计的支持方式是怎样的?其中混合支持式义齿的设计复杂性较高,应该从哪些常见的特点及设计要点切入?</p> <p class="content">2.本病例的RPD支架应当进行什么设计?设计哪些具体的部件?部件应当放在何位置?</p> <p class="titleQuot-1">【任务分析】</p> <div class="CaseStudy"> <div class="CaseStudy-title">任务案例</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content"> 患者,女,55岁。右上第一、第二磨牙,左上第一前磨牙,第一、第二磨牙全部缺失;余留牙齿状况良好,牙周健康,无明显牙周炎或牙齿松动,有稳定的咬合关系和足够的剩余牙齿支持。根据患者口腔组织情况,进行科学合理的活动支架设计。 </p> <p class="titleQuot-1">【问题】</p> <p class="content">1.肯氏Ⅰ类RPD设计的支持方式是怎样的?其中混合支持式义齿的设计复杂性较高,应该从哪些常见的特点及设计要点切入?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.one" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.本病例的RPD支架应当进行什么设计?设计哪些具体的部件?部件应当放在何位置?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.two" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 肯氏Ⅰ类牙列缺损指牙弓两侧后部牙齿缺失,远中游离端无天然牙齿。临床口腔健康状况具有多样性,确保修复效果的首要步骤是评估患者的口腔组织健康状况,并据此选择合适的义齿支持方式。根据选定的支持方式,分析义齿的特点和设计要点,进行具体病例RPD的支架设计。在支架设计的过程中,特别强调要减少或消除游离端义齿的不稳定性,避免对剩余天然牙和口腔软组织造成损伤和创伤。专业精准的设计需要确保义齿具有良好的稳定性和分散咬合力,从而保护牙槽骨和基牙,减小对口腔组织的负面影响。 </p> @@ -232,24 +271,22 @@ <div class="bodystyle"> <h3 class="thirdTitle">一、混合支持式义齿设计</h3> <p class="content">在双侧后牙部分或全部缺失、余留牙相对健康的情况下,则设计为混合支持式义齿(义齿由天然牙、黏膜、牙槽骨共同支持)。</p> <p class="content"><span class="bold">1.义齿特点</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">1.义齿特点</span></p> <p class="content">(1)不稳定性:义齿沿支点线(直接固位体的连线)和回转线可能表现出不稳定性(下沉、翘起、摆动、旋转等)。</p> <p class="content">(2)潜在的基牙损害:设计的不稳定性和基牙承受的压力,导致基牙容易受扭力。长此以往,可能会出现牙齿松动或牙根损伤等基牙受损害现象。</p> <p class="content"> (3)游离鞍基下的软组织创伤、牙槽骨吸收:游离鞍基下的软组织(即缺失牙区的黏膜)可能会受到来自义齿的持续压力,导致创伤;同时在游离端没有适当的支撑区域,更容易发生牙槽骨吸收,导致义齿下沉加重。 </p> <p class="content"><span class="bold">2.设计要点</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">2.设计要点</span></p> <p class="content">(1)提高稳定性</p> <p class="content">1)下沉:制取功能性印模,适当增大基托面积,游离端义齿可保留牙根或植入种植体,人工牙减数或减小近远中径,重衬(需设计树脂基托,多用于义齿下沉加重时)。</p> <p class="content">2)翘起:在支点的平衡侧放置间接固位体,肯氏Ⅰ类平衡侧的间接固位体基牙通常为前牙(尖牙为首选基牙,切牙在满足固位稳定要求下尽量不做设计)。</p> <p class="content">3)摆动:牙弓对侧增设固位体,双侧联合设计,实现跨弓稳定;降低牙尖斜度,减小侧向力。</p> <p class="content">4)旋转:加宽<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托,减小人工牙颊舌径,设置舌侧高基托。</p> <p class="content">4)旋转:加宽𬌗支托,减小人工牙颊舌径,设置舌侧高基托。</p> <p class="content">(2)减小基牙所受扭力</p> <p class="content">1)设置近中<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托:与远中<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托相比,加大了转动半径,对基牙扭力小;采用近中<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托则基牙向近中倾斜,近中有邻牙支持,使基牙受力减少或被抵消;同时因支点位置在基牙远中,也可以中断或减小基牙远中所受应力。</p> <p class="content"> 1)设置近中𬌗支托:与远中𬌗支托相比,加大了转动半径,对基牙扭力小;采用近中𬌗支托则基牙向近中倾斜,近中有邻牙支持,使基牙受力减少或被抵消;同时因支点位置在基牙远中,也可以中断或减小基牙远中所受应力。 </p> <p class="content">2)应力中断式设计:如设置组合式卡环、回力卡环等。</p> <p class="content">3)采用具有一定弹性的弯制卡环,使义齿在咀嚼压力下能够轻微移动,从而分散对基牙的扭力。</p> <p class="content">(3)防止软组织创伤和牙槽骨吸收</p> @@ -277,29 +314,34 @@ <div class="bodystyle"> <h3 class="thirdTitle">三、任务案例的支架设计</h3> <p class="content">本任务的案例信息说明了患者余留牙和口腔软组织状况良好,据此可以将此案例作混合支持式义齿设计,在设计中要充分保护牙槽骨和基牙。下面是具体的支架设计。</p> <p class="content"><span class="bold">1.设计直接固位体</span></p> <p class="content"><span class="bold fontGreen">1.设计直接固位体</span></p> <p class="content">(1)选择基牙:根据缺牙情况选择右上第二前磨牙、左上尖牙、左上第二前磨牙作为基牙。</p> <p class="content"> (2)直接固位体类型:为使游离端基托下组织受力均匀,减小对基牙的扭力,可对上颌两侧第二前磨牙设计固位、稳定、支持作用良好的组合式RPI、RPA卡环或改良式RPI、RPA卡环组。可对左上尖牙设计专用的尖牙卡环,考虑尖牙位于口角位置,其美观性也要着重考虑,在保证固位良好的情况下,可以在前牙舌侧放置舌隆突支托。 </p> <p class="content"><span class="bold">2.设计间接固位体</span> 基牙左上尖牙上的卡环相当于在支点的平衡侧放置间接固位体,且患者缺牙位置相对对称,双侧三颗基牙均设计了卡环固位体,实现了跨弓稳定性。在兼顾患者美观性、舒适性的情况下,可以不进行间接固位体的放置。 class="bold fontGreen">2.设计间接固位体</span> 基牙左上尖牙上的卡环相当于在支点的平衡侧放置间接固位体,且患者缺牙位置相对对称,双侧三颗基牙均设计了卡环固位体,实现了跨弓稳定性。在兼顾患者美观性、舒适性的情况下,可以不进行间接固位体的放置。 </p> <p class="content"><span class="bold">3.设计连接体</span></p> <p class="content"><span class="bold fontGreen">3.设计连接体</span></p> <p class="content">(1)大连接体:设计为位于上颌两侧第一、第二磨牙之间的后腭杆,呈波浪状,腭杆的中部应力集中区略向前移位至左上第一前磨牙的缺隙位,以平衡作用力。</p> <p class="content"> (2)小连接体:金属塑料结合区的网状小连接体,铸网稍稍超过牙槽嵴顶的颊侧即可,游离端的上颌铸网需达到上颌结节的前部,同时网状支架与树脂基托结合处应设计小于90°的内外终止线。支架设计参考图如图3-1-1所示。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0078-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-1-1 支架设计参考图</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0078-01.jpg" style="width:50%" alt="图3-1-1 支架设计参考图" active="true" /> <p class="imgdescript-b">图3-1-1 支架设计参考图</p> </div> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">功能性印模</span></p> <p class="quotation"> 游离端缺失RPD设计为混合支持式义齿时,通常由于口腔软硬组织的可让性差异较大,导致义齿在使用过程中容易出现义齿不稳定现象,进而容易造成对基牙的损害及对软组织的创伤等情况。因此,在进行游离端缺失RPD修复时,制取功能性印模可以弥补鞍基远中游离端义齿下沉过多的问题。 </p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">功能性印模</span></p> <p class="quotation"> 游离端缺失RPD设计为混合支持式义齿时,通常由于口腔软硬组织的可让性差异较大,导致义齿在使用过程中容易出现义齿不稳定现象,进而容易造成对基牙的损害及对软组织的创伤等情况。因此,在进行游离端缺失RPD修复时,制取功能性印模可以弥补鞍基远中游离端义齿下沉过多的问题。 </p> <p class="quotation"> 功能性印模是在压力状态下取得的印模,主要目的是在制作义齿的模型时提供更加精确的软组织形态,在考虑到肌肉运动的前提下将义齿基托的承托区最大化。其取模过程包括软组织的动态整塑,强调在取印模时的肌肉运动和口腔功能活动,让患者模仿日常咀嚼、说话等口腔活动,使软组织处于自然状态,以确保修复体能够更好地适应患者的口腔环境。 </p> </div> </div> <div class="page-bottom-left">062</div> </div> @@ -313,26 +355,36 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="quotation"> 功能性印模是在压力状态下取得的印模,主要目的是在制作义齿的模型时提供更加精确的软组织形态,在考虑到肌肉运动的前提下将义齿基托的承托区最大化。其取模过程包括软组织的动态整塑,强调在取印模时的肌肉运动和口腔功能活动,让患者模仿日常咀嚼、说话等口腔活动,使软组织处于自然状态,以确保修复体能够更好地适应患者的口腔环境。 </p> <p class="titleQuot-1">【任务评价】</p> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">肯式Ⅰ类支架设计任务评价标准见表3-1-1。</p> <p class="imgtitle">表3-1-1 肯式Ⅰ类支架设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0079-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold">表3-1-1 肯式Ⅰ类支架设计任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0079-01.jpg" style="width:100%;margin-top: -10px;" alt="" active="true" /></div> <h2 class="secondTitle">任务二 肯氏Ⅱ类支架设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content"> 患者,女性,48岁。右下第一前磨牙、右下第二前磨牙、右下第一磨牙、左下第二前磨牙及左下第一、第二磨牙缺失,右下第二磨牙有轻微近中舌倾,其他余留牙齿状况良好,牙周健康,无明显牙周炎或牙齿松动,有稳定的咬合关系和足够的剩余牙齿支持。根据患者口腔组织情况,进行科学合理的活动支架设计。 </p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.肯氏Ⅱ类RPD设计原则基本与肯氏Ⅰ类雷同,针对Ⅱ类复杂的缺牙情况,应该掌握哪些设计要点和方法?</p> <p class="content">2.本病例的RPD支架应当进行什么设计?设计哪些具体的部件?部件应当放在何位置?</p> <div class="CaseStudy"> <div class="CaseStudy-title">任务案例</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content"> 患者,女性,48岁。右下第一前磨牙、右下第二前磨牙、右下第一磨牙、左下第二前磨牙及左下第一、第二磨牙缺失,右下第二磨牙有轻微近中舌倾,其他余留牙齿状况良好,牙周健康,无明显牙周炎或牙齿松动,有稳定的咬合关系和足够的剩余牙齿支持。根据患者口腔组织情况,进行科学合理的活动支架设计。 </p> <p class="titleQuot-1">【问题】</p> <p class="content">1.肯氏Ⅱ类RPD设计原则基本与肯氏Ⅰ类雷同,针对Ⅱ类复杂的缺牙情况,应该掌握哪些设计要点和方法?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.three" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.本病例的RPD支架应当进行什么设计?设计哪些具体的部件?部件应当放在何位置?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.fore" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> </div> <div class="page-bottom-right">063</div> </div> </div> @@ -346,30 +398,31 @@ </div> </div> <div class="bodystyle"> <p class="titleQuot-1">【任务分析】</p> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 肯氏Ⅱ类缺失指单侧远中游离缺失,与肯氏Ⅰ类缺失的义齿特点极为相似,均存在游离端缺牙情况,义齿稳定性差。其义齿特点及设计要点大多可参照肯氏Ⅰ类,但在部分细节设计上有差异。下面聚焦肯氏Ⅱ类的支架设计,针对作为RPD支架设计难点的混合支持式义齿支架展开讲解。 </p> <h3 class="thirdTitle">一、单侧后牙游离缺失,不存在亚类</h3> <p class="content"><span class="bold">1.单侧游离缺失一个后牙</span> 在处理这种情况时,传统的单端活动桥设计存在固位不稳定、单侧受力难以平衡及潜在的误吞风险,因此不推荐这种方案。为增强义齿的固位和稳定性,提升患者的安全性,应当采取双侧联合设计策略。具体而言,可以在牙弓对侧设计间接固位体,并通过大连接体实现跨弓稳定性。这种设计有助于分散咬合力,提高义齿的固位效果。在某些情况下,也可考虑其他类型的义齿修复方案,以满足患者的个体需求。 class="bold fontGreen">1.单侧游离缺失一个后牙</span> 在处理这种情况时,传统的单端活动桥设计存在固位不稳定、单侧受力难以平衡及潜在的误吞风险,因此不推荐这种方案。为增强义齿的固位和稳定性,提升患者的安全性,应当采取双侧联合设计策略。具体而言,可以在牙弓对侧设计间接固位体,并通过大连接体实现跨弓稳定性。这种设计有助于分散咬合力,提高义齿的固位效果。在某些情况下,也可考虑其他类型的义齿修复方案,以满足患者的个体需求。 </p> <p class="content"><span class="bold">2.单侧游离缺失两个或以上后牙</span> 在处理这种情况时,需采用双侧联合设计策略,以确保稳定的跨弓支持和受力平衡。在牙弓对侧设置间接固位体,如间隙卡环或联合卡环,通过大连接体连接,以形成稳固的支点。考虑到缺牙数量少,可设计杆状、带状等大连接体来提高结构的强度和固位效果,同时兼顾患者的美观性和舒适性。 class="bold fontGreen">2.单侧游离缺失两个或以上后牙</span> 在处理这种情况时,需采用双侧联合设计策略,以确保稳定的跨弓支持和受力平衡。在牙弓对侧设置间接固位体,如间隙卡环或联合卡环,通过大连接体连接,以形成稳固的支点。考虑到缺牙数量少,可设计杆状、带状等大连接体来提高结构的强度和固位效果,同时兼顾患者的美观性和舒适性。 </p> <p class="content">此外,应设计并融入近中<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托和远中邻面板等结构,以确保游离基托下软组织的均匀受力,同时减小对基牙的扭力。所以在固位体的选择上,可直接采用组合式卡环,这种设计能够提供直接的固位支持,同时降低对基牙损害的风险。 <p class="content"> 此外,应设计并融入近中𬌗支托和远中邻面板等结构,以确保游离基托下软组织的均匀受力,同时减小对基牙的扭力。所以在固位体的选择上,可直接采用组合式卡环,这种设计能够提供直接的固位支持,同时降低对基牙损害的风险。 </p> <h3 class="thirdTitle">二、单侧后牙游离缺失,存在亚类</h3> <p class="content"><span class="bold">1.单侧后牙游离缺失,对侧后牙存在亚类</span> 针对单侧后牙游离缺失,并且存在对侧亚类缺隙的情况,游离端的设计和双侧联合设计点基本与前述情况一致,但需特别注意对侧亚类缺隙的处理。在该侧,必须选定合适的基牙来放置直接固位体卡环,以增强义齿的稳定性和固位效果。这样可以确保在提供必要支持的同时,减少对牙周组织和基牙可能造成的损伤。连接体根据缺隙大小选定。 class="bold fontGreen">1.单侧后牙游离缺失,对侧后牙存在亚类</span> 针对单侧后牙游离缺失,并且存在对侧亚类缺隙的情况,游离端的设计和双侧联合设计点基本与前述情况一致,但需特别注意对侧亚类缺隙的处理。在该侧,必须选定合适的基牙来放置直接固位体卡环,以增强义齿的稳定性和固位效果。这样可以确保在提供必要支持的同时,减少对牙周组织和基牙可能造成的损伤。连接体根据缺隙大小选定。 </p> <p class="content"><span class="bold">2.单侧后牙游离缺失,对侧后牙、前牙区均存在亚类</span> 在处理这类情况时,在设计中需注意间接固位体的增设,前牙缺隙两旁基牙设置近中邻面板、舌支托等部件,以提供额外的支持并分散应力。此外,大连接体的构造也需要根据上颌或下颌的解剖形态进行适应性调整,如上颌的连接体可能由杆状变为板状,以提供更强的稳定性与更广的分布力点,使得口腔组织受力均匀。在其他设计方面,与单侧后牙游离缺失、对侧后牙存在亚类的情况保持一致,确保整体修复方案的协调性和功能性。 class="bold fontGreen">2.单侧后牙游离缺失,对侧后牙、前牙区均存在亚类</span> 在处理这类情况时,在设计中需注意间接固位体的增设,前牙缺隙两旁基牙设置近中邻面板、舌支托等部件,以提供额外的支持并分散应力。此外,大连接体的构造也需要根据上颌或下颌的解剖形态进行适应性调整,如上颌的连接体可能由杆状变为板状,以提供更强的稳定性与更广的分布力点,使得口腔组织受力均匀。在其他设计方面,与单侧后牙游离缺失、对侧后牙存在亚类的情况保持一致,确保整体修复方案的协调性和功能性。 </p> </div> <div class="page-bottom-left">064</div> </div> </div> @@ -388,30 +441,34 @@ </p> <h3 class="thirdTitle">四、任务案例的支架设计</h3> <p class="content">本任务案例信息说明了患者存在单侧游离缺失的情况,为肯氏Ⅱ类一亚类,根据口腔组织情况确定其支持方式为混合式支持,下面进行具体的支架设计。</p> <p class="content"><span class="bold">1.设计直接固位体</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">1.设计直接固位体</span></p> <p class="content">(1)选择基牙:根据缺牙情况选择右下第二磨牙、左下第二前磨牙作为直接固位体基牙。</p> <p class="content"> (2)直接固位体类型:对于基牙右下第二磨牙,考虑到轻微的近中舌倾,可选择圈形卡环以提供固位,同时防止进一步的牙齿移位。对于基牙左下第二前磨牙,由于是远中游离端缺失,可设计为带有近中<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托、远中邻面板的RPI组合式卡环,以提供有效的固位稳定性。 (2)直接固位体类型:对于基牙右下第二磨牙,考虑到轻微的近中舌倾,可选择圈形卡环以提供固位,同时防止进一步的牙齿移位。对于基牙左下第二前磨牙,由于是远中游离端缺失,可设计为带有近中𬌗支托、远中邻面板的RPI组合式卡环,以提供有效的固位稳定性。 </p> <p class="content"><span class="bold">2.设计间接固位体</span> 使用前牙作为间接固位体的基点,可设计双舌杆以增强直接固位体的稳定性,同时提供额外的支托和固位。</p> <div class="qrbodyPic"> <img src="../../assets/images/0081-02.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-2-1 支架设计参考图</p> <div class="txtSurroundRight"> <div class="qrbodyPic"> <img class="openImgBox" src="../../assets/images/0081-02.jpg" style="width:250px" alt="图3-2-1 支架设计参考图" active="true" /> <p class="imgdescript-b">图3-2-1 支架设计参考图</p> </div> <p class="content"><span class="bold fontGreen titleLeftmove">2.设计间接固位体</span> 使用前牙作为间接固位体的基点,可设计双舌杆以增强直接固位体的稳定性,同时提供额外的支托和固位。 </p> <p class="content"><span class="bold fontGreen titleLeftmove">3.设计连接体</span></p> <p class="content">(1)大连接体:设置为双舌杆,既作为间接固位体,又作为大连接体使用。</p> <p class="content"> (2)小连接体:近中𬌗支托的小连接体,将支托与基牙连接,分散咬合力,防止基牙损伤。在缺隙部位设置网状连接体,增强该区域的结构强度,有助于分散咬合压力。支架设计参考图如图3-2-1所示。 </p> </div> <p class="content"><span class="bold">3.设计连接体</span></p> <p class="content">(1)大连接体:设置为双舌杆,既作为间接固位体,又作为大连接体使用。</p> <p class="content">(2)小连接体:近中<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托的小连接体,将支托与基牙连接,分散咬合力,防止基牙损伤。在缺隙部位设置网状连接体,增强该区域的结构强度,有助于分散咬合压力。支架设计参考图如图3-2-1所示。 </p> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">口外扫描术</span></p> <p class="quotation"> 在口腔修复领域,针对游离牙齿缺失并以RPD修复时,通常会采取制取功能性印模的方式,以此有效降低游离端义齿下沉所引发的不良影响。目前,口内扫描术在获取患者处于功能状态下的口腔组织形态信息方面,尚未达到成熟完善的程度。鉴于此,在开展RPD数字支架设计工作时,可以优先选用口外扫描术来获取患者处于功能状态下的口腔数据,从而为后续支架的精准设计与制作提供可靠的数据支撑。 </p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">口外扫描术</span></p> <p class="quotation"> 在口腔修复领域,针对游离牙齿缺失并以RPD修复时,通常会采取制取功能性印模的方式,以此有效降低游离端义齿下沉所引发的不良影响。目前,口内扫描术在获取患者处于功能状态下的口腔组织形态信息方面,尚未达到成熟完善的程度。鉴于此,在开展RPD数字支架设计工作时,可以优先选用口外扫描术来获取患者处于功能状态下的口腔数据,从而为后续支架的精准设计与制作提供可靠的数据支撑。 </p> </div> </div> <div class="page-bottom-right">065</div> </div> @@ -429,23 +486,32 @@ <p class="quotation"> 口外扫描术作为获取口腔数字模型的一项重要技术,其运作原理基于先为患者制取传统的口腔石膏模型,随后借助口外扫描仪对石膏模型进行扫描。此时,口外扫描仪会发射光线(如激光等)并接收其在石膏模型表面反射回来的光线,依据光线的传播时间、反射角度等信息,实现对模型表面各点位置及形态数据的精确测定,最终构建出完整且精准的三维数字模型。 </p> <p class="titleQuot-1">【任务评价】</p> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">肯式Ⅱ类支架设计任务评价标准见表3-2-1。</p> <p class="imgtitle">表3-2-1 肯式Ⅱ类支架设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0082-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold">表3-2-1 肯式Ⅱ类支架设计任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0082-01.jpg" style="width:100%;margin-top: -10px;" alt="" active="true" /></div> <h2 class="secondTitle">任务三 肯氏Ⅲ类支架设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content"> 患者,男,53岁。右上切牙及左上切牙、第二前磨牙、第一磨牙缺失,右上第二前磨牙、第一磨牙有间隙,剩余的天然牙齿状况稳定,无显著牙周病征象或牙齿松动现象。患者具有稳定的咬合关系,并拥有充足的剩余牙齿来提供足够的支持。根据患者口腔组织情况,进行科学合理的活动支架设计。 </p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.肯氏Ⅲ类RPD的支持方式一般为牙支持,针对Ⅲ类不同的缺牙情况,应该掌握哪些设计要点和方法?</p> <p class="content">2.本病例的RPD支架应当进行什么设计?设计哪些具体的部件?部件应当放在何位置?</p> <div class="CaseStudy"> <div class="CaseStudy-title">任务案例</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content"> 患者,男,53岁。右上切牙及左上切牙、第二前磨牙、第一磨牙缺失,右上第二前磨牙、第一磨牙有间隙,剩余的天然牙齿状况稳定,无显著牙周病征象或牙齿松动现象。患者具有稳定的咬合关系,并拥有充足的剩余牙齿来提供足够的支持。根据患者口腔组织情况,进行科学合理的活动支架设计。 </p> <p class="titleQuot-1">【问题】</p> <p class="content">1.肯氏Ⅲ类RPD的支持方式一般为牙支持,针对Ⅲ类不同的缺牙情况,应该掌握哪些设计要点和方法?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.five" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.本病例的RPD支架应当进行什么设计?设计哪些具体的部件?部件应当放在何位置?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.six" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> </div> <div class="page-bottom-left">066</div> </div> @@ -459,7 +525,7 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="titleQuot-1">【任务分析】</p> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 肯氏Ⅲ类义齿缺隙两旁均有天然牙存在,通常设计为牙支持式义齿。与游离端义齿设计相比,基牙所承受的扭力大大减小,且因为义齿前后均有支点,所以能够有效防止义齿在咬合时产生的下沉现象,有效改善义齿的稳定性和功能。 </p> @@ -469,7 +535,7 @@ </p> <h3 class="thirdTitle">二、单侧后牙非游离缺失,存在亚类</h3> <p class="content"><span class="bold">1.单侧后牙非游离缺失,对侧后牙区存在亚类</span> 对于此种缺牙情况,可在对侧也选定合适的基牙来放置直接固位体卡环,形成面式固位,但直接固位体的数目以2~4个为宜,不可过多放置。两侧通过大连接体相连,固位力不足时也可设计尖牙的舌隆突支托。 class="bold fontGreen">1.单侧后牙非游离缺失,对侧后牙区存在亚类</span> 对于此种缺牙情况,可在对侧也选定合适的基牙来放置直接固位体卡环,形成面式固位,但直接固位体的数目以2~4个为宜,不可过多放置。两侧通过大连接体相连,固位力不足时也可设计尖牙的舌隆突支托。 </p> <p class="content"> (1)基牙选择和固位体设计:选择对侧后牙作为基牙,并在这些基牙上设计直接固位体(如卡环),形成面式固位。固位体数量建议以2~4个为宜,太少可能无法提供足够的固位力,而过多则可能增加对基牙和周围牙周组织的负担。 @@ -478,11 +544,11 @@ (2)间接固位体设计:如果固位力不足,可以在尖牙的舌侧隆突处设计辅助支托(舌侧支托),以提高固定桥的稳定性和固位效果。舌侧支托可以提供额外的支持,并帮助分散功能负载。</p> <p class="content">(3)连接体设计:两侧固位体通过一个较大的连接体相连,实现跨牙弓的稳定支持,分散咬合力的同时避免单点受力过大,降低义齿和基牙受损伤的风险。</p> <p class="content"><span class="bold">2.单侧后牙非游离缺失,对侧后牙区、前牙区均存在亚类</span> 针对此类状况,支架设计可借鉴前述肯氏Ⅱ类此类缺牙情况下支架的设计原则,其中游离端的设计需求不适用。 class="bold fontGreen">2.单侧后牙非游离缺失,对侧后牙区、前牙区均存在亚类</span> 针对此类状况,支架设计可借鉴前述肯氏Ⅱ类此类缺牙情况下支架的设计原则,其中游离端的设计需求不适用。 </p> <h3 class="thirdTitle">三、任务案例的支架设计</h3> <p class="content">本任务案例为肯氏Ⅲ类一亚类缺失,行牙支持式义齿设计,下面进行具体设计。</p> <p class="content"><span class="bold">1.设计直接固位体</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">1.设计直接固位体</span></p> <p class="content">(1)选择基牙:根据缺牙情况选择右上尖牙、左上尖牙、第一前磨牙、第二磨牙作为直接固位体基牙。</p> </div> @@ -502,33 +568,45 @@ <p class="content"> (2)直接固位体类型:鉴于基牙左上第一前磨牙及第二磨牙的健康状况较佳、具备良好的支持条件,故可安置圆环形卡环。基于修复体对固位、稳定及支持功能的严格要求,此处可设计为固位、稳定、支持作用良好的三臂卡环。两侧尖牙处于前牙区域,从患者对修复美观性的需求角度出发,应避免出现大面积金属外露的情况。因此,可在缺隙两侧的尖牙上设计舌隆突支托,以此在满足美观需求的同时,确保修复体的功能性与稳定性。 </p> <p class="content"><span class="bold">2.设计间接固位体</span> 采用双侧联合设计方案。鉴于两侧尖牙未设置卡环部件,在此种情况下,义齿的稳定性可能存在一定程度的不足。因此,可在对侧基牙处设计卡环(如间隙卡环或联合卡环),将其作为间接固位体加以运用,以此达成跨弓稳定的效果,确保义齿在行使功能过程中的稳定性和可靠性。 </p> <p class="content"><span class="bold">3.设计连接体</span></p> <p class="content">(1)大连接体:设置为一种能够依据缺隙位置进行灵活调整的变异腭板结构。</p> <p class="content">(2)小连接体:在缺隙部位设置网状连接体,增强该区域的结构强度;同时在前牙缺隙部位设计数量事宜的固位钉。支架设计参考图如图3-3-1所示。</p> <div class="qrbodyPic"> <img src="../../assets/images/0084-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-3-1 支架设计参考图</p> <div class="txtSurroundRight"> <div class="qrbodyPic openImgBox"> <img class="openImgBox" src="../../assets/images/0084-01.jpg" style="width:250px" alt="图3-3-1 支架设计参考图" active="true" /> <p class="imgdescript-b">图3-3-1 支架设计参考图</p> </div> <p class="content"><span class="bold fontGreen titleLeftmove">2.设计间接固位体</span> 采用双侧联合设计方案。鉴于两侧尖牙未设置卡环部件,在此种情况下,义齿的稳定性可能存在一定程度的不足。因此,可在对侧基牙处设计卡环(如间隙卡环或联合卡环),将其作为间接固位体加以运用,以此达成跨弓稳定的效果,确保义齿在行使功能过程中的稳定性和可靠性。 </p> <p class="content"><span class="bold fontGreen titleLeftmove">3.设计连接体</span></p> <p class="content">(1)大连接体:设置为一种能够依据缺隙位置进行灵活调整的变异腭板结构。</p> <p class="content">(2)小连接体:在缺隙部位设置网状连接体,增强该区域的结构强度;同时在前牙缺隙部位设计数量事宜的固位钉。支架设计参考图如图3-3-1所示。</p> </div> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">常用RPD数字支架制作材料</span></p> <p class="quotation">(一)金属材料</p> <p class="quotation"> 1.钴铬合金 强度和硬度较高,抗腐蚀性能良好,流动性佳,能精准复制义齿支架的复杂结构,保证尺寸精度与表面质量;生物相容性较好,只有少数人可能过敏;成本低于其他贵金属,临床应用广泛。</p> <p class="quotation"> 2.钛及钛合金 质轻、密度低、强度适中,具备良好的韧性、抗疲劳性、耐腐蚀性及化学稳定性,能延长义齿寿命,生物相容性佳,适合金属过敏患者。虽然钛的化学活性较高导致加工难度大,但随着数字化加工技术的发展,如3D打印钛合金技术的应用,在一定程度上克服了加工难题,使得其在数字支架制作中的应用日益广泛。 </p> <p class="quotation">3.BPD(Bio-Perfect Dental)材料 通常选用高纯度钛合金或钴铬合金作为基材,经过精密加工而成。钛合金以轻质、高强度和良好的生物相容性著称,钴铬合金则以优异的抗腐蚀性和稳定性而知名。BPD支架具有出色的物理性能,能更好地适应口腔环境,减少对口腔组织的刺激,患者配戴舒适,性价比较高。 </p> <p class="quotation"> 4.维他灵材料 是由钴、铬、钼合金构成的生物合金。其具有高纯度和优良的物理特性,能够抗菌斑、抗着色,且易清洁;生物相容性较好,能长期稳定使用,对人体影响较小;质轻且具有良好的延展性和可调节性,可以提高患者配戴的舒适度,但要考虑患者是否对其成分过敏及价格因素等。 </p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">常用RPD数字支架制作材料</span></p> <p class="quotation">(一)金属材料</p> <p class="quotation"> 1.钴铬合金 强度和硬度较高,抗腐蚀性能良好,流动性佳,能精准复制义齿支架的复杂结构,保证尺寸精度与表面质量;生物相容性较好,只有少数人可能过敏;成本低于其他贵金属,临床应用广泛。 </p> <p class="quotation"> 2.钛及钛合金 质轻、密度低、强度适中,具备良好的韧性、抗疲劳性、耐腐蚀性及化学稳定性,能延长义齿寿命,生物相容性佳,适合金属过敏患者。虽然钛的化学活性较高导致加工难度大,但随着数字化加工技术的发展,如3D打印钛合金技术的应用,在一定程度上克服了加工难题,使得其在数字支架制作中的应用日益广泛。 </p> <p class="quotation">3.BPD(Bio-Perfect Dental)材料 通常选用高纯度钛合金或钴铬合金作为基材,经过精密加工而成。钛合金以轻质、高强度和良好的生物相容性著称,钴铬合金则以优异的抗腐蚀性和稳定性而知名。BPD支架具有出色的物理性能,能更好地适应口腔环境,减少对口腔组织的刺激,患者配戴舒适,性价比较高。 </p> <p class="quotation"> 4.维他灵材料 是由钴、铬、钼合金构成的生物合金。其具有高纯度和优良的物理特性,能够抗菌斑、抗着色,且易清洁;生物相容性较好,能长期稳定使用,对人体影响较小;质轻且具有良好的延展性和可调节性,可以提高患者配戴的舒适度,但要考虑患者是否对其成分过敏及价格因素等。 </p> <p class="quotation">(二)高分子材料</p> <p class="quotation">PMMA(polymethyl methacrylate)材料 在口腔医疗领域具有多方面特性。其透明度佳,外观接近天然牙齿与牙龈组织,能提供自然美学效果;硬度适中,可维持义齿形状,保障口腔组织健康且不影响正常咀嚼咬合功能;易于加工成型,成本较低,适合个性化定制。弊端:部分患者可能对其单体过敏;材料表面易吸附细菌,会增加口腔感染风险;长期使用可能吸水膨胀变形,影响佩戴舒适度与咀嚼功能发挥。因此在临床应用时,医生、患者与技师需充分沟通交流,尽力确保患者获得良好的修复体验。 </p> </div> </div> <div class="page-bottom-left">068</div> </div> </div> @@ -541,25 +619,37 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="quotation">(二)高分子材料</p> <p class="quotation">PMMA(polymethyl methacrylate)材料 在口腔医疗领域具有多方面特性。其透明度佳,外观接近天然牙齿与牙龈组织,能提供自然美学效果;硬度适中,可维持义齿形状,保障口腔组织健康且不影响正常咀嚼咬合功能;易于加工成型,成本较低,适合个性化定制。弊端:部分患者可能对其单体过敏;材料表面易吸附细菌,会增加口腔感染风险;长期使用可能吸水膨胀变形,影响佩戴舒适度与咀嚼功能发挥。因此在临床应用时,医生、患者与技师需充分沟通交流,尽力确保患者获得良好的修复体验。 </p> <p class="titleQuot-1">【任务评价】</p> <p class="content">肯式Ⅲ类支架设计任务评价标准见表3-3-1。</p> <p class="imgtitle">表3-3-1 肯式Ⅲ类支架设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0085-01.jpg" style="width:80%" alt="" active="true" /></div> <h2 class="secondTitle">任务四 肯氏Ⅳ类支架设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content"> 患者,男,57岁。上颌两侧切牙、尖牙、第一前磨牙缺失,剩余的天然牙齿状况稳定,有轻度牙周炎,无明显牙齿松动现象,有稳定的咬合关系和足够的剩余牙齿支持。根据患者口腔组织情况,进行科学合理的活动支架设计。 </p> <p class="content"><span class="bold">【问题】</span></p> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">肯式Ⅲ类支架设计任务评价标准见表3-3-1。</p> <p class="imgtitle bold">表3-3-1 肯式Ⅲ类支架设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0085-01.jpg" style="width:100%;margin-top: -10px;" alt="表3-3-1 肯式Ⅲ类支架设计任务评价标准" active="true" /></div> <h2 class="secondTitle">任务四 肯氏Ⅳ类支架设计</h2> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content"> 患者,男,57岁。上颌两侧切牙、尖牙、第一前磨牙缺失,剩余的天然牙齿状况稳定,有轻度牙周炎,无明显牙齿松动现象,有稳定的咬合关系和足够的剩余牙齿支持。根据患者口腔组织情况,进行科学合理的活动支架设计。 </p> <p class="titleQuot-1">【问题】</p> <p class="content">1.肯氏Ⅳ类的不同数目牙齿缺失有什么特点?与前三类之间有怎样的联系?应掌握哪些设计要点和方法?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.seven" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.本病例的RPD支架应当进行什么设计?设计哪些具体的部件?部件应当放在何位置?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.eight" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> </div> <div class="page-bottom-right">069</div> </div> </div> @@ -573,28 +663,27 @@ </div> </div> <div class="bodystyle"> <p class="content">1.肯氏Ⅳ类的不同数目牙齿缺失有什么特点?与前三类之间有怎样的联系?应掌握哪些设计要点和方法?</p> <p class="content">2.本病例的RPD支架应当进行什么设计?设计哪些具体的部件?部件应当放在何位置?</p> <p class="titleQuot-1">【任务分析】</p> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 肯氏Ⅳ类牙列缺损表现为前部牙连续性缺失且跨过中线,天然牙位于缺隙远中。鉴于其缺牙数量与位置存在差异,相应的支持方式也各不相同,所以在进行支架设计时,必须依据具体情形来考量。需注意,因此类牙列缺损伴有前牙缺失,故在支架设计流程中,不仅要确保实现固位与稳定的功能要求,还需充分兼顾美观性方面的考量。 </p> <h3 class="thirdTitle">一、部分前牙缺失</h3> <p class="content">此时缺牙少,可作牙支持式义齿设计。除却制作铸造支架式RPD外,也可制作弯制支架式RPD和弹性义齿(此处不作介绍),支架设计要点如下。</p> <p class="content"><span class="bold">1.直接固位体设计</span> 可设计为单臂间隙卡环或者联合卡环,放置在前磨牙或磨牙上。</p> <p class="content"><span class="bold fontGreen">1.直接固位体设计</span> 可设计为单臂间隙卡环或者联合卡环,放置在前磨牙或磨牙上。</p> <p class="content"><span class="bold">2.间接固位体设计</span> 可在前牙缺隙部位设计近中邻面板或舌隆突支托,必要时可将两者一起放置在基牙上,增强固位稳定性。</p> <p class="content"><span class="bold">3.连接体设计</span> 选用上下颌适用的连接体即可。</p> class="bold fontGreen">2.间接固位体设计</span> 可在前牙缺隙部位设计近中邻面板或舌隆突支托,必要时可将两者一起放置在基牙上,增强固位稳定性。</p> <p class="content"><span class="bold fontGreen">3.连接体设计</span> 选用上下颌适用的连接体即可。</p> <h3 class="thirdTitle">二、全部前牙缺失</h3> <p class="content">在处理全部前牙缺失的修复方案时,关键在于采用适当的设计原则来应对前牙“近中游离缺失”的特殊情况,此时可参照肯氏Ⅰ类、Ⅱ类游离端义齿的设计原则。支架设计要点如下。 </p> <p class="content"><span class="bold">1.直接固位体设计</span> 前磨牙可优先设置为游离缺失义齿常用的组合式卡环,此时支托应设置在远中保护基牙,也可根据患者口腔组织具体情况选择适宜的卡环种类。 class="bold fontGreen">1.直接固位体设计</span> 前磨牙可优先设置为游离缺失义齿常用的组合式卡环,此时支托应设置在远中保护基牙,也可根据患者口腔组织具体情况选择适宜的卡环种类。 </p> <p class="content"><span class="bold">2.间接固位体设计</span> 考量义齿的固位稳定性情况,可设置常用间接固位体类型,亦可在最远端牙设置卡环作间接固位体使用。需注意缺失牙为前部牙,故卡环的支托部件需设置在基牙远中。 class="bold fontGreen">2.间接固位体设计</span> 考量义齿的固位稳定性情况,可设置常用间接固位体类型,亦可在最远端牙设置卡环作间接固位体使用。需注意缺失牙为前部牙,故卡环的支托部件需设置在基牙远中。 </p> <p class="content"><span class="bold">3.连接体设计</span> 选用上下颌适用的连接体类型,适当分散应力。</p> <p class="content"><span class="bold fontGreen">3.连接体设计</span> 选用上下颌适用的连接体类型,适当分散应力。</p> <h3 class="thirdTitle">三、全部前牙缺失,伴有后牙缺失</h3> <p class="content"> 当全部前牙缺失且伴有后牙缺失时,牙弓前端缺失的牙齿数量越多,“近中游离缺失”现象就越明显。此时,义齿的支持方式可设计为混合支持方式,支架设计可参考肯氏Ⅰ类、Ⅱ类游离缺失义齿的特点及设计要点,设计时需尽量保护患者口腔剩余软硬组织的健康。 @@ -612,32 +701,38 @@ <span class="header-title">项目三 活动义齿修复设计工艺</span> <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <h3 class="thirdTitle">四、任务案例的支架设计</h3> <p class="content">根据本任务案例,此时全部前牙缺失,是明显的“近中游离缺失”现象,进行混合支持式设计,设计要点与Ⅰ类、Ⅱ类游离缺失一致。下面进行具体设计。</p> <p class="content"><span class="bold">1.设计直接固位体</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">1.设计直接固位体</span></p> <p class="content">(1)选择基牙:根据缺牙情况选择上颌两侧第二前磨牙作为直接固位体基牙。</p> <p class="content">(2)直接固位体类型:设计游离端义齿常用的组合式卡环。考虑到前牙美观性,选择RPI卡环组;“近中游离缺失”时,<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托放置在基牙远中,减小基牙所受扭力。</p> <p class="content"><span class="bold">2.设计间接固位体</span> 在最远端牙设计卡环作间接固位体,加大平衡矩,<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托需放在基牙远中。</p> <p class="content"><span class="bold">3.设计连接体</span></p> <p class="content">(1)大连接体:根据上述固位设置,需设计为相连前、后、侧腭杆,将支架各部件连接在一起,并分散咬合力。</p> <p class="content">(2)小连接体:缺隙部位的网状连接体,支托的小连接体。支架设计参考图如图3-4-1所示。</p> <div class="qrbodyPic"> <img src="../../assets/images/0087-03.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-4-1 支架设计参考图</p> <p class="content">(2)直接固位体类型:设计游离端义齿常用的组合式卡环。考虑到前牙美观性,选择RPI卡环组;“近中游离缺失”时,𬌗支托放置在基牙远中,减小基牙所受扭力。</p> <p class="content"><span class="bold fontGreen titleLeftmove">2.设计间接固位体</span> 在最远端牙设计卡环作间接固位体,加大平衡矩,𬌗支托需放在基牙远中。</p> <p class="content"><span class="bold fontGreen titleLeftmove">3.设计连接体</span></p> <div class="txtSurroundRight"> <div class="qrbodyPic openImgBox"> <img class="openImgBox" src="../../assets/images/0087-03.jpg" style="width:250px" alt="图3-4-1 支架设计参考图" active="true" /> <p class="imgdescript-b">图3-4-1 支架设计参考图</p> </div> <p class="content">(1)大连接体:根据上述固位设置,需设计为相连前、后、侧腭杆,将支架各部件连接在一起,并分散咬合力。</p> <p class="content">(2)小连接体:缺隙部位的网状连接体,支托的小连接体。支架设计参考图如图3-4-1所示。</p> <p class="content"> 注:各分类牙齿临床缺失情况复杂,完整精确归纳相对困难,故上述义齿特点、设计要点及细则在分类支架设计中只作参考。任务案例的支架设计只具备参考性,同种缺失牙齿支架设计方式并不唯一。</p> <p class="content">下面以Exocad软件为例,根据以上肯氏各类的义齿特点及支架设计要点进行数字化活动支架设计。</p> </div> <p class="content"> 注:各分类牙齿临床缺失情况复杂,完整精确归纳相对困难,故上述义齿特点、设计要点及细则在分类支架设计中只作参考。任务案例的支架设计只具备参考性,同种缺失牙齿支架设计方式并不唯一。</p> <p class="content">下面以Exocad软件为例,根据以上肯氏各类的义齿特点及支架设计要点进行数字化活动支架设计。</p> <p class="poemtitle-l">(一)建立订单</p> <p class="poemtitle-l kTitle">(一)建立订单</p> <p class="content"> 打开Exocad软件,输入患者基本信息,选择牙齿,设计内容为“活动支架”,材料选择“3D打印”,进行信息保存,完成订单建立。选择右侧操作菜单中的“设计活动支架”进入设计页面(图3-4-2)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0087-04.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图3-4-2 建立订单界面</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0087-04.jpg" style="width:70%" alt="图3-4-2 建立订单界面" active="true" /> <p class="imgdescript-b">图3-4-2 建立订单界面</p> </div> </div> @@ -654,24 +749,24 @@ </div> </div> <div class="bodystyle"> <p class="poemtitle-l">(二)导入数据</p> <p class="poemtitle-l kTitle">(二)导入数据</p> <p class="content"> 导入患者的扫描数据(图3-4-3),为STL格式。检查数据有无错层、重影现象,咬合关系是否准确,基牙及唇颊、舌腭侧是否扫描完整且无变形。检查过程中可使用快捷键,如Ctrl+D显示咬合空间、Ctrl+R显示空间尺等。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0088-01.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0088-01.jpg" style="width:75%" alt="" active="true" /> <p class="imgdescript">图3-4-3 导入数据</p> </div> <p class="poemtitle-l">(三)模型观测</p> <p class="poemtitle-l kTitle">(三)模型观测</p> <p class="content"><span class="bold">1.确定就位道</span> 通过数字模型分析患者口腔组织情况。一般从咬合面方向查看模型定位、模型方向,需要查看倒凹颜色所表示的倒凹深度点击“设置”选项,移动模型来调整倒凹大小。向前旋转模型增加近中侧倒凹深度,向后倾倒模型增加远中侧倒凹深度。第二点击“视图方向设置”来设置就位方向并查看倒凹的更改,可使用快捷键F6~F9更改辅助视图窗口中不同视图方向,确定模型的倒凹分布情况,最终确定义齿的最优就位道方向(图3-4-4)。 class="bold fontGreen titleLeftmove">1.确定就位道</span> 通过数字模型分析患者口腔组织情况。一般从咬合面方向查看模型定位、模型方向,需要查看倒凹颜色所表示的倒凹深度点击“设置”选项,移动模型来调整倒凹大小。向前旋转模型增加近中侧倒凹深度,向后倾倒模型增加远中侧倒凹深度。第二点击“视图方向设置”来设置就位方向并查看倒凹的更改,可使用快捷键F6~F9更改辅助视图窗口中不同视图方向,确定模型的倒凹分布情况,最终确定义齿的最优就位道方向(图3-4-4)。 </p> <p class="content"><span class="bold">2.填补倒凹</span> 调整合适的倒凹填充角度,角度越大,义齿在倒凹区离开天然牙或黏膜就越多,义齿就越容易就位。倒凹填除角度可以通过点击箭头或输入数值来更改,角度可设置为3º~5º,可根据模型进行适当调整。然后点击“下一步”,软件将自动填除倒凹。 class="bold fontGreen titleLeftmove">2.填补倒凹</span> 调整合适的倒凹填充角度,角度越大,义齿在倒凹区离开天然牙或黏膜就越多,义齿就越容易就位。倒凹填除角度可以通过点击箭头或输入数值来更改,角度可设置为3º~5º,可根据模型进行适当调整。然后点击“下一步”,软件将自动填除倒凹。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0088-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图3-4-4 确定就位道</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0088-02.jpg" style="width:75%" alt="图3-4-4 确定就位道" active="true" /> <p class="imgdescript-b">图3-4-4 确定就位道</p> </div> </div> @@ -688,26 +783,31 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">3.确定卡环放置部位,去除多余倒凹蜡</span> 使用蜡型雕刻工具进行刮蜡处理,通过点击并按住鼠标左键移除倒凹填除蜡。按住Shift键并滚动鼠标滑轮可调整工具大小,按住Ctrl键并滚动鼠标滑轮可调整蜡型硬度。此外,还可以使用向导中的相应滑动条来更改移除蜡型影响区域和蜡质硬度;若需撤销上一个操作,可使用快捷键Ctrl+Z。 class="bold fontGreen">3.确定卡环放置部位,去除多余倒凹蜡</span> 使用蜡型雕刻工具进行刮蜡处理,通过点击并按住鼠标左键移除倒凹填除蜡。按住Shift键并滚动鼠标滑轮可调整工具大小,按住Ctrl键并滚动鼠标滑轮可调整蜡型硬度。此外,还可以使用向导中的相应滑动条来更改移除蜡型影响区域和蜡质硬度;若需撤销上一个操作,可使用快捷键Ctrl+Z。 </p> <p class="content"><span class="bold">4.缓冲区处理</span> 如有需要可以在腭侧或尖锐区域,如上颌结节、骨尖等区域进行缓冲处理。缓冲处理要应用额外填除蜡,在向导菜单中选择“平滑”,再选择“平滑添加”选项,模型缺损或气泡也可在此步骤处理(图3-4-5、图3-4-6)。 class="bold fontGreen">4.缓冲区处理</span> 如有需要可以在腭侧或尖锐区域,如上颌结节、骨尖等区域进行缓冲处理。缓冲处理要应用额外填除蜡,在向导菜单中选择“平滑”,再选择“平滑添加”选项,模型缺损或气泡也可在此步骤处理(图3-4-5、图3-4-6)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0089-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-4-5 填补倒凹</p> <div class="imgFloat"> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0089-01.jpg" style="width:90%" alt="图3-4-5 填补倒凹" active="true" /> <p class="imgdescript-b">图3-4-5 填补倒凹</p> </div> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0089-02.jpg" style="width:90%" alt="图3-4-6 去除多余倒凹蜡" active="true" /> <p class="imgdescript-b">图3-4-6 去除多余倒凹蜡</p> </div> </div> <div class="qrbodyPic"> <img src="../../assets/images/0089-02.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-4-6 去除多余倒凹蜡</p> </div> <p class="poemtitle-l">(四)绘制大连接体和蜡网</p> <p class="poemtitle-l kTitle">(四)绘制大连接体和蜡网</p> <p class="content"><span class="bold">1.绘制蜡网</span> 使用曲线工具绘制大连接体和蜡网所放置的位置。选取所需形式的固位网,点击“绘制新曲线”(图3-4-7),在缺隙区牙槽嵴处逐点绘制大连接体和蜡网,或用快速编辑连续绘制曲线,完成绘制时双击形成闭合曲线,蜡网和大连接体需重叠相连。需注意,绘制时蜡网的唇颊侧不可过度延伸导致影响牙齿排列,舌侧可进行适当延伸,但范围不可过大。绘制完成时可进行蜡网预览(图3-4-8),如需更改蜡网的方向,可单击并旋转箭头中间的控制点;移动蜡网可点击箭头交叉中心,按鼠标左键拖动网格进行移动。 class="bold fontGreen">1.绘制蜡网</span> 使用曲线工具绘制大连接体和蜡网所放置的位置。选取所需形式的固位网,点击“绘制新曲线”(图3-4-7),在缺隙区牙槽嵴处逐点绘制大连接体和蜡网,或用快速编辑连续绘制曲线,完成绘制时双击形成闭合曲线,蜡网和大连接体需重叠相连。需注意,绘制时蜡网的唇颊侧不可过度延伸导致影响牙齿排列,舌侧可进行适当延伸,但范围不可过大。绘制完成时可进行蜡网预览(图3-4-8),如需更改蜡网的方向,可单击并旋转箭头中间的控制点;移动蜡网可点击箭头交叉中心,按鼠标左键拖动网格进行移动。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0089-03.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-4-7 绘制蜡网曲线</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0089-03.jpg" style="width:60%" alt="图3-4-7 绘制蜡网曲线" active="true" /> <p class="imgdescript-b">图3-4-7 绘制蜡网曲线</p> </div> </div> @@ -724,24 +824,30 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0090-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-4-8 更改蜡网方向</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0090-01.jpg" style="width:70%" alt="图3-4-8 更改蜡网方向" active="true" /> <p class="imgdescript-b">图3-4-8 更改蜡网方向</p> </div> <p class="content"><span class="bold">2.绘制大连接体</span> 按照前述大连接体设计进行数字大连接体的绘制。大连接体与蜡网相衔接部分需要重叠连接,细微调整后可生成蜡网和大连接体。对于上颌设计,大连接体曲线要确保为封闭曲线,需空心设计时在大连接体曲线内绘制另一条闭合曲线即可(图3-4-9~图3-4-11)。 class="bold fontGreen">2.绘制大连接体</span> 按照前述大连接体设计进行数字大连接体的绘制。大连接体与蜡网相衔接部分需要重叠连接,细微调整后可生成蜡网和大连接体。对于上颌设计,大连接体曲线要确保为封闭曲线,需空心设计时在大连接体曲线内绘制另一条闭合曲线即可(图3-4-9~图3-4-11)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0090-02.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-4-9 绘制大连接体曲线</p> <div class="imgFloat"> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0090-02.jpg" style="width:90%" alt="图3-4-9 绘制大连接体曲线" active="true" /> <p class="imgdescript-b">图3-4-9 绘制大连接体曲线</p> </div> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0090-03.jpg" style="width:90%" alt="图3-4-10 绘制大连接体空心设计曲线" active="true" /> <p class="imgdescript-b">图3-4-10 绘制大连接体空心设计曲线</p> </div> </div> <div class="qrbodyPic"> <img src="../../assets/images/0090-03.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript-l">图3-4-10 绘制大连接体空心设计曲线</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0090-04.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图3-4-11 应用蜡网、大连接体</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0090-04.jpg" style="width:75%" alt="图3-4-11 应用蜡网、大连接体" active="true" /> <p class="imgdescript-b">图3-4-11 应用蜡网、大连接体</p> </div> </div> @@ -757,35 +863,33 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="poemtitle-l">(五)绘制卡环</p> <p class="poemtitle-l kTitle">(五)绘制卡环</p> <p class="content"><span class="bold">1.绘制卡环曲线</span> 点击“绘制新曲线”,从卡环的起点到终点绘制卡环曲线,双击完成曲线绘制,卡环曲线为开放曲线(图3-4-12)。可以在绘制曲线时通过单击并拖动某个点直接更改位置和形态,也可在下一步创建卡环时进行更改。绘制不同基牙的卡环时需选择相应的卡环形态,比如“卡环-磨牙”“卡环-前磨牙”等,每个卡环的宽度在“菜单”中可进行单独调整,完成后点击“应用”(图3-4-13)。 class="bold fontGreen">1.绘制卡环曲线</span> 点击“绘制新曲线”,从卡环的起点到终点绘制卡环曲线,双击完成曲线绘制,卡环曲线为开放曲线(图3-4-12)。可以在绘制曲线时通过单击并拖动某个点直接更改位置和形态,也可在下一步创建卡环时进行更改。绘制不同基牙的卡环时需选择相应的卡环形态,比如“卡环-磨牙”“卡环-前磨牙”等,每个卡环的宽度在“菜单”中可进行单独调整,完成后点击“应用”(图3-4-13)。 </p> <p class="content"><span class="bold">2.调整参数</span> 点击“设置”选项,更改数据,点击“应用”。</p> <div class="qrbodyPic"> <img src="../../assets/images/0091-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-4-12 绘制卡环曲线</p> <p class="content"><span class="bold fontGreen">2.调整参数</span> 点击“设置”选项,更改数据,点击“应用”。</p> <div class="imgFloat"> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0091-01.jpg" style="width:90%" alt="图3-4-12 绘制卡环曲线" active="true" /> <p class="imgdescript-b">图3-4-12 绘制卡环曲线</p> </div> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0091-02.jpg" style="width:90%" alt="图3-4-13 应用卡环" active="true" /> <p class="imgdescript-b">图3-4-13 应用卡环</p> </div> </div> <div class="qrbodyPic"> <img src="../../assets/images/0091-02.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-4-13 应用卡环</p> </div> <p class="poemtitle-l">(六)填充蜡(克隆)</p> <p class="content">使用克隆工具将精确厚度的蜡添加到耐火模型的表面,包含<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托、舌支托、小连接体、大连接体、蜡网五个模块。</p> <p class="content"><span class="bold">1.绘制<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托</span> 向导菜单中的每个预设值都有其默认值和快捷键,<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托的厚度参数一般为1.0~1.5mm,在基牙近远中边缘上绘制圆三角形<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托(图3-4-14)。<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托的制作要求:厚度为1.0~1.5mm,且越靠近<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />缘越宽、越厚,但其厚度不能影响咬合;前磨牙<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托长度为近远中径的1/3,宽度为颊舌径的1/2;磨牙<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托长度为磨牙的1/4,宽度为颊舌径的1/3。舌支托的绘制同<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托(图3-4-15)。</p> <div class="qrbodyPic"> <img src="../../assets/images/0091-12.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript-l">图3-4-14 绘制<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托</p> <p class="poemtitle-l kTitle">(六)填充蜡(克隆)</p> <p class="content">使用克隆工具将精确厚度的蜡添加到耐火模型的表面,包含𬌗支托、舌支托、小连接体、大连接体、蜡网五个模块。</p> <p class="content"><span class="bold fontGreen">1.绘制𬌗支托</span> 向导菜单中的每个预设值都有其默认值和快捷键,<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />支托的厚度参数一般为1.0~1.5mm,在基牙近远中边缘上绘制圆三角形𬌗支托(图3-4-14)。𬌗支托的制作要求:厚度为1.0~1.5mm,且越靠近𬌗缘越宽、越厚,但其厚度不能影响咬合;前磨牙𬌗支托长度为近远中径的1/3,宽度为颊舌径的1/2;磨牙𬌗支托长度为磨牙的1/4,宽度为颊舌径的1/3。舌支托的绘制同𬌗支托(图3-4-15)。 </p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0091-12.jpg" style="width:70%" alt="图3-4-14 绘制𬌗支托" active="true" /> <p class="imgdescript-b">图3-4-14 绘制𬌗支托</p> </div> </div> <div class="page-bottom-right">075</div> @@ -801,23 +905,26 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0092-01.jpg" style="width:50%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0092-01.jpg" style="width:70%" alt="图3-4-15 绘制舌支托" active="true" /> <p class="imgdescript">图3-4-15 绘制舌支托</p> </div> <p class="content"><span class="bold">2.绘制小连接体、终止线</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">2.绘制小连接体、终止线</span></p> <p class="content"> (1)绘制小连接体:支托绘制完成后,可点击“小连接体”,自行调整工具尺寸,在卡环与蜡网之间绘制小连接体进行连接,下一步为绘制完成线,可以点击右侧列表的高级模式,选择编辑蜡型,对邻面板、卡环等位置进行光滑处理,使支架变得光滑圆顺(图3-4-16)。 </p> <p class="content"> (2)绘制终止线:小连接体绘制完成之后,点击“向导”,进行终止线的绘制。绘制外终止线时参考内终止线的位置,与之保持约2mm的距离,形成移行的加强带。若需更改终止线方向,右键点击终止线,可以使用控制箭头来更改完成线的角度(图3-4-17)。完成之后,点击“下一步”。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0092-02.jpg" style="width:50%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0092-02.jpg" style="width:70%" alt="图3-4-16 绘制小连接体" active="true" /> <p class="imgdescript">图3-4-16 绘制小连接体</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0092-03.jpg" style="width:50%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0092-03.jpg" style="width:70%" alt="图3-4-17 绘制终止线" active="true" /> <p class="imgdescript">图3-4-17 绘制终止线</p> </div> @@ -833,27 +940,34 @@ <span class="header-title">项目三 活动义齿修复设计工艺</span> <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="poemtitle-l">(七)编辑数字蜡型</p> <p class="content"> 在编辑蜡型或自由造型步骤,对支架蜡型设计进行平滑和微调。蜡型自由造型有四种操作可供选择:“融合”“平滑”“平滑添加”“平滑移除”。“1”“2”快捷键可直接激活“增加/减少”“光滑/平整”图标进行应用。如要进行自由造型支架组织面部分,需勾选“隐藏倒凹填除蜡和耐火模型”,可以更好地处理垂直区域、舌板、邻接区域。在自由蜡型过程中,需将各个部件衔接部分和邻面区域的锐利边缘处理光滑,使得支架边缘呈连续圆滑的曲线,同时填平内终止线处支架表面不平整的区域,避免放置外终止线时形成皱褶(图3-4-18)。完成操作后点击“下一步”。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0093-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图3-4-18 编辑数字蜡型</p> <p class="poemtitle-l kTitle">(七)编辑数字蜡型</p> <div class="txtSurroundRight"> <div class="qrbodyPic openImgBox"> <img class="openImgBox" src="../../assets/images/0093-01.jpg" style="width: 300px;height: 160px;" alt="" active="true" /> <p class="imgdescript">图3-4-18 编辑数字蜡型</p> </div> <p class="content"> 在编辑蜡型或自由造型步骤,对支架蜡型设计进行平滑和微调。蜡型自由造型有四种操作可供选择:“融合”“平滑”“平滑添加”“平滑移除”。“1”“2”快捷键可直接激活“增加/减少”“光滑/平整”图标进行应用。如要进行自由造型支架组织面部分,需勾选“隐藏倒凹填除蜡和耐火模型”,可以更好地处理垂直区域、舌板、邻接区域。在自由蜡型过程中,需将各个部件衔接部分和邻面区域的锐利边缘处理光滑,使得支架边缘呈连续圆滑的曲线,同时填平内终止线处支架表面不平整的区域,避免放置外终止线时形成皱褶(图3-4-18)。完成操作后点击“下一步”。 </p> </div> <p class="poemtitle-l">(八)绘制支撑杆</p> <p class="poemtitle-l kTitle">(八)绘制支撑杆</p> <p class="content"> 点击界面最右侧的“高级模式”,选择附件工具中的“支撑杆”,通过在蜡型设计上设置两个点来创建支撑杆,一般在义齿跨度较长的部位需要增加支撑杆,防止支架在制作过程发生变形移位。完成之后可用蜡型雕刻工具再次对蜡型表面进行处理,使各部件移行、光滑(图3-4-19)。外终止线与连接体结合处,以及终止线末端与邻面板结合处均应平滑过渡。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0093-02.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0093-02.jpg" style="width:75%" alt="图3-4-19 绘制、应用支撑杆" active="true" /> <p class="imgdescript">图3-4-19 绘制、应用支撑杆</p> </div> <p class="poemtitle-l">(九)添加附件</p> <p class="poemtitle-l kTitle">(九)添加附件</p> <p class="content">根据设计需要安放相应部件。</p> <p class="content"><span class="bold">1.固位珠</span> 点击屏幕右上角的“高级模式”,选择“曲线”工具,在需要覆盖固位珠的区域绘制闭合曲线,其他牙齿重复此操作,完成后点击“应用”(图3-4-20)。 class="bold fontGreen">1.固位珠</span> 点击屏幕右上角的“高级模式”,选择“曲线”工具,在需要覆盖固位珠的区域绘制闭合曲线,其他牙齿重复此操作,完成后点击“应用”(图3-4-20)。 </p> </div> @@ -870,23 +984,26 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0094-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图3-4-20 绘制、应用固位珠</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0094-01.jpg" style="width:80%" alt="图3-4-20 绘制、应用固位珠" active="true" /> <p class="imgdescript-b">图3-4-20 绘制、应用固位珠</p> </div> <p class="content"><span class="bold">2.固位钉</span> 在缺隙部位放置适宜数量的固位钉,加强人工牙与支架的连接。添加固位钉时选择“添加固位钉”工具,点击放置固位钉,通过单击并拖动底部控制点来确定固位钉的位置,用顶部控制点更改固位钉角度,厚度和长度可以在底部菜单中进行更改(图3-4-21)。完成后点击“应用”,其他位置重复此操作(图3-4-22)。 class="bold fontGreen">2.固位钉</span> 在缺隙部位放置适宜数量的固位钉,加强人工牙与支架的连接。添加固位钉时选择“添加固位钉”工具,点击放置固位钉,通过单击并拖动底部控制点来确定固位钉的位置,用顶部控制点更改固位钉角度,厚度和长度可以在底部菜单中进行更改(图3-4-21)。完成后点击“应用”,其他位置重复此操作(图3-4-22)。 </p> <p class="content"><span class="bold">3.浮雕</span> 文字和图像可通过选择“浮雕”选项进行添加,如患者姓名、病例号、公司Logo、个性化签名等,可以设计为“凸起”或“凹陷”。完成后点击“应用”,其他添加重复此操作(图3-4-23)。 class="bold fontGreen">3.浮雕</span> 文字和图像可通过选择“浮雕”选项进行添加,如患者姓名、病例号、公司Logo、个性化签名等,可以设计为“凸起”或“凹陷”。完成后点击“应用”,其他添加重复此操作(图3-4-23)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0094-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图3-4-21 应用固位钉</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0094-02.jpg" style="width:80%" alt="图3-4-21 应用固位钉" active="true" /> <p class="imgdescript-b">图3-4-21 应用固位钉</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0094-03.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图3-4-22 调整固位钉</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0094-03.jpg" style="width:80%" alt="图3-4-22 调整固位钉" active="true" /> <p class="imgdescript-b">图3-4-22 调整固位钉</p> </div> </div> @@ -902,34 +1019,39 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0095-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图3-4-23 制作浮雕</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0095-01.jpg" style="width:80%" alt="图3-4-23 制作浮雕" active="true" /> <p class="imgdescript-b">图3-4-23 制作浮雕</p> </div> <p class="poemtitle-l">(十)保存数据,完成设计</p> <p class="poemtitle-l kTitle">(十)保存数据,完成设计</p> <p class="content">输出数据,关闭软件并保存场景文件,完成活动支架设计(图3-4-24)。</p> <div class="qrbodyPic"> <img src="../../assets/images/0095-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图3-4-24 保存数据</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0095-02.jpg" style="width:80%" alt="图3-4-24 保存数据" active="true" /> <p class="imgdescript-b">图3-4-24 保存数据</p> </div> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">RPD数字支架打印</span></p> <p class="quotation">RPD数字支架打印主要依托3D打印技术实现,其操作流程通常如下。</p> <p class="quotation"> 1.口腔数据获取 可采用口内扫描仪直接获取患者口腔的三维数字化数据,也可通过传统取模后利用模型扫描仪对石膏模型进行口外扫描,这些数据为后续的设计制作提供关键基础。</p> <p class="quotation"> 2.数据传输和RPD支架CAD设计 获取数据后,将其传输至专业的支架设计软件,进行基于CAD的RPD支架设计。在完成设计并对模型进行优化后,把RPD支架数字模型文件导入切片软件,在软件中作切片处理。 </p> <p class="quotation"> 3.打印准备 依据支架的结构特点、性能需求等因素,精确选择适配的打印材料。同时,根据打印材料特性及支架打印要求,挑选合适的3D打印机并进行全面调试,确保打印机的各项参数,如喷头温度、打印速度、挤出量等均符合打印标准。 </p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">RPD数字支架打印</span></p> <p class="quotation">RPD数字支架打印主要依托3D打印技术实现,其操作流程通常如下。</p> <p class="quotation"> 1.口腔数据获取 可采用口内扫描仪直接获取患者口腔的三维数字化数据,也可通过传统取模后利用模型扫描仪对石膏模型进行口外扫描,这些数据为后续的设计制作提供关键基础。</p> <p class="quotation"> 2.数据传输和RPD支架CAD设计 获取数据后,将其传输至专业的支架设计软件,进行基于CAD的RPD支架设计。在完成设计并对模型进行优化后,把RPD支架数字模型文件导入切片软件,在软件中作切片处理。 </p> <p class="quotation"> 3.打印准备 依据支架的结构特点、性能需求等因素,精确选择适配的打印材料。同时,根据打印材料特性及支架打印要求,挑选合适的3D打印机并进行全面调试,确保打印机的各项参数,如喷头温度、打印速度、挤出量等均符合打印标准。 </p> <p class="quotation"> 4.3D打印 准备工作就绪后,将切片软件生成的打印文件传输至3D打印机。打印机随即按照预设的精确打印路径和参数开始打印作业。在打印过程中,操作人员需全程实时监控,密切关注喷头是否能够稳定、精准地挤出材料,打印平台是否保持平稳移动,以及模型的打印进度和质量状况等事项。一旦发现打印过程中出现诸如材料堵塞、打印错位、层间结合不良等问题,应及时采取相应的专业解决措施,最大限度避免打印失败,减少材料损耗与时间浪费。 </p> <p class="quotation">5.后处理 打印结束后,对打印完成的支架模型进行一系列后处理操作,如去除支撑结构、打磨抛光、质量检测等。最终完成RPD数字支架打印。</p> </div> </div> <div class="page-bottom-right">079</div> </div> </div> <!-- Page 86 (偶数页) --> <div class="page-box" page="86"> <div v-if="showPageList.indexOf(86) > -1"> @@ -939,35 +1061,155 @@ </div> </div> <div class="bodystyle"> <p class="quotation"> 4.3D打印 准备工作就绪后,将切片软件生成的打印文件传输至3D打印机。打印机随即按照预设的精确打印路径和参数开始打印作业。在打印过程中,操作人员需全程实时监控,密切关注喷头是否能够稳定、精准地挤出材料,打印平台是否保持平稳移动,以及模型的打印进度和质量状况等事项。一旦发现打印过程中出现诸如材料堵塞、打印错位、层间结合不良等问题,应及时采取相应的专业解决措施,最大限度避免打印失败,减少材料损耗与时间浪费。 </p> <p class="quotation">5.后处理 打印结束后,对打印完成的支架模型进行一系列后处理操作,如去除支撑结构、打磨抛光、质量检测等。最终完成RPD数字支架打印。</p> <p class="titleQuot-1">【任务评价】</p> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">肯式Ⅳ类支架设计任务评价标准见表3-4-1。</p> <p class="imgtitle">表3-4-1 肯式Ⅳ类支架设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0096-01.jpg" style="width:80%" alt="" active="true" /></div> <div class="bodyPic"><img src="../../assets/images/0096-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold">表3-4-1 肯式Ⅳ类支架设计任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0096-01.jpg" style="width:100%;margin-top: -10px;" alt="表3-4-1 肯式Ⅳ类支架设计任务评价标准" active="true" /></div> <div class="unitSummary mb-20"> <div class="summary-content"> <div class="summary-content-box" @click="toUrl(getResourceInfo('B12'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目三 考试知识点 可摘一类">项目三 考试知识点 可摘一类</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B9'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目三 考试知识点 可摘二类">项目三 考试知识点 可摘二类</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B10'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目三 考试知识点 可摘三类">项目三 考试知识点 可摘三类</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B11'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目三 考试知识点 可摘四类">项目三 考试知识点 可摘四类</span> </div> </div> </div> <div class="unitSummary"> <div class="summary-content"> <div class="summary-content-box" @click="toUrl(getResourceInfo('C13'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目三 肯氏一类支架设计 小结">项目三 肯氏一类支架设计 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C10'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目三 肯氏二类支架设计 小结">项目三 肯氏二类支架设计 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C11'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目三 肯氏三类支架设计 小结">项目三 肯氏三类支架设计 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C12'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目三 肯氏四类支架设计 小结">项目三 肯氏四类支架设计 小结</span> </div> </div> </div> <div class="knowledgeExpansion"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>题库</span> </div> <div class="knowledgeExpansion-box"> <img src="../../assets/images/tuoZhan.svg" alt="" /> <span @click="openQuestion(getResourceInfo('AA4'))">拓展练习</span> </div> </div> <p class="right-info">(胥玉凤 李文娟)</p> </div> <div class="page-bottom-left">080</div> </div> </div> <preView :md5="p_md5" :pdfTitle="somePdfTitleValue" ref="pdfDialogRef"></preView> <dialogExaminations :cardList="interfaceQuestion" :questionIDList="questionIDList" :page="questionNum" :questionTitle="questionTitleMain" ref="dialogRef"> </dialogExaminations> </div> </template> <script> import preView from "@/components/pdfview/index.vue"; import dialogExaminations from "@/components/dialogExaminations/index.vue"; export default { name: "chapterFour", props: { showPageList: { type: Array, }, getResourceInfo: { type: Function, // 明确指定它是一个函数 required: true, }, interfaceQuestion: { type: Array, required: true, default: () => [], }, }, components: { preView, dialogExaminations, }, data() { return { p_md5: "", somePdfTitleValue: "", // 题目相关 questionNum: 0, questionTitleMain: "", questionIDList: [], questionData: { one: "", two: "", three: "", fore: "", five: "", six: "", seven: "", eight: "" } }; }, mounted() { this.getQuestionData() }, methods: { toUrl(val) { if (val != null) { this.p_md5 = val.md5; this.somePdfTitleValue = val.resourceName; this.$refs.pdfDialogRef.openDialog(); } }, openQuestion(val) { if (val != undefined) { this.questionNum = val.pagination; this.questionTitleMain = val.resourceName; this.questionIDList = val.ids; this.$nextTick(() => { this.$refs.dialogRef.openDialogQuestion(); }); } }, setQuestionData() { localStorage.setItem( "digitalDentalRestorationTechnology-book-chapter04-questionData", JSON.stringify(this.questionData) ); }, getQuestionData() { let questionData = localStorage.getItem("digitalDentalRestorationTechnology-book-chapter04-questionData"); if (questionData) { this.questionData = JSON.parse(questionData); } }, }, } </script> src/books/digitalDentalRestorationTechnology/view/components/chapter005.vue
@@ -9,28 +9,68 @@ </div> <div class="bodystyle"> <h1 class="firstTitle-l">项目四 种植义齿设计工艺</h1> <div class="bodyPic"><img src="../../assets/images/0097-01.jpg" style="width:30%" alt="" active="true" /></div> <div class="bodyPic"><img src="../../assets/images/0017-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">素质目标</span></p> <p class="content">(1)具备严谨的工作态度和实事求是的工作作风,针对种植义齿设计病例给出合理的修复设计思路,保障义齿使用的舒适性和长久性。</p> <p class="content">(2)具备创新学习意识,对难度较大的种植修复病例,以修复为导向,为患者设计个性化肩台、角度肩台,保障义齿的修复效果。</p> <p class="center">........................</p> <p class="center"><span class="bold">知识目标</span></p> <p class="content">(1)掌握:种植基台的基本构成,个性化基台的特点;形态学、美学基本知识;冠桥设计流程;种植导板制作流程。</p> <p class="content">(2)熟悉:氧化锆基台的形式;种植修复冠部设计基本步骤;缺损部位不同类型的种植导板设计要求。</p> <p class="center">........................</p> <p class="content"><span class="bold">能力目标</span></p> <p class="content">(1)能够独立完成种植基台设计。</p> <p class="content">(2)能够独立完成简单牙支持式种植导板的设计。</p> <p class="content">(3)能够完成氧化锆基台设计。</p> <div class="learnGoal"> <img class="learnImg img-h" src="../../assets/images/learnGoal.png" alt="" /> <p class="center learngoalRange"><span class="bold">素质目标</span></p> <p class="content">(1)具备严谨的工作态度和实事求是的工作作风,针对种植义齿设计病例给出合理的修复设计思路,保障义齿使用的舒适性和长久性。</p> <p class="content">(2)具备创新学习意识,对难度较大的种植修复病例,以修复为导向,为患者设计个性化肩台、角度肩台,保障义齿的修复效果。</p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"><span class="bold">知识目标</span></p> <p class="content">(1)掌握:种植基台的基本构成,个性化基台的特点;形态学、美学基本知识;冠桥设计流程;种植导板制作流程。</p> <p class="content">(2)熟悉:氧化锆基台的形式;种植修复冠部设计基本步骤;缺损部位不同类型的种植导板设计要求。</p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"><span class="bold">能力目标</span></p> <p class="content">(1)能够独立完成种植基台设计。</p> <p class="content">(2)能够独立完成简单牙支持式种植导板的设计。</p> <p class="content">(3)能够完成氧化锆基台设计。</p> </div> <div class="knowledgeExpansion"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>教学课件</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A14'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目四 教学课件 种植基台</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A15'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span> 项目四 教学课件 上部冠的设计</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A16'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目四 教学课件 种植螺丝固位桥设计</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A17'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目四 教学课件 数字化手术导板设计</span> </div> </div> <h2 class="secondTitle">任务一 数字化种植个性基台设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">某门诊完成种植手术一期种植钉植入后数月,种植体偏离牙弓方向,舌向倾斜3mm。请完成基台及修复体制作。</p> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">某门诊完成种植手术一期种植钉植入后数月,种植体偏离牙弓方向,舌向倾斜3mm。请完成基台及修复体制作。</p> <p class="titleQuot-1">【问题】</p> <p class="content">1.种植体角度偏离牙弓的基台是什么基台?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.one" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.基台设计最关键的部分是什么?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.two" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">3.常用种植体基台修复材料有哪些?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.three" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> </div> <div class="page-bottom-right">081</div> </div> @@ -45,37 +85,39 @@ </div> </div> <div class="bodystyle"> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.种植体角度偏离牙弓的基台是什么基台?</p> <p class="content">2.基台设计最关键的部分是什么?</p> <p class="content">3.常用种植体基台修复材料有哪些?</p> <p class="titleQuot-1">【任务分析】</p> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 在种植修复时,因患者牙位或个体牙槽骨吸收方向、基牙倾斜方向的不同,成品基台在有些情况下不能满足患者的个性特征。个性化基台可以灵活修正种植角度偏差,正确定位修复体的边缘位置,并获得理想的穿龈轮廓,因此在临床中的应用越来越广泛。个性化基台可以通过研磨、铸造、CAD/CAM等方法进行制作,其中CAD/CAM制造的个性化基台具有研磨和铸造基台不可比拟的优势。 </p> <p class="content">下面以Exocad软件为例,介绍个性化钛基台及氧化锆基台的CAD设计工艺流程。</p> <h3 class="thirdTitle">一、个性化钛基台设计</h3> <p class="content"> 钛基台是由钛合金(又称五级钛或Ti-6Al-4V)制作而成的。钛合金包括6%铝、4%钒、0.25%(最大值)铁、0.2%(最大值)氧,其余成分均为钛。Ti-6Al-4V合金强度明显优于工业纯钛,能提供更高的抗拉强度和抗断裂性能,因此种植修复,尤其是后牙种植修复通常采用钛基台。 </p> <p class="content">钛基台的结构组成可分为种植体连接部分、基台穿龈部分和基台修复连接部分(图4-1-1)。</p> <div class="qrbodyPic"> <img src="../../assets/images/0098-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图4-1-1 钛基台的结构组成</p> <div class="txtSurroundRight"> <div class="qrbodyPic"> <img class="openImgBox" src="../../assets/images/0098-01.jpg" style="width:250px" alt="图4-1-1 钛基台的结构组成" active="true" /> <p class="imgdescript-b">图4-1-1 钛基台的结构组成</p> </div> <p class="content"> 钛基台是由钛合金(又称五级钛或Ti-6Al-4V)制作而成的。钛合金包括6%铝、4%钒、0.25%(最大值)铁、0.2%(最大值)氧,其余成分均为钛。Ti-6Al-4V合金强度明显优于工业纯钛,能提供更高的抗拉强度和抗断裂性能,因此种植修复,尤其是后牙种植修复通常采用钛基台。 </p> <p class="content">钛基台的结构组成可分为种植体连接部分、基台穿龈部分和基台修复连接部分(图4-1-1)。</p> <p class="content"><span class="bold fontGreen">1.扫描或导入数据</span> 扫描方法参考项目一任务二的内容。获得牙颌模型、种植体扫描杆模型和人工牙龈模型整合的种植修复数字模型(图4-1-2)。 </p> </div> <p class="content"><span class="bold">1.扫描或导入数据</span> 扫描方法参考项目一任务二的内容。获得牙颌模型、种植体扫描杆模型和人工牙龈模型整合的种植修复数字模型(图4-1-2)。</p> <p class="content"><span class="bold">2.种植体连接部分设计</span> 运行Exocad设计软件后,首先需要在种植体数据库中选择与扫描数据相对应的扫描杆型号,数据库扫描杆模型为黄色显示,下面连接部分是基台与种植体连接部分的结构(图4-1-3)。扫描数据的扫描杆为绿色显示。 class="bold fontGreen">2.种植体连接部分设计</span> 运行Exocad设计软件后,首先需要在种植体数据库中选择与扫描数据相对应的扫描杆型号,数据库扫描杆模型为黄色显示,下面连接部分是基台与种植体连接部分的结构(图4-1-3)。扫描数据的扫描杆为绿色显示。 </p> <p class="content"> 按软件提示,在扫描模型的扫描杆(绿色)上选择特征面上的一点,软件自动将数据库扫描杆(黄色)与其配准,从而获得种植体的准确位置,并同时得到基台与种植体连接部分的结构位置。</p> </div> <div class="page-bottom-left">082</div> </div> </div> <!-- Page 89 (奇数页) --> <div class="page-box" page="89"> <div v-if="showPageList.indexOf(89) > -1"> @@ -84,8 +126,9 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0099-01.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0099-01.jpg" style="width:75%" alt="图4-1-2 模型导入和选择" active="true" /> <p class="imgdescript-b">图4-1-2 模型导入和选择</p> <p class="imgdescript-l">A.导入模型;B.选择工作模型。</p> </div> @@ -93,7 +136,6 @@ <div class="page-bottom-right">083</div> </div> </div> <!-- Page 90 (偶数页) --> <div class="page-box" page="90"> <div v-if="showPageList.indexOf(90) > -1"> @@ -103,12 +145,13 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0100-01.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0100-01.jpg" style="width:80%" alt="图4-1-3 数据库中选择扫描杆" active="true" /> <p class="imgdescript-b">图4-1-3 数据库中选择扫描杆</p> <p class="imgdescript-l">A.选择模型;B.选择扫描杆。</p> </div> <p class="content"><span class="bold">3.基台穿龈部分设计(图4-1-4)</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">3.基台穿龈部分设计(图4-1-4)</span></p> <p class="content">(1)在人工牙龈模型上勾画牙龈袖口轮廓。</p> <p class="content">(2)调用牙冠数据库对缺失牙位进行预期修复体的设计,设计方法可参考全冠设计。预期修复的效果可以帮助后续确定基台的倾斜角度,判断瓷预留空间。</p> <p class="content">(3)设计基台的边缘位置和穿龈轮廓,通过显示的颜色梯度可以判断穿龈部分与牙龈接触的紧密程度,黄色表示紧密接触,蓝色表示有间隙空间。</p> @@ -127,13 +170,13 @@ </div> <div class="bodystyle"> <p class="content">(4)将预期修复体牙冠与穿龈部分连接在一起(龈缘处自动缝合),使用加减塑形工具对牙冠外形做进一步修整。</p> <div class="qrbodyPic"> <img src="../../assets/images/0101-01.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0101-01.jpg" style="width:75%" alt="图4-1-4 基台穿龈部分设计" active="true" /> <p class="imgdescript-b">图4-1-4 基台穿龈部分设计</p> <p class="imgdescript-l">A.<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面观;B.颊舌面观。</p> <p class="imgdescript-l">A.𬌗面观;B.颊舌面观。</p> </div> <p class="content"><span class="bold">4.基台修复连接部分设计</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">4.基台修复连接部分设计</span></p> <p class="content">(1)观察分析设计好的预期修复体形态,分析方便最终修复体就位的方向,从而设定为基台的就位方向(图4-1-5)。</p> @@ -151,8 +194,9 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0102-01.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0102-01.jpg" style="width:75%" alt="图4-1-5 确定就位道方向" active="true" /> <p class="imgdescript-b">图4-1-5 确定就位道方向</p> <p class="imgdescript-l">A.调整就位方向;B.配准对颌模型。</p> </div> @@ -177,21 +221,22 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0103-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图4-1-6 base+氧化锆基台</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0103-01.jpg" style="width:50%" alt="图4-1-6 base+氧化锆基台" active="true" /> <p class="imgdescript-b">图4-1-6 base+氧化锆基台</p> </div> <p class="content"><span class="bold">1.扫描或导入数据</span> 获得牙颌模型、种植体扫描杆模型和人工牙龈模型整合的种植修复数字模型。订单界面如图4-1-7所示。</p> class="bold fontGreen">1.扫描或导入数据</span> 获得牙颌模型、种植体扫描杆模型和人工牙龈模型整合的种植修复数字模型。订单界面如图4-1-7所示。</p> <p class="content"><span class="bold">2.选择对位种植钛base扫描杆</span> 运行Exocad设计软件后,首先需要在种植数据库中选择相应钛base扫描杆,将其与模型扫描杆进行配准,获得种植钛base的就位信息,并自动获得与钛base相匹配的基台内部尺寸(图4-1-8)。 class="bold fontGreen">2.选择对位种植钛base扫描杆</span> 运行Exocad设计软件后,首先需要在种植数据库中选择相应钛base扫描杆,将其与模型扫描杆进行配准,获得种植钛base的就位信息,并自动获得与钛base相匹配的基台内部尺寸(图4-1-8)。 </p> <p class="content"><span class="bold">3.基台穿龈部分设计</span> 与钛基台穿龈部分设计基本相同。经过提取牙龈袖口轮廓、设计预期修复体、设计基台边缘位置和穿龈轮廓等步骤(图4-1-9、图4-1-10),完成钛base+氧化锆基台穿龈部分的形态设计(图4-1-11)。 class="bold fontGreen">3.基台穿龈部分设计</span> 与钛基台穿龈部分设计基本相同。经过提取牙龈袖口轮廓、设计预期修复体、设计基台边缘位置和穿龈轮廓等步骤(图4-1-9、图4-1-10),完成钛base+氧化锆基台穿龈部分的形态设计(图4-1-11)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0103-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-1-7 氧化锆订单界面</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0103-02.jpg" style="width:75%" alt="" active="true" /> <p class="imgdescript-b">图4-1-7 氧化锆订单界面</p> </div> </div> @@ -208,14 +253,16 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0104-01.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0104-01.jpg" style="width:75%" alt="图4-1-8 数据上传和选择扫描杆" active="true" /> <p class="imgdescript-l-b">图4-1-8 数据上传和选择扫描杆</p> <p class="imgdescript-l">A.上传数据;B.选择扫描杆。</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0104-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-1-9 获取颈缘形态位置</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0104-02.jpg" style="width:75%" alt="图4-1-9 获取颈缘形态位置" active="true" /> <p class="imgdescript-b">图4-1-9 获取颈缘形态位置</p> </div> </div> @@ -231,20 +278,23 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0105-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-1-10 获取钛base的位置</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0105-01.jpg" style="width:75%" alt="图4-1-10 获取钛base的位置" active="true" /> <p class="imgdescript-b">图4-1-10 获取钛base的位置</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0105-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-1-11 穿龈部分设计</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0105-02.jpg" style="width:75%" alt="图4-1-11 穿龈部分设计" active="true" /> <p class="imgdescript-b">图4-1-11 穿龈部分设计</p> </div> <p class="content"><span class="bold">4.基台修复连接部分设计</span> 参考钛基台修复连接部分设计。设计内容包括预期修复体就位方向确定、基台高度和轴面形态设计、对基台外形进行最终的修整等。调整牙冠方向如图4-1-12所示,确定就位方向如图4-1-13所示。后期经数控切削设备加工完成。 class="bold fontGreen">4.基台修复连接部分设计</span> 参考钛基台修复连接部分设计。设计内容包括预期修复体就位方向确定、基台高度和轴面形态设计、对基台外形进行最终的修整等。调整牙冠方向如图4-1-12所示,确定就位方向如图4-1-13所示。后期经数控切削设备加工完成。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0105-03.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-1-12 调整牙冠方向</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0105-03.jpg" style="width:75%" alt="图4-1-12 调整牙冠方向" active="true" /> <p class="imgdescript-b">图4-1-12 调整牙冠方向</p> </div> </div> @@ -261,25 +311,25 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0106-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-1-13 确定就位方向</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0106-01.jpg" style="width:75%" alt="图4-1-13 确定就位方向" active="true" /> <p class="imgdescript-b">图4-1-13 确定就位方向</p> </div> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">种植体与基台的连接方式</span></p> <p class="quotation">种植体与基台通过一定结构连接,其连接方式发挥传递分散<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />力、抗旋转等功能。经过多年发展,连接方式从最初的外连接方式发展到目前常用的内连接方式,在简单平面对接(simple butt joint)的基础上发展出滑配对接(slip-fit)和摩擦对接(friction-fit),包括内六角连接(hexagonal)、内八角连接(octagonal)、六棱柱连接(cylinder hex)、花键连接(spline)、三通道连接(tri-channel)等连接方式。若金属基台肩台高度与临床牙龈边缘高度不匹配,则易出现金属色显露的问题。出于美观要求,除钛、不锈钢等金属材料外,临床也开始应用以氧化锆为代表的瓷基台,以及聚醚醚酮制作的临时基台。已有研究显示,种植体-基台的连接方式、基台材料、基台螺丝的旋入扭矩等因素均可影响种植体-基台微间隙的大小、细菌定植及使螺丝松动,进而影响种植修复效果。 </p> <p class="titleQuot-1">【任务评价】</p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">种植体与基台的连接方式</span></p> <p class="quotation"> 种植体与基台通过一定结构连接,其连接方式发挥传递分散𬌗力、抗旋转等功能。经过多年发展,连接方式从最初的外连接方式发展到目前常用的内连接方式,在简单平面对接(simple butt joint)的基础上发展出滑配对接(slip-fit)和摩擦对接(friction-fit),包括内六角连接(hexagonal)、内八角连接(octagonal)、六棱柱连接(cylinder hex)、花键连接(spline)、三通道连接(tri-channel)等连接方式。若金属基台肩台高度与临床牙龈边缘高度不匹配,则易出现金属色显露的问题。出于美观要求,除钛、不锈钢等金属材料外,临床也开始应用以氧化锆为代表的瓷基台,以及聚醚醚酮制作的临时基台。已有研究显示,种植体-基台的连接方式、基台材料、基台螺丝的旋入扭矩等因素均可影响种植体-基台微间隙的大小、细菌定植及使螺丝松动,进而影响种植修复效果。 </p> </div> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">数字化种植个性基台设计任务评价标准见表4-1-1。</p> <p class="imgtitle">表4-1-1 数字化种植个性基台设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0106-03.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold">表4-1-1 数字化种植个性基台设计任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0106-03.jpg" style="width:100%;margin-top: -10px;" alt="表4-1-1 数字化种植个性基台设计任务评价标准" active="true" /></div> </div> <div class="page-bottom-left">090</div> </div> @@ -294,16 +344,30 @@ </div> <div class="bodystyle"> <h2 class="secondTitle">任务二 种植基台上部冠设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">种植一期修复已完成,口内扫描数据已上传,根据印模数据,在种植基台上设计冠,冠修复体要求做<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面开孔设计。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.种植冠修复的方式有哪些?</p> <p class="content">2.种植冠开孔部位有无具体要求?</p> <p class="content">3.种植冠与解剖冠的设计区别有哪些?</p> <p class="titleQuot-1">【任务分析】</p> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">种植一期修复已完成,口内扫描数据已上传,根据印模数据,在种植基台上设计冠,冠修复体要求做𬌗面开孔设计。</p> <p class="titleQuot-1">【问题】</p> <p class="content">1.种植冠修复的方式有哪些?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.fore" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.种植冠开孔部位有无具体要求?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.five" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">3.种植冠与解剖冠的设计区别有哪些?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.six" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 冠部形态影响牙齿的发音、美观、咀嚼功能,种植体植入后,基台安装完成可获得袖口形态位置,使用CAD技术设计全冠修复体比传统修复更便捷。下面简单介绍种植基台上部冠的设计,为后期种植冠桥设计打下基础,详细参阅项目四任务三。 </p> @@ -327,10 +391,11 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0108-01.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0108-01.jpg" style="width:90%" alt="图4-2-1 基台连接方式" active="true" /> <p class="imgdescript-b">图4-2-1 基台连接方式</p> <p class="imgdescript">A.外连接;B.内连接。</p> <p class="imgdescript-l">A.外连接;B.内连接。</p> </div> <p class="content">外连接的特点如下。</p> <p class="content">(1)基台凸起,但高度受到龈合距离的限制,从而削弱了其防旋转功能。</p> @@ -345,21 +410,18 @@ <p class="content"> Exocad软件订单设置如下:上颌种植基牙选择蜡型回切,种植类型为螺丝固位;种植桥体选择蜡型缺失牙;下颌模型选择对颌牙。订单中褐色表示种植基牙,红色表示蜡型桥体,紫色表示杆卡桥段。选择扫描人工牙龈和对颌模型。 </p> <bookVideo :videoInfo="getResourceInfo('D6')" :BookId="config.activeBook.bookId"></bookVideo> <h3 class="thirdTitle">一、扫描或导入数据</h3> <div class="bodyPic"><img src="../../assets/images/0108-02.jpg" style="width:30%" alt="" active="true" /></div> <p class="content">扫描时要特别注意以下两点,以确保扫描的准确性。</p> <p class="content titleLeftmove">扫描时要特别注意以下两点,以确保扫描的准确性。</p> <p class="content">(1)固定种植模型,保证扫描时稳定。</p> <p class="content">(2)扫描种植体扫描杆时,尽量把所有种植体同时安装上扫描杆,一次完成扫描。</p> <h3 class="thirdTitle">二、种植体连接部分设计</h3> <p class="content"> 运行Exocad设计软件后,首先需要在种植数据库中选择相应种植系统的扫描杆数据,与钛基台设计相同,逐一与模型扫描杆配准,从而自动获得种植体的相应位置,并生成种植体连接部分的形态。</p> </div> <div class="page-bottom-left">092</div> </div> </div> <!-- Page 99 (奇数页) --> <div class="page-box" page="99"> <div v-if="showPageList.indexOf(99) > -1"> @@ -376,22 +438,19 @@ <p class="content">选择软件的回切功能将种植桥美学蜡型的解剖形态进行回切,为饰面瓷预留出足够的空间。然后用软件的加减塑形工具进行精细的外形修整,最终完成螺丝固位桥的外形设计。</p> <h3 class="thirdTitle">六、螺丝孔设计</h3> <p class="content">螺丝的开孔方向是软件根据种植体位置自动生成的,技师可以根据实际需要设定、更改螺丝孔的直径和高度位置。后期经数控切削设备加工完成。</p> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">种植修复体的全冠固位形式</span></p> <p class="quotation"> 螺丝固位指通过一体冠或铸造基台,将修复体与种植体以螺丝形式连接。粘接固位修复体通常先将基台通过螺丝固定于种植体上,加力到一定的扭矩,然后通过粘接剂将基台与冠相连,当前牙的基台穿出位置在唇侧,或后牙基台的穿出位置不在牙冠<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面正中时,临床医生常选择粘接固位。相比于螺丝固位来说,粘接固位的修复体较为美观,但难以维护。混合固位,又称改良版粘接固位或改良版螺丝固位,即为了便于后期维护,在粘接固位的基础上,又增加了螺丝孔。临床上,技师首先在体外将冠与基台通过粘接剂连接起来,再在其上部增加一个螺丝孔,最后由临床医生在口内利用螺丝将冠和基台固定于种植体上。实际上,混合固位形式要求的咬合空间与粘接固位类似,同时也兼具螺丝固位和粘接固位的优缺点,优点如在体外粘接可避免粘接剂的残留、便于维护,缺点如需要满足粘接修复的空间、不美观等。 </p> <p class="titleQuot-1">【任务评价】</p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">种植修复体的全冠固位形式</span></p> <p class="quotation"> 螺丝固位指通过一体冠或铸造基台,将修复体与种植体以螺丝形式连接。粘接固位修复体通常先将基台通过螺丝固定于种植体上,加力到一定的扭矩,然后通过粘接剂将基台与冠相连,当前牙的基台穿出位置在唇侧,或后牙基台的穿出位置不在牙冠𬌗面正中时,临床医生常选择粘接固位。相比于螺丝固位来说,粘接固位的修复体较为美观,但难以维护。混合固位,又称改良版粘接固位或改良版螺丝固位,即为了便于后期维护,在粘接固位的基础上,又增加了螺丝孔。临床上,技师首先在体外将冠与基台通过粘接剂连接起来,再在其上部增加一个螺丝孔,最后由临床医生在口内利用螺丝将冠和基台固定于种植体上。实际上,混合固位形式要求的咬合空间与粘接固位类似,同时也兼具螺丝固位和粘接固位的优缺点,优点如在体外粘接可避免粘接剂的残留、便于维护,缺点如需要满足粘接修复的空间、不美观等。 </p> </div> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">种植基台上部冠的设计任务评价标准见表4-2-1。</p> </div> <div class="page-bottom-right">093</div> </div> </div> <!-- Page 100 (偶数页) --> <div class="page-box" page="100"> <div v-if="showPageList.indexOf(100) > -1"> @@ -401,18 +460,29 @@ </div> </div> <div class="bodystyle"> <p class="imgtitle">表4-2-1 种植基台上部冠的设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0110-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold">表4-2-1 种植基台上部冠的设计任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0110-01.jpg" style="width:100%;margin-top: -10px;" alt="" active="true" /></div> <h2 class="secondTitle">任务三 种植螺丝固位桥设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">接到设计订单,无牙颌患者完成种植一期植入手术,现要求做冠桥修复缺失牙、恢复口腔功能。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.冠桥设计适合哪一类患者?</p> <p class="content">2.冠桥设计包括哪几个关键步骤?</p> <p class="titleQuot-1">【任务分析】</p> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">接到设计订单,无牙颌患者完成种植一期植入手术,现要求做冠桥修复缺失牙、恢复口腔功能。</p> <p class="titleQuot-1">【问题】</p> <p class="content">1.冠桥设计适合哪一类患者?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.seven" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.冠桥设计包括哪几个关键步骤?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.eight" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 使用CAD技术设计个性化基台只是种植设计软件功能的一部分,更主要的应用在于设计种植螺丝固位桥。传统借助铸造技术制作种植螺丝固位桥,由于蜡型变形铸造缺陷等各种问题难以解决,导致制作精度难以控制,达不到种植修复精确被动就位的临床要求,同时不可避免出现金属内部的质量缺陷。而CAD/CAM技术精确、可靠、灵活的特点使得制作符合临床需求的种植螺丝固位桥变得相对容易,极大地促进了螺丝固位技术在临床的广泛应用。 </p> @@ -424,7 +494,6 @@ <div class="page-bottom-left">094</div> </div> </div> <!-- Page 101 (奇数页) --> <div class="page-box" page="101"> <div v-if="showPageList.indexOf(101) > -1"> @@ -433,9 +502,10 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0111-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图4-3-1 种植螺丝固定桥订单设计</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0111-01.jpg" style="width:70%" alt="图4-3-1 种植螺丝固定桥订单设计" active="true" /> <p class="imgdescript-b">图4-3-1 种植螺丝固定桥订单设计</p> </div> <h3 class="thirdTitle">一、制作种植美学功能蜡型</h3> <p class="content">CAD设计之前需要先在种植石膏模型上制作美学功能蜡型。在种植基台上安装临时基台,并用红色树脂将基台连接起来起到加强作用,由技师手工制作出种植美学功能蜡型。</p> @@ -472,13 +542,13 @@ <p class="content"> 选择软件的回切功能将种植桥美学蜡型的解剖形态进行回切,为饰面瓷预留出足够的空间(图4-3-2)。然后用软件的加减塑形工具进行精细的外形修整,最终完成螺丝固位桥的外形设计(图4-3-3)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0112-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-3-2 回切蜡型</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0112-01.jpg" style="width:75%" alt="图4-3-2 回切蜡型" active="true" /> <p class="imgdescript-b">图4-3-2 回切蜡型</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0112-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-3-3 修饰完成</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0112-02.jpg" style="width:75%" alt="图4-3-3 修饰完成" active="true" /> <p class="imgdescript-b">图4-3-3 修饰完成</p> </div> <h3 class="thirdTitle">七、螺丝孔设计</h3> <p class="content">螺丝的开孔方向是软件根据种植体位置自动生成的,技师可以根据实际需要设定、更改螺丝孔的直径和高度位置。后期经数控切削设备加工完成。</p> @@ -497,20 +567,21 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">诊断蜡型的制作</span></p> <p class="quotation"> 诊断蜡型的制作对于修复临床工作有着重要而积极的意义。首先,诊断蜡型可以帮助临床医生更好地认识治疗设计的可行性和可能出现的问题,有助于拓展和修改治疗设计思路。尤其对于一些复杂病例,通过制作诊断蜡型,临床医生可以更好地分析病例特点,并通过蜡型恢复患牙美观与功能方面的要求,从中发现可能出现的问题,以便进一步完善治疗设计。其次,诊断蜡型在科研和教学方面也蕴含着丰富的价值。作为新的科研及教学资料,诊断蜡型具有形象直观、易于保存及查阅等优点,具有较大的发展空间。最后,诊断蜡型有助于加强医患交流,使患者能够更好地理解治疗计划和预期效果。使得患者在医疗过程中体现了一定的主动性,在一定程度上提高了患者的满意度。 </p> <p class="quotation"> 制作诊断蜡型所需的特殊效果蜡并不昂贵,制作过程也较为简单、方便,通过付出较小的时间和经济代价可以获得医、教、研等多方面丰富的应用价值。因此,诊断蜡型具有较大的发展空间和应用前景,值得推广使用。 </p> <p class="titleQuot-1">【任务评价】</p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">诊断蜡型的制作</span></p> <p class="quotation"> 诊断蜡型的制作对于修复临床工作有着重要而积极的意义。首先,诊断蜡型可以帮助临床医生更好地认识治疗设计的可行性和可能出现的问题,有助于拓展和修改治疗设计思路。尤其对于一些复杂病例,通过制作诊断蜡型,临床医生可以更好地分析病例特点,并通过蜡型恢复患牙美观与功能方面的要求,从中发现可能出现的问题,以便进一步完善治疗设计。其次,诊断蜡型在科研和教学方面也蕴含着丰富的价值。作为新的科研及教学资料,诊断蜡型具有形象直观、易于保存及查阅等优点,具有较大的发展空间。最后,诊断蜡型有助于加强医患交流,使患者能够更好地理解治疗计划和预期效果。使得患者在医疗过程中体现了一定的主动性,在一定程度上提高了患者的满意度。 </p> <p class="quotation"> 制作诊断蜡型所需的特殊效果蜡并不昂贵,制作过程也较为简单、方便,通过付出较小的时间和经济代价可以获得医、教、研等多方面丰富的应用价值。因此,诊断蜡型具有较大的发展空间和应用前景,值得推广使用。 </p> </div> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">种植螺丝固定桥设计任务评价标准见表4-3-1。</p> <p class="imgtitle">表4-3-1 种植螺丝固定桥设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0113-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold">表4-3-1 种植螺丝固定桥设计任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0113-01.jpg" style="width:100%;margin-top: -10px;" alt="" active="true" /></div> </div> <div class="page-bottom-right">097</div> @@ -527,25 +598,41 @@ </div> <div class="bodystyle"> <h2 class="secondTitle">任务四 数字化手术导板设计</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">接到设计订单,患者缺失牙位36,已完成模型扫描及影像学检查。请根据数据模型信息进行36的种植导板设计。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.种植导板的种类通常有哪些?简单的设计步骤是怎样的?</p> <p class="content">2.黏膜及混合支持式种植导板,为什么要进行双次CT扫描?</p> <p class="content">3.设计种植导板是否为种植必需的环节?</p> <p class="titleQuot-1">【任务分析】</p> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">接到设计订单,患者缺失牙位36,已完成模型扫描及影像学检查。请根据数据模型信息进行36的种植导板设计。</p> <p class="titleQuot-1">【问题】</p> <p class="content">1.种植导板的种类通常有哪些?简单的设计步骤是怎样的?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.nine" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.黏膜及混合支持式种植导板,为什么要进行双次CT扫描?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.ten" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">3.设计种植导板是否为种植必需的环节?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.eleven" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 精准、微创种植是口腔种植外科的发展方向,以修复为导向的种植理念已被广泛应用于口腔临床。综合应用计算机体层扫描技术、口内三维扫描技术和模型三维扫描技术,可在数字化种植设计软件中完成以修复为导向的种植体植入方案设计,并可将设计方案转换成指导临床手术操作的种植导板,再通过三维打印技术制作导板,实现数字化技术辅助下的种植手术操作。其中,起到至关重要作用的种植导板是一种个性化口腔辅助治疗装置,它可以按照术前虚拟设计的种植体植入位置精准地将种植体转移到患者口内。下面将分步讲解各类种植导板的设计方法。 </p> <p class="content"> 种植导板在结构上一般具备以下特征:①组织面与患者口腔解剖结构相吻合;②具有指导钻针实际钻孔方向和深度的导向孔(可置入金属套环);③可具有冷却窗口、固位钉孔方向槽等结构。种植导板结构如图4-4-1所示。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0114-01.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0114-01.jpg" style="width:80%" alt="图4-4-1 种植导板结构" active="true" /> <p class="imgdescript-b">图4-4-1 种植导板结构</p> <p class="imgdescript">A.组织面观;B.咬合面观。</p> <p class="imgdescript-l">A.组织面观;B.咬合面观。</p> </div> <p class="content">种植导板需要借助数字化种植软件进行设计,再通过三维打印技术制作。本任务将以GuideMia软件为例,简要介绍种植导板的数字化设计工艺流程。</p> @@ -565,24 +652,24 @@ <p class="content">对于牙齿缺失数目不多、余留基牙稳固且能够维持稳定咬合关系的情况,可选择使用牙支持式种植导板、黏膜及混合支持式种植导板。</p> <h3 class="thirdTitle">一、牙支持式种植导板</h3> <p class="content">牙支持式种植导板的设计工艺流程如下。</p> <p class="content"><span class="bold">1.扫描并导入数据</span></p> <p class="content"><span class="bold fontGreen">1.扫描并导入数据</span></p> <p class="content"> (1)拍摄口腔CBCT数据:CBCT重建容积大小为直径16cm、高13cm,体素分辨率0.25mm,获取时间147秒。拍摄时可让患者双侧前磨牙区域咬合消毒棉球,使其处于开<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />状态,以便后期处理数据时可分离上、下颌牙列。输出高精度的DICOM格式影像断层文件(一般为一组按照命名有序排列、扩展名为DCM的文件)。</p> (1)拍摄口腔CBCT数据:CBCT重建容积大小为直径16cm、高13cm,体素分辨率0.25mm,获取时间147秒。拍摄时可让患者双侧前磨牙区域咬合消毒棉球,使其处于开𬌗状态,以便后期处理数据时可分离上、下颌牙列。输出高精度的DICOM格式影像断层文件(一般为一组按照命名有序排列、扩展名为DCM的文件)。 </p> <p class="content"> (2)扫描对颌模型数据:按工作模型的标准制取精确的上、下颌石膏模型,扫描工作模型并输出STL格式数字模型文件。此步骤也可采用口腔扫描的方式,同样需要输出STL格式文件。</p> <p class="content"> (3)导入数据:将患者CBCT扫描数据和牙列扫描数据导入设计软件。软件窗口分为5个视图区域:轴向视图、矢状视图、冠状视图、3D重建视图和当前对象视图。种植界面如图4-4-2所示。</p> <p class="content"><span class="bold">2.骨、牙模型配准</span> 调整CT阈值,对CBCT数据进行阈值分割操作,提取并重建出种植侧颌骨三维模型。在颌骨模型的余留基牙牙尖上和对应侧牙列扫描数据的基牙牙尖上,选取对应的若干点对(至少3组),基于颌骨模型和扫描牙列模型共同的牙列形态数据进行整体配准,必要时可描记下颌神经,还可进行虚拟软组织显示。 class="bold fontGreen">2.骨、牙模型配准</span> 调整CT阈值,对CBCT数据进行阈值分割操作,提取并重建出种植侧颌骨三维模型。在颌骨模型的余留基牙牙尖上和对应侧牙列扫描数据的基牙牙尖上,选取对应的若干点对(至少3组),基于颌骨模型和扫描牙列模型共同的牙列形态数据进行整体配准,必要时可描记下颌神经,还可进行虚拟软组织显示。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0115-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-4-2 种植界面</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0115-02.jpg" style="width:75%" alt="图4-4-2 种植界面" active="true" /> <p class="imgdescript-b">图4-4-2 种植界面</p> </div> <p class="content"><span class="bold">3.预期修复体设计</span> 在种植区虚拟设计预期修复体形态,用来指导和规划种植体的植入位置和角度,真正实现修复引导种植的设计理念。</p> class="bold fontGreen">3.预期修复体设计</span> 在种植区虚拟设计预期修复体形态,用来指导和规划种植体的植入位置和角度,真正实现修复引导种植的设计理念。 </p> <p class="content"> 此时可利用软件的二维和三维测量功能,测量分析种植区域的骨量软硬组织结构。调用软件种植体数据库中的种植体模型,选择临床希望植入的种植体型号(明确品牌型号、尺寸信息),将虚拟的种植体模型植入数字模型的颌骨中。虚拟植入的位置深度和角度需要综合分析预期修复体信息、邻牙关系、基台角度、距离神经管的安全距离等因素。预期修复体设计规划植入体角度如图4-4-3所示。 </p> @@ -601,24 +688,26 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0116-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l">图4-4-3 预期修复体设计规划植入体角度</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0116-01.jpg" style="width:75%" alt="图4-4-3 预期修复体设计规划植入体角度" active="true" /> <p class="imgdescript-b">图4-4-3 预期修复体设计规划植入体角度</p> </div> <p class="content"><span class="bold">4.种植导板形态设计</span> 完成种植体虚拟植入操作后,在扫描牙列模型的邻牙区域选择种植导板需要覆盖的组织范围,支持区域的选择一般覆盖2~3颗邻牙,必要情况下为维持导板的固位和稳定,支持区域的范围需要覆盖至牙弓对侧。选定支持区域的范围后,点击“更新导板就位方向”按钮,软件会自动填充倒凹并生成种植导板数字模型,可保存输出为STL格式的数据,该数据可用于后续3D打印制造。 class="bold fontGreen">4.种植导板形态设计</span> 完成种植体虚拟植入操作后,在扫描牙列模型的邻牙区域选择种植导板需要覆盖的组织范围,支持区域的选择一般覆盖2~3颗邻牙,必要情况下为维持导板的固位和稳定,支持区域的范围需要覆盖至牙弓对侧。选定支持区域的范围后,点击“更新导板就位方向”按钮,软件会自动填充倒凹并生成种植导板数字模型,可保存输出为STL格式的数据,该数据可用于后续3D打印制造。 </p> <p class="content">导板制作完成后,可根据需要在导向孔内放置金属套环,并使用配套的种植工具完成临床植入操作(图4-4-4)。</p> <div class="qrbodyPic"> <img src="../../assets/images/0116-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-4-4 完成临床植入操作</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0116-02.jpg" style="width:70%" alt="图4-4-4 完成临床植入操作" active="true" /> <p class="imgdescript-b">图4-4-4 完成临床植入操作</p> </div> <h3 class="thirdTitle">二、黏膜及混合支持式种植导板</h3> <p class="content"> 对于牙列缺失或大部分牙齿缺失,其余留基牙数目少且无法维持稳定的咬合关系;抑或口腔内有大量金属烤瓷冠的患者,都应先制作放射导板,再进行双次CT扫描,制作黏膜及混合支持式种植导板。其设计工艺流程如下。 </p> <p class="content"><span class="bold">1.制作放射导板</span> 放射导板是指组织面能够吻合患者牙齿和/或软组织,磨光面为预期的义齿修复形态且具有放射显影标记点的义齿样模板。其制作步骤如下。 class="bold fontGreen">1.制作放射导板</span> 放射导板是指组织面能够吻合患者牙齿和/或软组织,磨光面为预期的义齿修复形态且具有放射显影标记点的义齿样模板。其制作步骤如下。 </p> </div> @@ -646,21 +735,21 @@ <p class="content">2)标记数量为6~8个,一半位于唇侧,一半位于舌侧。</p> <p class="content">3)标记分布于不同平面,需位于牙齿、牙龈平面以下。</p> <p class="content">(3)制作口内咬合记录:用非显影硬质咬合记录材料制作覆盖全牙弓范围的咬合记录,如果对颌有牙齿缺失,则用材料填充。口内咬合记录用于引导种植导板精确就位。</p> <p class="content"><span class="bold">2.双次CT扫描</span></p> <p class="content"><span class="bold fontGreen">2.双次CT扫描</span></p> <p class="content">(1)让患者试戴导板和口内咬合记录,咬紧放射导板和咬合记录,使之准确且牢固就位。要求左右侧咬合力均匀,用鼻呼吸保持稳定,完成一次CBCT扫描。</p> <p class="content">(2)单独对放射导板拍摄CBCT。</p> <p class="content">(3)在GuideMia软件中导入患者配戴放射导板的CBCT数据和单独扫描的放射导板CBCT数据。</p> <p class="content"><span class="bold">3.颌骨模型与放射导板模型配准</span> 基于CT阈值,对CBCT数据进行阈值分割和重建,分别获得患者颌骨三维模型和放射导板三维模型。两个模型上的牙胶阻射点清晰可见,根据阻射点的分布和位置,选择对应的点对关系,对颌骨模型和放射导板模型进行配准(图4-4-5)。 class="bold fontGreen">3.颌骨模型与放射导板模型配准</span> 基于CT阈值,对CBCT数据进行阈值分割和重建,分别获得患者颌骨三维模型和放射导板三维模型。两个模型上的牙胶阻射点清晰可见,根据阻射点的分布和位置,选择对应的点对关系,对颌骨模型和放射导板模型进行配准(图4-4-5)。 </p> <p class="content"><span class="bold">4.种植导板形态设计</span> 根据放射导板所包含的种植修复信息,在软件中进行种植体植入方案设计和模拟,充分考虑修复要求来确定种植体的位置和角度,从而获得最佳的咀嚼功能和美学效果。 class="bold fontGreen">4.种植导板形态设计</span> 根据放射导板所包含的种植修复信息,在软件中进行种植体植入方案设计和模拟,充分考虑修复要求来确定种植体的位置和角度,从而获得最佳的咀嚼功能和美学效果。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0117-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-4-5 颌骨模型与导板配准</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0117-01.jpg" style="width:75%" alt="图4-4-5 颌骨模型与导板配准" active="true" /> <p class="imgdescript-b">图4-4-5 颌骨模型与导板配准</p> </div> </div> <div class="page-bottom-right">101</div> </div> @@ -678,26 +767,28 @@ <p class="content"> 完成种植方案设计后,软件会根据放射导板数据自动生成种植导板模型(图4-4-6)。可保存输出为STL格式的数据,用于后续3D打印制作。导板制作完成后,可根据需要在导向孔内放置金属套环,并使用配套的种植工具完成临床植入操作。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0118-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图4-4-6 导板模型生成</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0118-01.jpg" style="width:75%" alt="图4-4-6 导板模型生成" active="true" /> <p class="imgdescript-b">图4-4-6 导板模型生成</p> </div> <p class="content"> 精确的数据影像资料、数字石膏模型或口内扫描数据是种植导板设计及制作的前提,关系到导板在口腔中的精确就位。大多数情况下,种植误差主要来自导板在口腔内就位后的位置误差(与电脑设计位置的差异)。牙支持式导板比黏膜支持式导板的就位精确度高。主要原因是,CBCT精度、牙模扫描精度及软件的设计精度都是相对稳定可靠的,系统精度主要受导板就位、操作误差、配套器械等因素的影响,所以建议应用种植导板技术时需要对骨量有一定的宽容度。 </p> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">数字化引导下的全口义齿即刻种植修复流程</span></p> <p class="quotation">在数字化手段辅助下行上下颌全口义齿即刻种植修复,治疗周期短,手术精确度高,患者感受更佳。治疗过程如下。</p> <p class="quotation">(1)术前准备:①使用藻酸盐取初印模,制作个性化托盘;②用个性化托盘取硅橡胶终印模,灌制终模型;③制作光固化树脂<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />托及蜡堤,确定垂直距离,确定水平关系,面弓转移患者颌位关系,上<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架;④排牙,制作放射导板;⑤试戴放射导板,拍摄两次CBCT(患者佩戴放射导板拍摄CBCT及放射导板单独拍摄CBCT)。</p> <p class="quotation">(2)方案设计:①将两次CBCT获取的DICOM数据导入种植设计软件重叠,以修复为导向指导上下颌种植体位置摆放;②生成并打印手术导板。</p> <p class="quotation">(3)利用手术导板和导板锁,翻制模型,制作临时修复体。</p> <p class="quotation"> (4)一期手术过程:铺巾消毒,局麻后拔除上下颌余留牙,搔刮拔牙窝内炎性肉芽组织,于34~36、44~46区牙槽嵴顶近远中向切开牙龈,翻瓣。就位并固定手术导板,于11、13、16、22、25、26、32、34、36、42、44、46区定点,按术前设计方案植入种植体。除26区种植体外,其余种植体初期稳定性均达到35N*cm以上,就位复合基台,戴入保护帽,修整牙龈黏膜,缝合牙龈。术后拍摄全景片。次日复诊,取下保护帽,戴入预制的临时修复体,调<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />。</p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">数字化引导下的全口义齿即刻种植修复流程</span></p> <p class="quotation">在数字化手段辅助下行上下颌全口义齿即刻种植修复,治疗周期短,手术精确度高,患者感受更佳。治疗过程如下。</p> <p class="quotation"> (1)术前准备:①使用藻酸盐取初印模,制作个性化托盘;②用个性化托盘取硅橡胶终印模,灌制终模型;③制作光固化树脂𬌗托及蜡堤,确定垂直距离,确定水平关系,面弓转移患者颌位关系,上𬌗架;④排牙,制作放射导板;⑤试戴放射导板,拍摄两次CBCT(患者佩戴放射导板拍摄CBCT及放射导板单独拍摄CBCT)。 </p> <p class="quotation">(2)方案设计:①将两次CBCT获取的DICOM数据导入种植设计软件重叠,以修复为导向指导上下颌种植体位置摆放;②生成并打印手术导板。</p> <p class="quotation">(3)利用手术导板和导板锁,翻制模型,制作临时修复体。</p> <p class="quotation"> (4)一期手术过程:铺巾消毒,局麻后拔除上下颌余留牙,搔刮拔牙窝内炎性肉芽组织,于34~36、44~46区牙槽嵴顶近远中向切开牙龈,翻瓣。就位并固定手术导板,于11、13、16、22、25、26、32、34、36、42、44、46区定点,按术前设计方案植入种植体。除26区种植体外,其余种植体初期稳定性均达到35N*cm以上,就位复合基台,戴入保护帽,修整牙龈黏膜,缝合牙龈。术后拍摄全景片。次日复诊,取下保护帽,戴入预制的临时修复体,调𬌗。 </p> </div> </div> <div class="page-bottom-left">102</div> </div> @@ -711,30 +802,152 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="titleQuot-1">【任务评价】</p> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">数字化手术导板设计任务评价标准见表4-4-1。</p> <p class="imgtitle">表4-4-1 数字化手术导板设计任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0119-02.jpg" style="width:80%" alt="" active="true" /></div> <div class="bodyPic"><img src="../../assets/images/0119-03.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold">表4-4-1 数字化手术导板设计任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0119-02.jpg" style="width:100%;margin-top: -10px;" alt="表4-4-1 数字化手术导板设计任务评价标准" active="true" /></div> <div class="unitSummary mb-20"> <div class="summary-content"> <div class="summary-content-box" @click="toUrl(getResourceInfo('B13'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目四 考试知识点 个性化基台">项目四 考试知识点 个性化基台</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B14'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目四 考试知识点 种植导板设计">项目四 考试知识点 种植导板设计</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B15'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目四 考试知识点 种植基台上部冠结构">项目四 考试知识点 种植基台上部冠结构</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B16'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目四 考试知识点 种植螺丝固定桥设计">项目四 考试知识点 种植螺丝固定桥设计</span> </div> </div> </div> <div class="unitSummary"> <div class="summary-content"> <div class="summary-content-box" @click="toUrl(getResourceInfo('C14'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目四 数字化手术导板设计 小结">项目四 数字化手术导板设计 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C15'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目四 种植个性化基台设计 小结">项目四 种植个性化基台设计 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C16'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目四 种植螺丝固位桥设计 小结">项目四 种植螺丝固位桥设计 小结</span> </div> </div> </div> <div class="knowledgeExpansion"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>题库</span> </div> <div class="knowledgeExpansion-box"> <img src="../../assets/images/tuoZhan.svg" alt="" /> <span @click="openQuestion(getResourceInfo('AA5'))">拓展练习</span> </div> </div> <p class="right-info">(李文娟 张勇 薛姗姗)</p> </div> <div class="page-bottom-right">103</div> </div> </div> <preView :md5="p_md5" :pdfTitle="somePdfTitleValue" ref="pdfDialogRef"></preView> <dialogExaminations :cardList="interfaceQuestion" :questionIDList="questionIDList" :page="questionNum" :questionTitle="questionTitleMain" ref="dialogRef"> </dialogExaminations> </div> </template> <script> import preView from "@/components/pdfview/index.vue"; import bookVideo from "@/components/bookVideo/index.vue"; import dialogExaminations from "@/components/dialogExaminations/index.vue"; export default { name: "chapterFive", props: { showPageList: { type: Array, }, getResourceInfo: { type: Function, // 明确指定它是一个函数 required: true, }, interfaceQuestion: { type: Array, required: true, default: () => [], }, }, components: { preView, bookVideo, dialogExaminations, }, data() { return { p_md5: "", somePdfTitleValue: "", // 题目相关 questionNum: 0, questionTitleMain: "", questionIDList: [], questionData: { one: "", two: "", three: "", fore: "", five: "", six: "", seven: "", eight: "", nine: "", ten: "", eleven: "" } }; }, mounted() { this.getQuestionData() }, methods: { toUrl(val) { if (val != null) { this.p_md5 = val.md5; this.somePdfTitleValue = val.resourceName; this.$refs.pdfDialogRef.openDialog(); } }, openQuestion(val) { if (val != undefined) { this.questionNum = val.pagination; this.questionTitleMain = val.resourceName; this.questionIDList = val.ids; this.$nextTick(() => { this.$refs.dialogRef.openDialogQuestion(); }); } }, setQuestionData() { localStorage.setItem( "digitalDentalRestorationTechnology-book-chapter05-questionData", JSON.stringify(this.questionData) ); }, getQuestionData() { let questionData = localStorage.getItem("digitalDentalRestorationTechnology-book-chapter05-questionData"); if (questionData) { this.questionData = JSON.parse(questionData); } }, }, } </script> src/books/digitalDentalRestorationTechnology/view/components/chapter006.vue
@@ -4,33 +4,50 @@ <div class="page-box" page="110"> <div v-if="showPageList.indexOf(110) > -1"> <div class="bodystyle"> <h1 class="firstTitle-l mb-70 pt-70">项目五 数控加工与制作工艺</h1> <div class="bodyPic"><img src="../../assets/images/0120-01.jpg" style="width:30%" alt="" active="true" /></div> <div class="bodyPic"><img src="../../assets/images/0017-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">素质目标</span></p> <p class="content">(1)具备社会责任感,注重综合素质的提升,结合义齿设计理念在义齿数控加工方面注重形态和功能的有效结合。</p> <p class="content">(2)具备严谨扎实的工作态度,关注义齿打印的细节,减少打印的失败概率,使材料最大限度得到应用,避免浪费,注重环保。</p> <p class="center">........................</p> <p class="center"><span class="bold">知识目标</span></p> <p class="content">(1)掌握:数控加工技术原理;数字化义齿加工的工艺流程。</p> <p class="content">(2)熟悉:三维打印技术原理;排版软件的操作。</p> <p class="center">........................</p> <p class="content"><span class="bold">能力目标</span></p> <p class="content">(1)能按照设计具体要求,打印树脂模型。</p> <p class="content">(2)能正确使用和维护口腔工艺设备与器械,具备一定的口腔修复工艺流程管理能力。</p> <p class="content">(3)能用思维导图的方式总结金属打印的步骤。</p> <h1 class="firstTitle-l mb-70 pt-70 oneTitle">项目五 数控加工与制作工艺</h1> <div class="learnGoal"> <img class="learnImg img-h" src="../../assets/images/learnGoal.png" alt="" /> <p class="center learngoalRange"><span class="bold">素质目标</span></p> <p class="content">(1)具备社会责任感,注重综合素质的提升,结合义齿设计理念在义齿数控加工方面注重形态和功能的有效结合。</p> <p class="content">(2)具备严谨扎实的工作态度,关注义齿打印的细节,减少打印的失败概率,使材料最大限度得到应用,避免浪费,注重环保。</p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"><span class="bold">知识目标</span></p> <p class="content">(1)掌握:数控加工技术原理;数字化义齿加工的工艺流程。</p> <p class="content">(2)熟悉:三维打印技术原理;排版软件的操作。</p> <p class="center learngoalRange omit">........................</p> <p class="center learngoalRange"><span class="bold">能力目标</span></p> <p class="content">(1)能按照设计具体要求,打印树脂模型。</p> <p class="content">(2)能正确使用和维护口腔工艺设备与器械,具备一定的口腔修复工艺流程管理能力。</p> <p class="content">(3)能用思维导图的方式总结金属打印的步骤。</p> </div> <div class="knowledgeExpansion"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>教学课件</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A18'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目五 教学课件 数控加工工艺</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A19'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目五 教学课件 金属打印</span> </div> <div class="knowledgeExpansion-box" @click="toUrl(getResourceInfo('A20'))"> <img src="../../assets/images/jiaoXue.svg" alt="" /> <span>项目五 教学课件 树脂打印</span> </div> </div> <p class="content">数字化制造技术按原理可分为数控加工(numerical control processing,NC)技术(又称减法加工技术)和三维打印(three-dimensional printing,3DP)技术(又称加法加工技术)。在数字化制造领域中,广义上的CAM技术应包括NC技术与3DP技术,但在口腔医学早期的CAD/CAM介绍中,因当时3DP技术还未成熟,故习惯上将NC技术称为CAM。 </p> <p class="content">本项目将详细介绍各种口腔数字化制造技术的原理,分析其技术特点,并对几种典型的技工室义齿加工设备及其软硬件操作工艺流程进行详细介绍。</p> <p class="content"><span class="bold">1.数字化扫描原理分析</span> 口内扫描仪多采用光学测量技术,如三角测量法或共聚焦显微镜技术。三角测量法通过发射光线到物体表面,再接收反射光线,根据光线的角度变化计算物体表面的三维坐标。共聚焦显微镜技术利用点光源照射物体,通过小孔过滤掉非焦平面的光线,提高图像的清晰度和分辨率。 class="bold fontGreen">1.数字化扫描原理分析</span> 口内扫描仪多采用光学测量技术,如三角测量法或共聚焦显微镜技术。三角测量法通过发射光线到物体表面,再接收反射光线,根据光线的角度变化计算物体表面的三维坐标。共聚焦显微镜技术利用点光源照射物体,通过小孔过滤掉非焦平面的光线,提高图像的清晰度和分辨率。 </p> <p class="content"><span class="bold">2.数字化设计原理分析</span> 基于CAD软件来进行设计,软件内包含口腔解剖数据库和设计规则。在设计过程中,要依据患者的口腔情况、修复或治疗需求,调用数据库中的牙体形态、咬合曲线等信息进行个性化设计。同时,设计软件要考虑材料的性能和加工工艺的要求,保证设计的可制造性。 class="bold fontGreen">2.数字化设计原理分析</span> 基于CAD软件来进行设计,软件内包含口腔解剖数据库和设计规则。在设计过程中,要依据患者的口腔情况、修复或治疗需求,调用数据库中的牙体形态、咬合曲线等信息进行个性化设计。同时,设计软件要考虑材料的性能和加工工艺的要求,保证设计的可制造性。 </p> </div> @@ -46,10 +63,10 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">3.数字化加工原理分析</span> 数控加工中心对于口腔修复体的加工,主要是通过精确控制刀具的路径来切削材料。根据设计数据生成刀具路径程序,控制刀具在X、Y、Z轴方向的运动。3D打印技术,如光固化3D打印,是利用液态光敏树脂在紫外光照射下逐层固化,通过控制打印平台的升降和紫外光的照射区域来堆积成型。熔融沉积制造则是将丝状材料加热熔化后挤出堆积。 class="bold fontGreen">3.数字化加工原理分析</span> 数控加工中心对于口腔修复体的加工,主要是通过精确控制刀具的路径来切削材料。根据设计数据生成刀具路径程序,控制刀具在X、Y、Z轴方向的运动。3D打印技术,如光固化3D打印,是利用液态光敏树脂在紫外光照射下逐层固化,通过控制打印平台的升降和紫外光的照射区域来堆积成型。熔融沉积制造则是将丝状材料加热熔化后挤出堆积。 </p> <p class="content"><span class="bold">4.口腔数字化制造技术</span> CAD软件设计的修复体通过CAM设备进行制造。这些设备通常分为两种类型:数控加工技术和三维打印技术。其中数控加工技术更为常用,它以传统的电脑数控切削为基础,但是通常受到复杂几何形态的限制,不适合生产所有形状。而三维打印技术可以制作更多复杂的器官形态。 class="bold fontGreen">4.口腔数字化制造技术</span> CAD软件设计的修复体通过CAM设备进行制造。这些设备通常分为两种类型:数控加工技术和三维打印技术。其中数控加工技术更为常用,它以传统的电脑数控切削为基础,但是通常受到复杂几何形态的限制,不适合生产所有形状。而三维打印技术可以制作更多复杂的器官形态。 </p> <p class="content">(1)数控加工技术</p> <p class="content"> @@ -89,6 +106,9 @@ 数字化口腔修复技术 </div> </div> <div class="bodystyle"> <p class="content"> 4)实际运用:①优点:个性化程度高,可制造复杂结构;材料利用率高,环保节能;生产周期短,能快速交付修复体。②缺点:打印精度在某些方面略逊于数控加工;部分打印材料性能有待提升,如强度、耐磨性等;设备和材料成本在一些情况下较高。 @@ -97,15 +117,30 @@ 5)主要应用修复体:①隐形矫治器:利用三维打印技术精确制造贴合患者牙齿的隐形牙套,实现牙齿矫治的目的,美观且佩戴舒适。②个性化基台:针对种植修复,为不同患者定制与种植体和牙龈形态适配的个性化基台,提高种植修复的美学和功能效果。③树脂牙冠和桥体:适用于对美观要求较高且受力相对较小的部位的修复,成本较低且制作快速。 </p> <h2 class="secondTitle">任务一 数控加工工艺</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">义齿设计完成后,对数颗单冠和固定桥进行数字化排版制作。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.数控加工的基础原理是什么?对材料有无要求?口腔科常用材料有哪些?</p> <p class="content">2.数控加工流程的操作步骤是什么?</p> <p class="content">3.加工完成后的打磨抛光需要注意什么?哪些特殊材料需要二次烧结?</p> <p class="titleQuot-1">【任务分析】</p> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">义齿设计完成后,对数颗单冠和固定桥进行数字化排版制作。</p> <p class="titleQuot-1">【问题】</p> <p class="content">1.数控加工的基础原理是什么?对材料有无要求?口腔科常用材料有哪些?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.one" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.数控加工流程的操作步骤是什么?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.two" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">3.加工完成后的打磨抛光需要注意什么?哪些特殊材料需要二次烧结?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.three" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 随着材料学、力学、工程学及电子学等自然科学和工程技术的不断创新和发展,生物医学工程及生物制造领域越来越受到研究人员的重视。生物医学与材料学的结合,促进了如人工器官制备或仿生制造等多方面领域的新的发展和突破。 </p> @@ -113,7 +148,8 @@ 数控加工编程是生成供数控机床进行口腔修复体加工的数控程序的过程。数控加工编程是实现数控加工的重要环节,它在很大程度上决定了数控切削加工效率、表面加工精度和工作安全性。目前,编程软件开发的程序编制内容包括导入数据、毛坯设计、确定加工工艺路线、检查数值、计算程序输入等环节。用户只需点击鼠标,经过几个步骤的软件操作,就可以完成加工编程。下面使用hyperDENT软件,以种植螺丝固位桥加工为例,介绍修复体数控加工编程的实现过程,以及数控加工的工艺流程。 </p> <h3 class="thirdTitle">一、数控加工编程</h3> <p class="content"><span class="bold">1.导入模型数据CAD软件</span> 设计修复体的数据格式有很多种,hyperDENT软件可支持导入的数据类型为STL。 <p class="content"><span class="bold fontGreen">1.导入模型数据CAD软件</span> 设计修复体的数据格式有很多种,hyperDENT软件可支持导入的数据类型为STL。 </p> </div> @@ -129,7 +165,7 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="content"><span class="bold">2.毛坯布局设计</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">2.毛坯布局设计</span></p> <p class="content"> (1)选择毛坯类型:根据被加工修复体的形状特征选择合适的加工毛坯。检查修复体在毛坯材料中的位置,确保毛坯的高度必须大于修复体的高度,否则无法加工。修复体距离毛坯上、下表面和边界的最佳距离为1mm。 </p> @@ -150,13 +186,13 @@ (5)支撑柱的设置:加工氧化锆修复体时,考虑到后期还需进行二次烧结,切削的修复体会在烧结炉内发生线性体积收缩,因此在加工氧化锆修复体时一般需要添加支撑柱,用于烧结时支撑修复体,防止因体积收缩时重力作用引起的变形。 </p> <p class="content"><span class="bold">3.规划加工工艺</span> 完成毛坯设计后,还需确定修复体的加工方法、加工路线及切削用量等工艺参数,即规划加工工艺。义齿数控机床生产厂家一般为了简便操作,对不同类型与材质的修复体预先设定出适用的工艺模块可供选择,如氧化锆基底冠、纯钛全冠、瓷嵌体、基牙模型等。一般推荐使用工艺软件中根据修复体的类型及材质设置的预成工艺模板,对于机床加工经验丰富的技师或工程师,也可根据具体需要自行调整和修改工艺参数(软件提供相关参数设置功能)。确定加工工艺后,可运行模拟刀具路径功能,即在计算机中模拟完整的刀具切削过程,以全面检查加工设置并避免碰撞,做到结果的可视化控制。 class="bold fontGreen titleLeftmove">3.规划加工工艺</span> 完成毛坯设计后,还需确定修复体的加工方法、加工路线及切削用量等工艺参数,即规划加工工艺。义齿数控机床生产厂家一般为了简便操作,对不同类型与材质的修复体预先设定出适用的工艺模块可供选择,如氧化锆基底冠、纯钛全冠、瓷嵌体、基牙模型等。一般推荐使用工艺软件中根据修复体的类型及材质设置的预成工艺模板,对于机床加工经验丰富的技师或工程师,也可根据具体需要自行调整和修改工艺参数(软件提供相关参数设置功能)。确定加工工艺后,可运行模拟刀具路径功能,即在计算机中模拟完整的刀具切削过程,以全面检查加工设置并避免碰撞,做到结果的可视化控制。 </p> <p class="content"><span class="bold">4.最终检查</span> 再次检查所排列的修复体位置和设置是否正确,有无牙冠重叠或超出边界的情况。如果出现排列和设置上的错误,可能会导致毛坯材料中全部修复体的加工失败。 class="bold fontGreen titleLeftmove">4.最终检查</span> 再次检查所排列的修复体位置和设置是否正确,有无牙冠重叠或超出边界的情况。如果出现排列和设置上的错误,可能会导致毛坯材料中全部修复体的加工失败。 </p> <p class="content"><span class="bold">5.机床程序代码</span> 根据归化加工工艺步骤所确定的坯料用量,加工工艺软件自动计算数控机床所需的刀具运动轨迹、坐标值和切削量以及辅助动作。工件轮廓的基点和节点坐标将所需加工的修复体转换成机床所能识别的程序代码。程序代码编译完成后,需要通过一定的方法将其输入机床的数控系统中,通常可通过与机床通信接口电缆直连的方式或网络传输的方式实现。 class="bold fontGreen titleLeftmove">5.机床程序代码</span> 根据归化加工工艺步骤所确定的坯料用量,加工工艺软件自动计算数控机床所需的刀具运动轨迹、坐标值和切削量以及辅助动作。工件轮廓的基点和节点坐标将所需加工的修复体转换成机床所能识别的程序代码。程序代码编译完成后,需要通过一定的方法将其输入机床的数控系统中,通常可通过与机床通信接口电缆直连的方式或网络传输的方式实现。 </p> </div> @@ -177,28 +213,34 @@ <p class="content"> 数控机床是执行切削程序的载体。目前市场上机床的种类和规格繁多,按照机床的加工能力可分为大型切削机床(图5-1-1)和小型切削机床(图5-1-2)。各类机床的使用都应严格依照厂家的要求执行。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0124-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图5-1-1 大型切削机床</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0124-02.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图5-1-2 小型切削机床</p> <div class="imgFloat"> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0124-01.jpg" style="width:90%" alt="图5-1-1 大型切削机床" active="true" /> <p class="imgdescript-b">图5-1-1 大型切削机床</p> </div> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0124-02.jpg" style="width:90%" alt="图5-1-2 小型切削机床" active="true" /> <p class="imgdescript-b">图5-1-2 小型切削机床</p> </div> </div> <p class="content"><span class="bold">1.夹具与刀具</span> 夹具是机床上与专用坯料配套的夹持工具,在机械加工过程中用来固定加工对象,使之保持稳定不动,以便接受加工或检测。坯料一般需要通过螺丝装夹固定于机床夹具上,夹具则与机床的某一运动轴连接完成坯料的装载。根据所需夹持的坯料形状不同,需要不同形状的夹具与之配套。 class="bold fontGreen">1.夹具与刀具</span> 夹具是机床上与专用坯料配套的夹持工具,在机械加工过程中用来固定加工对象,使之保持稳定不动,以便接受加工或检测。坯料一般需要通过螺丝装夹固定于机床夹具上,夹具则与机床的某一运动轴连接完成坯料的装载。根据所需夹持的坯料形状不同,需要不同形状的夹具与之配套。 </p> <p class="content"> 刀具为切削工具,常用的刀具主要是铣刀。根据加工工艺的要求,在修复体加工的不同步骤需要不同直径和形状(锥状、柱状、阶梯状等)的刀具执行切削任务。例如,粗加工时需要大直径铣刀完成,以提高效率;精加工时,如表面形态的精细雕刻,往往需要小直径锥形铣刀完成。一个完整的切削过程往往需要多次更换刀具,因此数控机床一般配套有刀库或刀座来储备多把不同型号的备选刀具,以便加工时可在程序控制下自动更换刀具,提高加工效率。 </p> <p class="content">机床刀具的寿命是有限的,切削一定数量的修复体后,刀具的磨损会加重,影响切削效率和质量,需要及时更换刀具以保证加工质量。</p> <p class="content"><span class="bold">2.加工</span> 坯料夹持到位、刀具装载完成、程序代码导入机床后,即可开始对修复体进行切削加工(图5-1-3)。 <p class="content"><span class="bold fontGreen">2.加工</span> 坯料夹持到位、刀具装载完成、程序代码导入机床后,即可开始对修复体进行切削加工(图5-1-3)。 </p> <h3 class="thirdTitle">三、后处理</h3> <p class="content"><span class="bold">1.去支撑</span> 严格按各种修复体材料出厂时的要求规范去除连接柱和连接杆等支撑结构,避免破坏修复体的完整形态。 <p class="content"><span class="bold fontGreen">1.去支撑</span> 严格按各种修复体材料出厂时的要求规范去除连接柱和连接杆等支撑结构,避免破坏修复体的完整形态。 </p> <p class="content"><span class="bold">2.烧结或再结晶</span> 氧化锆材料的修复体在数控切削时为密度疏松的软质石膏状材料,切削成形后需进行二次烧结。烧结过程会导致氧化锆修复体产生一定的收缩量,此收缩量在修复体CAD阶段已经完成了参数矫正。烧结之后的氧化锆修复体呈现高强度、高密度的最终形态,抗压强度提升到1000MPa左右,对其进行打磨、抛光处理,最终完成制作。 class="bold fontGreen">2.烧结或再结晶</span> 氧化锆材料的修复体在数控切削时为密度疏松的软质石膏状材料,切削成形后需进行二次烧结。烧结过程会导致氧化锆修复体产生一定的收缩量,此收缩量在修复体CAD阶段已经完成了参数矫正。烧结之后的氧化锆修复体呈现高强度、高密度的最终形态,抗压强度提升到1000MPa左右,对其进行打磨、抛光处理,最终完成制作。 </p> @@ -215,30 +257,44 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0125-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图5-1-3 车床切削</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0125-01.jpg" style="width:65%" alt="图5-1-3 车床切削" active="true" /> <p class="imgdescript-b">图5-1-3 车床切削</p> </div> <p class="content">数控切削的二硅酸锂玻璃陶瓷[以义获嘉(IPS e.max)CAD瓷块为代表],切削阶段为蓝紫色未结晶坯料,强度较低,便于研磨。切削完成后,在烤瓷炉中经过850℃、30分钟的简单结晶处理,修复体便能达到约400MPa的强度。此后仍需使用配套的染色剂进行染色和上釉等处理(图5-1-4)。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0125-02.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript-l-b">图5-1-4 玻璃陶瓷全冠切削、烧结、上釉</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0125-02.jpg" style="width:90%" alt="图5-1-4 玻璃陶瓷全冠切削、烧结、上釉" active="true" /> <p class="imgdescript-b">图5-1-4 玻璃陶瓷全冠切削、烧结、上釉</p> <p class="imgdescript-l">A.切削后形态;B.烧结后形态;C.上釉后形态。</p> </div> <p class="content"><span class="bold">3.研磨抛光</span> 金属修复体切削加工完成后,进行常规研磨抛光。切削加工并烧结完成的氧化锆修复体(一般针对解剖形氧化锆全冠),需使用白胶轮进行初步抛光,然后使用鬃刷配合抛光膏进行高度抛光。 class="bold fontGreen">3.研磨抛光</span> 金属修复体切削加工完成后,进行常规研磨抛光。切削加工并烧结完成的氧化锆修复体(一般针对解剖形氧化锆全冠),需使用白胶轮进行初步抛光,然后使用鬃刷配合抛光膏进行高度抛光。 </p> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">关于氧化锆,你知道多少?</span></p> <p class="quotation">氧化锆陶瓷(zirconia ceramics)是由高纯氧化锆构成的一种近于惰性的生物陶瓷,将含有少量稳定剂的高纯氧化锆通过高温烧结而制得的。氧化锆陶瓷的弯曲强度可达1000MPa以上,临床适用范围较为广泛。氧化锆多晶陶瓷由氧化锆、稳定剂、加工助剂、颜色等组成。氧化锆陶瓷根据稳定剂种类的不同和晶体相组成的不同,具体分类如下。①根据稳定剂的种类,可分为氧化钇稳定的氧化锆、氧化铈稳定的氧化锆、氧化镁稳定的氧化锆、氧化钙稳定的氧化锆等。②根据晶体相组成,可分为四方相氧化锆(tetragonal zirconia polycrystals,TZP)、部分稳定氧化锆(partially stabilized zirconia,PSZ)和全稳定氧化锆(fully stabili-zed zirconia,FSZ)。</p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">关于氧化锆,你知道多少?</span></p> <p class="quotation">氧化锆陶瓷(zirconia ceramics)是由高纯氧化锆构成的一种近于惰性的生物陶瓷,将含有少量稳定剂的高纯氧化锆通过高温烧结而制得的。氧化锆陶瓷的弯曲强度可达1000MPa以上,临床适用范围较为广泛。氧化锆多晶陶瓷由氧化锆、稳定剂、加工助剂、颜色等组成。氧化锆陶瓷根据稳定剂种类的不同和晶体相组成的不同,具体分类如下。①根据稳定剂的种类,可分为氧化钇稳定的氧化锆、氧化铈稳定的氧化锆、氧化镁稳定的氧化锆、氧化钙稳定的氧化锆等。②根据晶体相组成,可分为四方相氧化锆(tetragonal zirconia polycrystals,TZP)、部分稳定氧化锆(partially stabilized zirconia,PSZ)和全稳定氧化锆(fully stabili-zed zirconia,FSZ)。</p> <p class="quotation"> 四方相氧化锆:主要由细晶粒的四方相组成的致密氧化锆陶瓷,一般氧化钇的含量在2~3mol%。口腔氧化锆陶瓷以3mol%氧化钇稳定的四方氧化锆最为常用,又称3Y-TZP,是氧化钇稳定氧化锆陶瓷中强度最高的一种,其完全强度为900~1200Mpa,断裂韧性8~12MPa·m<span class="super">1/2</span>,主要用于基台、前后牙单冠、固定桥及多单位固定桥基底的制作。</p> <p class="quotation"> 部分稳定氧化锆陶瓷:当氧化锆加入适量的稳定剂时(如氧化钇含量在3~6mol%),形成由四方相和立方相混合组成的部分稳定氧化锆陶瓷,其中立方相是稳定的,四方相是亚稳定的,在外力作用下可能诱发四方相向单斜相的马氏体相变,从而起到增韧的作用。部分稳定氧化锆又根据氧化钇稳定剂含量的不同分为4mol%氧化钇稳定的部分稳定氧化锆(4Y-PSZ)和5mol%氧化钇稳定的部分稳定氧化锆(5Y-PSZ)等。随着氧化钇含量的增加,立方相含量增高,四方相含量降低,材料的强度降低,透光率增加。 </p> <p class="quotation"> 近年来,氧化锆陶瓷材料的透光性能和美学性能都有明显改进,而且目前很多氧化锆全瓷系统都可提供多种不同颜色的瓷块供选择,甚至是颜色渐变的多层氧化锆瓷块;或者通过染色获得与修复体目标颜色相协调的基底冠或修复体。根据氧化锆陶瓷材料透度的不同,可分为传统氧化锆、高透氧化锆和超透氧化锆。传统氧化锆主要为3mol%氧化钇稳定四方相氧化锆(3Y-TZP),1mm厚度的氧化锆材料的透光率为35%左右。高透和超透氧化锆主要是通过增加稳定剂(氧化钇)的含量,提高立方相氧化锆晶体含量来实现透光性,但是强度也相应降低。一般情况下,高透氧化锆的透光率在40%左右,超透氧化锆的透光率可高达50%。 </p> </div> </div> <div class="page-bottom-right">109</div> </div> </div> @@ -252,23 +308,11 @@ </div> </div> <div class="bodystyle"> <p class="quotation"> 四方相氧化锆:主要由细晶粒的四方相组成的致密氧化锆陶瓷,一般氧化钇的含量在2~3mol%。口腔氧化锆陶瓷以3mol%氧化钇稳定的四方氧化锆最为常用,又称3Y-TZP,是氧化钇稳定氧化锆陶瓷中强度最高的一种,其完全强度为900~1200Mpa,断裂韧性8~12MPa·m<span class="super">1/2</span>,主要用于基台、前后牙单冠、固定桥及多单位固定桥基底的制作。</p> <p class="quotation"> 部分稳定氧化锆陶瓷:当氧化锆加入适量的稳定剂时(如氧化钇含量在3~6mol%),形成由四方相和立方相混合组成的部分稳定氧化锆陶瓷,其中立方相是稳定的,四方相是亚稳定的,在外力作用下可能诱发四方相向单斜相的马氏体相变,从而起到增韧的作用。部分稳定氧化锆又根据氧化钇稳定剂含量的不同分为4mol%氧化钇稳定的部分稳定氧化锆(4Y-PSZ)和5mol%氧化钇稳定的部分稳定氧化锆(5Y-PSZ)等。随着氧化钇含量的增加,立方相含量增高,四方相含量降低,材料的强度降低,透光率增加。 </p> <p class="quotation"> 近年来,氧化锆陶瓷材料的透光性能和美学性能都有明显改进,而且目前很多氧化锆全瓷系统都可提供多种不同颜色的瓷块供选择,甚至是颜色渐变的多层氧化锆瓷块;或者通过染色获得与修复体目标颜色相协调的基底冠或修复体。根据氧化锆陶瓷材料透度的不同,可分为传统氧化锆、高透氧化锆和超透氧化锆。传统氧化锆主要为3mol%氧化钇稳定四方相氧化锆(3Y-TZP),1mm厚度的氧化锆材料的透光率为35%左右。高透和超透氧化锆主要是通过增加稳定剂(氧化钇)的含量,提高立方相氧化锆晶体含量来实现透光性,但是强度也相应降低。一般情况下,高透氧化锆的透光率在40%左右,超透氧化锆的透光率可高达50%。 </p> <p class="titleQuot-1">【任务评价】</p> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">数控加工工艺任务评价标准见表5-1-1。</p> <p class="imgtitle">表5-1-1 数控加工工艺任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0126-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold">表5-1-1 数控加工工艺任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0126-01.jpg" style="width:100%" alt="表5-1-1 数控加工工艺任务评价标准" active="true" /></div> </div> <div class="page-bottom-left">110</div> </div> @@ -281,18 +325,37 @@ <span class="header-title">项目五 数控加工与制作工艺</span> <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <h2 class="secondTitle">任务二 金属三维打印工艺</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">某门诊完成种植手术二期愈合基台的安装,数字化扫描后进行数据传输,接收数据后,要求技工室完成后期修复体制作。患者口内黏膜正常,缺牙区与对颌的修复空间为4mm。 </p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">1.数字化光学印模采集完成后,后期修复体制作需要先完成哪些步骤?</p> <p class="content">2.本病例患者的修复空间是否满足修复要求?如果修复空间咬合面不够,有什么修复建议?</p> <p class="content">3.若采用纯钛金属冠修复,三维打印流程和注意事项是什么?</p> <p class="titleQuot-1">【任务分析】</p> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content"> 某门诊完成种植手术二期愈合基台的安装,数字化扫描后进行数据传输,接收数据后,要求技工室完成后期修复体制作。患者口内黏膜正常,缺牙区与对颌的修复空间为4mm。 </p> <p class="titleQuot-1">【问题】</p> <p class="content">1.数字化光学印模采集完成后,后期修复体制作需要先完成哪些步骤?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.fore" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">2.本病例患者的修复空间是否满足修复要求?如果修复空间咬合面不够,有什么修复建议?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.five" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> <p class="content">3.若采用纯钛金属冠修复,三维打印流程和注意事项是什么?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.six" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content">口腔领域的金属三维打印技术常采用选择性激光熔融(selective laser melting,SLM)技术,该技术是利用金属粉末在激光束的热作用下完全熔化经冷却凝固而成形的一种技术。为了完全熔化金属粉末,要求激光能量密度超过106W/cm<span class="super">2</span>。目前用SLM技术的激光器主要有Nd-YAG激光器、CO<span @@ -304,7 +367,7 @@ 与NC技术CAM编程的目的相似,3D打印机的CAM编程也是为了给加工设备(3D打印机)提供加工控制代码。正如3D打印原理所述,CAM软件就是要将修复体的CAD三维数据进行分层切片,获得各截面形状的二维信息,并最终将各层二维信息转换成3D打印机的激光轨迹路径。这个过程直接决定金属3D打印成形的工艺质量,故各关键控制参数的设定至关重要。可为3D打印机设备提供编程服务的CAM软件有很多种,一般情况下,各厂家都会提供针对设备定制的排版编程软件。下面以Cambridge软件为例进行介绍。 </p> <p class="content"><span class="bold">1.导入模型数据</span> 将需要打印的修复体数据导入Cambridge软件,可支持的数据格式为STL及3Shape公司的DCM格式。可同时导入一次打印所需的多个数据进行排版。 class="bold fontGreen">1.导入模型数据</span> 将需要打印的修复体数据导入Cambridge软件,可支持的数据格式为STL及3Shape公司的DCM格式。可同时导入一次打印所需的多个数据进行排版。 </p> </div> @@ -322,13 +385,15 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">2.排版</span> 把单冠和固定桥的数据进行分组,分别摆放在分开的区域,以便后续打印完成后把不需要进行应力释放的单冠单独切割下来。根据单冠和桥架数据选用相应的支承模板进行排版。按照排版打印完成的模型如图5-2-1所示。 class="bold fontGreen">2.排版</span> 把单冠和固定桥的数据进行分组,分别摆放在分开的区域,以便后续打印完成后把不需要进行应力释放的单冠单独切割下来。根据单冠和桥架数据选用相应的支承模板进行排版。按照排版打印完成的模型如图5-2-1所示。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0128-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript-l">图5-2-1 按照排版打印完成的模型</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0128-01.jpg" style="width:60%" alt="图5-2-1 按照排版打印完成的模型" active="true" /> <p class="imgdescript-b">图5-2-1 按照排版打印完成的模型</p> </div> <p class="content"><span class="bold">3.修复体位姿调整</span> 为了保证修复体的最优打印质量,需要使用3D旋转调节工具对每个修复体进行位姿调整,要求如下。 <p class="content"><span class="bold fontGreen">3.修复体位姿调整</span> 为了保证修复体的最优打印质量,需要使用3D旋转调节工具对每个修复体进行位姿调整,要求如下。 </p> <p class="content">(1)同一版上各修复体底面到打印基板的高度尽量保持一致。</p> <p class="content">(2)冠桥模型应组织面朝上、磨光面朝下摆放。</p> @@ -336,7 +401,7 @@ <p class="content">(4)尽量将后牙基底冠(单冠)就位道方向垂直于打印基板摆放。</p> <p class="content">(5)桥架整体应尽量保持同一水平高度,颊侧和舌侧的倾斜角度设置应综合考虑各组件形态。</p> <p class="content"><span class="bold">4.添加支撑</span> Cambridge软件具备自动计算并生成支撑的功能,极大简化了操作者的手动添加过程。给模型添加支撑的目的是要把修复体牢固地固定在打印基板的一定位置,且要保证结构支撑的稳定和均衡,防止打印过程中因缺少支点而产生结构坍塌,或是因激光烧结产生收缩力而发生变形。 class="bold fontGreen">4.添加支撑</span> Cambridge软件具备自动计算并生成支撑的功能,极大简化了操作者的手动添加过程。给模型添加支撑的目的是要把修复体牢固地固定在打印基板的一定位置,且要保证结构支撑的稳定和均衡,防止打印过程中因缺少支点而产生结构坍塌,或是因激光烧结产生收缩力而发生变形。 </p> <p class="content"> 软件自动生成支撑的前提是需要预先设定好相关的支撑控制参数(如支撑类型厚度、排列密度、接触面积、悬边角度等)。这如同NC加工中的工艺规划步骤一样,一般专用软件会提供针对不同材料和修复体的推荐支撑参数,技师也可借助通用CAM软件的功能修改和自定义支撑参数进行个性化布局。自动添加的支撑往往不能完全满足修复体打印的需要,一般都需要进行手动修改。修改支撑需要注意以下几点。 @@ -361,10 +426,10 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">5.检查支撑</span> 设置完成后,使用软件分层功能把三维数据转换成二维断层数据(一般为SLI格式),二维数据直接决定牙冠在激光成形时的工艺质量。确认无误后,将数据传输到三维打印机,即可开始进行激光烧结。 class="bold fontGreen">5.检查支撑</span> 设置完成后,使用软件分层功能把三维数据转换成二维断层数据(一般为SLI格式),二维数据直接决定牙冠在激光成形时的工艺质量。确认无误后,将数据传输到三维打印机,即可开始进行激光烧结。 </p> <h3 class="thirdTitle">二、打印成形</h3> <p class="content"><span class="bold">1.打印机准备</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">1.打印机准备</span></p> <p class="content">(1)打印机检查:检查并清理干净打印机工作舱内的粉尘和烟雾等杂质,以防止在加工过程中污染新添加的粉末导致加工修复体的质量下降。</p> <p class="content"> (2)调节基板:放入打印基板,检查基板与刮刀X、Y和Z向的平行度,误差控制在打印机要求的公差范围内。如果基板与刮刀的平行度欠佳,会导致加工过程中支撑结构断裂,使打印模型出现变形现象。</p> @@ -374,18 +439,18 @@ </p> <p class="content">通过使用机床上的工作舱气体成分检测功能,确保技工室内氧气浓度降低到材料要求的指定值(一般为0.8%)以下,方可开始打印进程。</p> <p class="content"><span class="bold">2.模型打印</span> 完成机床的准备工作后,将编程好的工艺文件传送至金属打印机(图5-2-2),通过拉动垂直工具条,逐层预览检查各层切片图像,确保各层之间的材料叠加增长、关系正确、无断层。 class="bold fontGreen">2.模型打印</span> 完成机床的准备工作后,将编程好的工艺文件传送至金属打印机(图5-2-2),通过拉动垂直工具条,逐层预览检查各层切片图像,确保各层之间的材料叠加增长、关系正确、无断层。 </p> <p class="content"> 金属3D打印过程为激光发出的光束在计算机控制下,根据几何形体各层截面的坐标数据有选择地对金属粉末层进行扫描,金属微粒在激光作用的位置上烧结在一起,烧结完,层基板下沉一层,补充铺粉后进行下一层扫描烧结,新的一层和前一层在烧结时自然熔融,最终生成所需的三维实体模型。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0129-01.jpg" style="width:50%" alt="" active="true" /> <p class="imgdescript">图5-2-2 金属打印机</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0129-01.jpg" style="width:50%" alt="图5-2-2 金属打印机" active="true" /> <p class="imgdescript-b">图5-2-2 金属打印机</p> </div> <p class="content">加工完毕后升起基板并取出粉末舱中未烧结的剩余材料,经过筛粉器筛分后,过滤掉过程产生的杂质后,倒回储存容器中,以备下次使用。</p> <p class="content"><span class="bold">3.模型检查</span> 检查基板上的修复体与基板连接是否完整,有无断裂现象。若单颗牙冠支撑柱有1~2根断裂,为正常现象;若出现整排断裂,则牙冠形态的准确性不能保证,发生变形的可能性很高,需分析打印失败的原因后调整打印工艺,重新加工。 class="bold fontGreen">3.模型检查</span> 检查基板上的修复体与基板连接是否完整,有无断裂现象。若单颗牙冠支撑柱有1~2根断裂,为正常现象;若出现整排断裂,则牙冠形态的准确性不能保证,发生变形的可能性很高,需分析打印失败的原因后调整打印工艺,重新加工。 </p> @@ -406,34 +471,50 @@ <h3 class="thirdTitle">三、后处理</h3> <p class="content">后处理的步骤包括喷砂、应力释放、第二次喷砂和去支撑,顺序不可颠倒,否则会引起金属修复体的变形。</p> <p class="content"><span class="bold">1.喷砂</span> 修复体从基板上切割下来之前需要先进行表面喷砂处理,去除残留在修复体表面的金属粉末,使表面光滑。喷砂完成后,按照金属粉末厂家对于该材料应力释放的要求,可以把不需要应力释放的修复体从基板上切下来。 class="bold fontGreen">1.喷砂</span> 修复体从基板上切割下来之前需要先进行表面喷砂处理,去除残留在修复体表面的金属粉末,使表面光滑。喷砂完成后,按照金属粉末厂家对于该材料应力释放的要求,可以把不需要应力释放的修复体从基板上切下来。 </p> <p class="content"><span class="bold">2.应力释放</span> 应力释放的目的是要去除修复体中的内应力。在激光烧结成形时,金属粉末在激光束的能量作用下发生熔融。由于存在冷却收缩现象,修复体内部会产生一定应力,但由于支撑结构的存在,内应力无法有效地释放出来。在多单位修复体特别是长桥中,内应力问题尤为突出,如不进行应力释放就切割支撑修复体,则修复体会因内应力的释放而产生变形。一般通过加热处理,使金属内在的原子结构重新排列,从而消除内应力,防止变形现象。不同品牌金属材料的后处理温度略有不同,建议按金属粉末厂家提供的后处理温度进行操作,操作过程如下。 class="bold fontGreen">2.应力释放</span> 应力释放的目的是要去除修复体中的内应力。在激光烧结成形时,金属粉末在激光束的能量作用下发生熔融。由于存在冷却收缩现象,修复体内部会产生一定应力,但由于支撑结构的存在,内应力无法有效地释放出来。在多单位修复体特别是长桥中,内应力问题尤为突出,如不进行应力释放就切割支撑修复体,则修复体会因内应力的释放而产生变形。一般通过加热处理,使金属内在的原子结构重新排列,从而消除内应力,防止变形现象。不同品牌金属材料的后处理温度略有不同,建议按金属粉末厂家提供的后处理温度进行操作,操作过程如下。 </p> <p class="content">(1)把需要释放应力的修复体连同金属基板一起放入应力释放炉中,平台在炉中应稳定放置,防止加热变形。</p> <p class="content">(2)应力释放炉中充入惰性气体进行保护,一般采用氩气保护。</p> <p class="content">(3)使用与加工材料相符合的加热程序及温度设置进行应力释放。</p> <p class="content">(4)加热完成后自然冷却,取出基板。</p> <p class="content"><span class="bold">3.第二次喷砂</span> 平台从应力释放炉中取出后,可放入喷砂机内进行第二次喷砂,去掉加热过程中修复体表面产生的氧化物。 <p class="content"><span class="bold fontGreen">3.第二次喷砂</span> 平台从应力释放炉中取出后,可放入喷砂机内进行第二次喷砂,去掉加热过程中修复体表面产生的氧化物。 </p> <p class="content"><span class="bold">4.去支撑</span> 可先使用线切割机沿着基板平面切断大面积的支撑结构,取下修复体,之后再用技工车针仔细磨除表面的支撑(图5-2-3)。打印后的基板需要进行研磨处理,将附着的支撑去除干净并使基板表面光洁平整,之后对基板进行表面喷砂,留待下次使用。 class="bold fontGreen">4.去支撑</span> 可先使用线切割机沿着基板平面切断大面积的支撑结构,取下修复体,之后再用技工车针仔细磨除表面的支撑(图5-2-3)。打印后的基板需要进行研磨处理,将附着的支撑去除干净并使基板表面光洁平整,之后对基板进行表面喷砂,留待下次使用。 </p> <div class="qrbodyPic"> <img src="../../assets/images/0130-01.jpg" style="width:80%" alt="" active="true" /> <img src="../../assets/images/0130-01.jpg" style="width:80%" alt="图5-2-3 去支撑前和去支撑后" active="true" /> <p class="imgdescript-b">图5-2-3 去支撑前和去支撑后</p> <p class="imgdescript">A.去支撑前;B.去支撑后</p> <p class="imgdescript-l">A.去支撑前;B.去支撑后</p> </div> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">种植体表面技术研究进展</span></p> <p class="quotation"> 口腔种植技术因其良好的修复效果和极高的成功率,在临床应用中备受推崇。为了取得更好的种植效果,需要对种植体进行各方面的改良,包括种植体的设计、材料的选择及处理等。其中对种植体材料的处理,即种植体表面改性技术的研究,是当前种植体研究领域的热点。一个真正符合临床要求的种植体需要满足如下条件:对人体无刺激、无害、无毒,并应有一定的生物活性和抗菌能力,还能刺激新骨形成,与种植体表面形成骨结合。 </p> <p class="quotation">一、种植体表面改性的方法</p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">种植体表面技术研究进展</span></p> <p class="quotation"> 口腔种植技术因其良好的修复效果和极高的成功率,在临床应用中备受推崇。为了取得更好的种植效果,需要对种植体进行各方面的改良,包括种植体的设计、材料的选择及处理等。其中对种植体材料的处理,即种植体表面改性技术的研究,是当前种植体研究领域的热点。一个真正符合临床要求的种植体需要满足如下条件:对人体无刺激、无害、无毒,并应有一定的生物活性和抗菌能力,还能刺激新骨形成,与种植体表面形成骨结合。 </p> <p class="quotation">一、种植体表面改性的方法</p> <p class="quotation">1.化学方法 通过改变种植体表面的化学特性,使之产生与细胞表面分子之间的特异相互作用。例如,酸蚀处理法、碱热处理法、阳极氧化法、微弧氧化法。</p> <p class="quotation">2.物理方法 主要指种植体超微结构的改变。例如,等离子喷涂、离子注入法、激光熔覆。</p> <p class="quotation">3.生物化学方法 通过将特定的蛋白、酶、肽固定于种植体表面,来诱导骨细胞增殖分化,促进骨结合。该方法主要包括吸附、复合涂层、键结合3种。</p> <p class="quotation">二、种植体表面改性的研究</p> <p class="quotation"> 种植体表面改性的研究大多是围绕以下两个方面展开:一是增强种植体与骨组织的骨性结合,获得种植体的初期稳定性,增加植入的成功率;二是对抗种植体周围炎症的发生。感染是失败的一个重要因素,钛种植体表面持续的抗菌性也是种植体表面改性的一个重点方向。 </p> <p class="quotation">随着钛种植体表面物理结构及化学涂层的完善,以及种植体表面生物结合能力和抗菌能力的提高,种植体在保证完美的初期稳定性的同时,也必将追求长期的稳定性。 </p> </div> </div> <div class="page-bottom-left">114</div> </div> </div> @@ -446,21 +527,11 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="quotation">1.化学方法 通过改变种植体表面的化学特性,使之产生与细胞表面分子之间的特异相互作用。例如,酸蚀处理法、碱热处理法、阳极氧化法、微弧氧化法。</p> <p class="quotation">2.物理方法 主要指种植体超微结构的改变。例如,等离子喷涂、离子注入法、激光熔覆。</p> <p class="quotation">3.生物化学方法 通过将特定的蛋白、酶、肽固定于种植体表面,来诱导骨细胞增殖分化,促进骨结合。该方法主要包括吸附、复合涂层、键结合3种。</p> <p class="quotation">二、种植体表面改性的研究</p> <p class="quotation"> 种植体表面改性的研究大多是围绕以下两个方面展开:一是增强种植体与骨组织的骨性结合,获得种植体的初期稳定性,增加植入的成功率;二是对抗种植体周围炎症的发生。感染是失败的一个重要因素,钛种植体表面持续的抗菌性也是种植体表面改性的一个重点方向。 </p> <p class="quotation">随着钛种植体表面物理结构及化学涂层的完善,以及种植体表面生物结合能力和抗菌能力的提高,种植体在保证完美的初期稳定性的同时,也必将追求长期的稳定性。</p> <p class="titleQuot-1">【任务评价】</p> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">金属三维打印工艺任务评价标准见表5-2-1。</p> <p class="imgtitle">表5-2-1 金属三维打印工艺任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0131-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="imgtitle bold">表5-2-1 金属三维打印工艺任务评价标准</p> <div class="bodyPic openImgBox"><img src="../../assets/images/0131-01.jpg" style="width:100%;margin-top: -10px;" alt="表5-2-1 金属三维打印工艺任务评价标准" active="true" /></div> </div> <div class="page-bottom-right">115</div> </div> @@ -474,15 +545,25 @@ 数字化口腔修复技术 </div> </div> <div class="bodystyle"> <h2 class="secondTitle">任务三 树脂三维打印工艺</h2> <div class="bodyPic"><img src="../../assets/images/0022-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="content"><span class="bold">【案例】</span></p> <p class="content">某门诊完成种植手术二期愈合基台的安装,进行数字化扫描后进行数据传输,接收数据后,要求技工室完成后期修复体制作。</p> <p class="content"><span class="bold">【问题】</span></p> <p class="content">树脂三维打印的核心步骤是什么?</p> <p class="titleQuot-1">【任务分析】</p> <div class="CaseStudy"> <div class="CaseStudy-title">案例导入</div> <div class="CaseStudy-content"> <p class="titleQuot-1">【案例】</p> <p class="content">某门诊完成种植手术二期愈合基台的安装,进行数字化扫描后进行数据传输,接收数据后,要求技工室完成后期修复体制作。</p> <p class="titleQuot-1">【问题】</p> <p class="content">树脂三维打印的核心步骤是什么?</p> <p class="content"> <textarea class="textarea-box" v-model="questionData.seven" placeholder="请输入内容" rows="5" @change="setQuestionData"></textarea> </p> </div> </div> <p class="titleQuot-1 fTitle">【任务分析】</p> <p class="content"> 树脂三维打印工艺在种植、牙周、正畸、修复等领域广泛应用。树脂三维打印的具体操作步骤与金属打印有何不同?有何联系?本任务将对比两者之间的差异和相似之处,为临床修复体的制作提供更多数字化支持。 </p> @@ -492,14 +573,15 @@ class="s-pic" src="../../assets/images/0026_02.png" alt="" />垫、正畸托槽粘接导板等制作。</p> <p class="content">下面以制作修复工作模型为例,介绍Objet树脂三维打印机的工艺流程。</p> <h3 class="thirdTitle">一、数据排版</h3> <p class="content"><span class="bold">1.导入模型数据</span> 打开Objet打印机配套的Objet <p class="content"><span class="bold fontGreen">1.导入模型数据</span> 打开Objet打印机配套的Objet Studio排版工艺软件,导入设计好的STL格式模型数据。多个数据可同时导入,最终一次打印。</p> <p class="content"><span class="bold">2.模型排版</span> 可使用软件的自动排版功能将所有模型自动排列到虚拟成形托盘上,排列过程的注意事项如下。</p> <p class="content"><span class="bold fontGreen">2.模型排版</span> 可使用软件的自动排版功能将所有模型自动排列到虚拟成形托盘上,排列过程的注意事项如下。</p> <p class="content">(1)模型排列应尽量集中,以缩短打印喷头的移动路径,提高打印效率。</p> <p class="content">(2)模型不能超出成形托盘边界,如果超出边界将以红色提示位置错误。</p> <p class="content">(3)在多视角视图下观察模型摆放姿态,使模型底部尽量放平,以降低打印高度,节约打印时间。</p> <p class="content"><span class="bold">3.设置打印表面光洁度</span> Objet打印机装载有模型材料和支撑材料。模型材料用于成形实物模型;支撑材料用于支撑模型底部和悬空部位,并填充模型空腔部位。通过设置支撑材料的包裹模式可控制打印模型的表面光洁度。软件提供了两种模式,可根据实际应用进行选择。 class="bold fontGreen">3.设置打印表面光洁度</span> Objet打印机装载有模型材料和支撑材料。模型材料用于成形实物模型;支撑材料用于支撑模型底部和悬空部位,并填充模型空腔部位。通过设置支撑材料的包裹模式可控制打印模型的表面光洁度。软件提供了两种模式,可根据实际应用进行选择。 </p> </div> @@ -517,11 +599,13 @@ <div class="bodystyle"> <p class="content">(1)光洁表面:支撑将包裹模型摆放角度下外形高点轮廓线以下的区域,轮廓线以上没有支撑的部分为高度光洁表面,轮廓线以下包裹支撑的部分为磨砂面效果。</p> <p class="content">(2)磨砂表面:支撑将包裹模型的全部表面,模型表面全部为磨砂面效果。</p> <p class="content"><span class="bold">4.设置打印品质</span> 根据打印精度和时间期限的具体条件,可选择高速(HS)或高质量(HQ)模式。</p> <p class="content"><span class="bold">5.预估打印时间和材料消耗</span> 为了了解打印材料消耗情况以便评估打印成本,软件可根据设置完成的数据,初步预估出模型材料消耗、支撑材料消耗及打印所需要的时间。 class="bold fontGreen">4.设置打印品质</span> 根据打印精度和时间期限的具体条件,可选择高速(HS)或高质量(HQ)模式。</p> <p class="content"><span class="bold fontGreen">5.预估打印时间和材料消耗</span> 为了了解打印材料消耗情况以便评估打印成本,软件可根据设置完成的数据,初步预估出模型材料消耗、支撑材料消耗及打印所需要的时间。 </p> <p class="content"><span class="bold">6.检查</span> 全部设置完成后,核对检查各个环节的设置,确保无误后开始打印,将排版结果发送给打印机。</p> <p class="content"><span class="bold fontGreen">6.检查</span> 全部设置完成后,核对检查各个环节的设置,确保无误后开始打印,将排版结果发送给打印机。</p> <h3 class="thirdTitle">二、模型打印</h3> <p class="content">以Objet Eden260打印机为例,其工作原理是PolyJet技术。Objet打印机的自动化程度较高,操作比较简便,可在软件中监控整个打印过程。PolyJet技术的原理:打印设备的打印喷头具有一组密集排列的打印喷嘴,每层打印时,打印喷头沿X轴方向移动,同时在精密控制下令所有喷嘴协调运作,同步向成形托盘的相应轮廓位置射出一层大约0.016mm的超薄光敏树脂。喷头架上的紫外线灯在树脂喷射的同时发射相应波长的紫外线光,快速固化当前层的光敏树脂,这种同步固化的方案大大提高了打印效率。每次打印完成后,系统内的成形托盘将下降0.016mm(一层),反复进行直到模型打印完成。具体操作步骤如下。 @@ -551,27 +635,30 @@ </div> </div> <div class="bodystyle"> <div class="qrbodyPic"> <img src="../../assets/images/0134-01.jpg" style="width:80%" alt="" active="true" /> <p class="imgdescript">图5-3-1 打印中的模型</p> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0134-01.jpg" style="width:80%" alt="图5-3-1 打印中的模型" active="true" /> <p class="imgdescript-b">图5-3-1 打印中的模型</p> </div> <div class="qrbodyPic"> <img src="../../assets/images/0134-02.jpg" style="width:80%" alt="" active="true" /> <div class="qrbodyPic openImgBox"> <img src="../../assets/images/0134-02.jpg" style="width:80%" alt="图5-3-2 打印完成的树脂模型" active="true" /> <p class="imgdescript-b">图5-3-2 打印完成的树脂模型</p> <p class="imgdescript-l">A.标记牙龈的模型打印完成;B.普通模型打印完成。</p> </div> <div class="bodyPic"><img src="../../assets/images/0026-01.jpg" style="width:80%" alt="" active="true" /></div> <p class="center"><span class="bold">3D打印材料的研究进展</span></p> <p class="quotation"> 目前生物3D打印在口腔医学主要对应快速制造层面和快速成型层面,包括模型、导板、修复体、正畸附件等非植入物的制作,以及不可降解金属的植入物的制作。主要的3D打印材料有光固化树脂、钴铬合金、纯钛及其合金等。这些材料虽能满足临床应用的需求,但也有相应的问题。例如,目前大多数商业化种植体均以纯钛或钛合金为原材料加工制造而成,此种种植体与人体组织有良好的生物相容性,但是在种植体与牙龈交界处往往存在金属颜色的暴露,尤其是在出现不同程度的种植体周围炎症的情况下,美观问题更是显著;同时钛金属引起的宿主免疫反应、铝和钒等金属元素的释放等问题也令人担忧。 </p> <p class="quotation"> 陶瓷材料具有优秀的美观效果和生物相容性,但在激光直接快速烧结时液相表面张力大,在快速凝固过程中会产生较大的热应力,从而形成较多微裂纹。目前,陶瓷直接快速成型工艺尚未成熟,国内外正处于研究阶段,还没有实现商品化。 </p> <p class="quotation"> 钛锆合金作为一种新型钛合金材料,弥补了传统钛种植体机械强度方面的不足,且抗腐蚀性和生物相容性更佳,不含可能对人体有害的铝和钒等成分,在口腔种植领域具有广阔的应用前景。目前钛锆合金窄直径种植体已初步应用于临床,但可用于3D打印的商品化的钛锆合金粉末材料却尚未上市。 </p> <div class="knowledgeExpansion"> <img class="knowledgeExpansion-img" src="../../assets/images/knowledgeExpansion.png" alt="" /> <p class="center"><span class="bold">3D打印材料的研究进展</span></p> <p class="quotation"> 目前生物3D打印在口腔医学主要对应快速制造层面和快速成型层面,包括模型、导板、修复体、正畸附件等非植入物的制作,以及不可降解金属的植入物的制作。主要的3D打印材料有光固化树脂、钴铬合金、纯钛及其合金等。这些材料虽能满足临床应用的需求,但也有相应的问题。例如,目前大多数商业化种植体均以纯钛或钛合金为原材料加工制造而成,此种种植体与人体组织有良好的生物相容性,但是在种植体与牙龈交界处往往存在金属颜色的暴露,尤其是在出现不同程度的种植体周围炎症的情况下,美观问题更是显著;同时钛金属引起的宿主免疫反应、铝和钒等金属元素的释放等问题也令人担忧。 </p> <p class="quotation"> 陶瓷材料具有优秀的美观效果和生物相容性,但在激光直接快速烧结时液相表面张力大,在快速凝固过程中会产生较大的热应力,从而形成较多微裂纹。目前,陶瓷直接快速成型工艺尚未成熟,国内外正处于研究阶段,还没有实现商品化。 </p> <p class="quotation"> 钛锆合金作为一种新型钛合金材料,弥补了传统钛种植体机械强度方面的不足,且抗腐蚀性和生物相容性更佳,不含可能对人体有害的铝和钒等成分,在口腔种植领域具有广阔的应用前景。目前钛锆合金窄直径种植体已初步应用于临床,但可用于3D打印的商品化的钛锆合金粉末材料却尚未上市。 </p> </div> </div> <div class="page-bottom-left">118</div> @@ -586,30 +673,143 @@ </div> <div class="bodystyle"> <p class="quotation">可降解材料和活体细胞的3D打印,也是日后3D打印在口腔医学领域应用探索的一个重要方向。</p> <p class="titleQuot-1">【任务评价】</p> <p class="titleQuot-1 fTitle">【任务评价】</p> <p class="content">树脂三维打印工艺任务评价标准见表5-3-1。</p> <p class="imgtitle">表5-3-1 树脂三维打印工艺任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0135-01.jpg" style="width:80%" alt="" active="true" /></div> <div class="bodyPic"><img src="../../assets/images/0135-02.jpg" style="width:80%" alt="" active="true" /></div> <p class="right-info">(黄碧坤 黄蓉 吕秋菊)</p> <p class="imgtitle bold">表5-3-1 树脂三维打印工艺任务评价标准</p> <div class="bodyPic"><img src="../../assets/images/0135-01.jpg" style="width:100%;margin-top: -10px;" alt="表5-3-1 树脂三维打印工艺任务评价标准" active="true" /></div> <div class="unitSummary mb-20"> <div class="summary-content"> <div class="summary-content-box" @click="toUrl(getResourceInfo('B17'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目五 考试知识点 金属三维打印">项目五 考试知识点 金属三维打印</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B18'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目五 考试知识点 树脂三维打印">项目五 考试知识点 树脂三维打印</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('B19'))"> <img class="theme-color" src="../../assets/images/tuoZhan.svg" alt="" /> <span title="项目五 考试知识点 数控加工工艺">项目五 考试知识点 数控加工工艺</span> </div> </div> </div> <div class="unitSummary"> <div class="summary-content"> <div class="summary-content-box" @click="toUrl(getResourceInfo('C17'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目五 金属三维打印 小结">项目五 金属三维打印 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C18'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目五 树脂三维打印 小结">项目五 树脂三维打印 小结</span> </div> <div class="summary-content-box" @click="toUrl(getResourceInfo('C19'))"> <img class="theme-color" src="../../assets/images/zongJie.svg" alt="" /> <span title="项目五 数控加工工艺 小结">项目五 数控加工工艺 小结</span> </div> </div> </div> <div class="knowledgeExpansion"> <div class="questionBank"> <img src="../../assets/images/sanJiao.svg" alt="" /> <span>题库</span> </div> <div class="knowledgeExpansion-box"> <img src="../../assets/images/tuoZhan.svg" alt="" /> <span @click="openQuestion(getResourceInfo('AA6'))">拓展练习</span> </div> </div> <p class="right-info">(黄碧坤 黄蓉 吕秋菊)</p> </div> <div class="page-bottom-right">119</div> </div> </div> <preView :md5="p_md5" :pdfTitle="somePdfTitleValue" ref="pdfDialogRef"></preView> <dialogExaminations :cardList="interfaceQuestion" :questionIDList="questionIDList" :page="questionNum" :questionTitle="questionTitleMain" ref="dialogRef"> </dialogExaminations> </div> </template> <script> import preView from "@/components/pdfview/index.vue"; import dialogExaminations from "@/components/dialogExaminations/index.vue"; export default { name: "chapterSix", props: { showPageList: { type: Array, }, getResourceInfo: { type: Function, // 明确指定它是一个函数 required: true, }, interfaceQuestion: { type: Array, required: true, default: () => [], }, }, components: { preView, dialogExaminations, }, data() { return { p_md5: "", somePdfTitleValue: "", // 题目相关 questionNum: 0, questionTitleMain: "", questionIDList: [], questionData: { one: "", two: "", three: "", fore: "", five: "", six: "", seven: "" } }; }, mounted() { this.getQuestionData() }, methods: { toUrl(val) { if (val != null) { this.p_md5 = val.md5; this.somePdfTitleValue = val.resourceName; this.$refs.pdfDialogRef.openDialog(); } }, openQuestion(val) { if (val != undefined) { this.questionNum = val.pagination; this.questionTitleMain = val.resourceName; this.questionIDList = val.ids; this.$nextTick(() => { this.$refs.dialogRef.openDialogQuestion(); }); } }, setQuestionData() { localStorage.setItem( "digitalDentalRestorationTechnology-book-chapter06-questionData", JSON.stringify(this.questionData) ); }, getQuestionData() { let questionData = localStorage.getItem("digitalDentalRestorationTechnology-book-chapter06-questionData"); if (questionData) { this.questionData = JSON.parse(questionData); } }, }, } </script> src/books/digitalDentalRestorationTechnology/view/components/chapter007.vue
@@ -5,31 +5,29 @@ <div v-if="showPageList.indexOf(126) > -1"> <div class="bodystyle"> <h1 class="firstTitle-l mb-70 pt-70">项目六 实训教程</h1> <bookVideo :videoInfo="getResourceInfo('D18')" :BookId="config.activeBook.bookId"></bookVideo> <h2 class="secondTitle">工作训练一 口内扫描及模型导入</h2> <div class="bodyPic"><img src="../../assets/images/0136-01.jpg" style="width:30%" alt="" active="true" /></div> <p class="titleQuot-1">【目的和要求】</p> <p class="titleQuot-1 fTitle">【目的和要求】</p> <p class="content">1.能够熟练创建口内扫描订单。</p> <p class="content">2.熟悉口内扫描的操作步骤。</p> <p class="content">3.掌握口内扫描仪的校准方法。</p> <p class="content">4.能够熟练导出数据。</p> <p class="titleQuot-1">【实训内容】</p> <p class="titleQuot-1 fTitle">【实训内容】</p> <p class="content">完成口内扫描。</p> <p class="titleQuot-1">【实训学时】</p> <p class="titleQuot-1 fTitle">【实训学时】</p> <p class="content">2学时。</p> <p class="titleQuot-1">【实训用品】</p> <p class="titleQuot-1 fTitle">【实训用品】</p> <p class="content">1.实训设备 口内扫描仪及软件、电脑。</p> <p class="content">2.实训材料 上下颌牙列、仿头模、一次性口腔器械盒、手套、棉球、三用枪头、吸唾管、避污膜。</p> <p class="titleQuot-1">【方法和步骤】</p> <p class="titleQuot-1 fTitle">【方法和步骤】</p> <p class="poemtitle-l">一、扫描前准备</p> <p class="content"><span class="bold">1.启动扫描仪并校准</span> 开启电脑,连接扫描仪。双击打开扫描程序,检查程序更新和校准情况。校准时,将扫描头取下,连接校准头。根据系统提示,完成校准。部分厂家的扫描仪需要单独进行颜色校准,有的厂家将点位校准和颜色校准合并为标定仪。可以根据具体设备不同,进行调整。扫描仪校准操作一般几分钟即可完成。 class="bold fontGreen">1.启动扫描仪并校准</span> 开启电脑,连接扫描仪。双击打开扫描程序,检查程序更新和校准情况。校准时,将扫描头取下,连接校准头。根据系统提示,完成校准。部分厂家的扫描仪需要单独进行颜色校准,有的厂家将点位校准和颜色校准合并为标定仪。可以根据具体设备不同,进行调整。扫描仪校准操作一般几分钟即可完成。 </p> </div> <div class="page-bottom-left">120</div> </div> </div> <!-- Page 127 (奇数页) --> <div class="page-box" page="127"> <div v-if="showPageList.indexOf(127) > -1"> @@ -39,37 +37,34 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">2.感染防控</span> 操作前,医生应身着白大衣,带好帽子、口罩和手套,将口内扫描仪手柄粘好避污膜,为患者准备一次性使用的扫描口镜或保护套。</p> <p class="content"><span class="bold">3.调节体位</span> 医生位于患者右后方。患者取仰卧位,头部与医生肘部平行。扫描上颌牙时,患者咬合平面与地面成45°~90°;扫描下颌牙时,咬合平面尽量与地面平行。 class="bold fontGreen">2.感染防控</span> 操作前,医生应身着白大衣,带好帽子、口罩和手套,将口内扫描仪手柄粘好避污膜,为患者准备一次性使用的扫描口镜或保护套。 </p> <p class="content"><span class="bold">4.医患沟通</span> 医生需向患者解释扫描操作过程,说明操作过程中的注意事项,嘱患者尽量保持静止不动;扫描前请患者漱口去除口内的残渣,放置吸唾管或棉卷,吸干扫描区域的唾液。 class="bold fontGreen">3.调节体位</span> 医生位于患者右后方。患者取仰卧位,头部与医生肘部平行。扫描上颌牙时,患者咬合平面与地面成45°~90°;扫描下颌牙时,咬合平面尽量与地面平行。 </p> <p class="content"><span class="bold fontGreen">4.医患沟通</span> 医生需向患者解释扫描操作过程,说明操作过程中的注意事项,嘱患者尽量保持静止不动;扫描前请患者漱口去除口内的残渣,放置吸唾管或棉卷,吸干扫描区域的唾液。 </p> <p class="poemtitle-l">二、口内扫描</p> <p class="content">口内扫描的临床操作主要包括三个步骤:创建订单、获取图像、数据处理及上传。</p> <p class="content"><span class="bold">1.创建订单</span> 建立新患者,填写患者基本信息,创建新病例订单,详细填写牙位及其修复的设计方案、修复材料等信息。 <p class="content"><span class="bold fontGreen">1.创建订单</span> 建立新患者,填写患者基本信息,创建新病例订单,详细填写牙位及其修复的设计方案、修复材料等信息。 </p> <p class="content"><span class="bold">2.获取图像</span> 按照下颌→上颌→咬合的顺序,依次完成口腔扫描。</p> <p class="content">(1)扫描<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面:扫描头对准末端磨牙<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面,开始扫描,由一侧向另一侧扫描<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面。后牙区镜头平行于<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面,前牙区镜头做小幅度唇舌侧翻转。</p> <p class="content"><span class="bold fontGreen">2.获取图像</span> 按照下颌→上颌→咬合的顺序,依次完成口腔扫描。</p> <p class="content">(1)扫描𬌗面:扫描头对准末端磨牙𬌗面,开始扫描,由一侧向另一侧扫描𬌗面。后牙区镜头平行于𬌗面,前牙区镜头做小幅度唇舌侧翻转。</p> <p class="content"> (2)扫描舌面:将镜头朝向牙弓舌侧,使扫描枪尽量垂直于牙弓,适当扭转镜头确保扫描到舌侧近远中邻面。扫描末端磨牙远中面时,嘱患者嘴巴微闭,镜头尽量伸向末端磨牙远中,做小幅度的颊舌侧转动,确保扫全远中面的信息。 </p> <p class="content">(3)扫描唇颊面:从磨牙远中向中线进行扫描,后牙区镜头与<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面成大约45°。扫前牙时,扫描枪可以横向握持。</p> <p class="content">(3)扫描唇颊面:从磨牙远中向中线进行扫描,后牙区镜头与𬌗面成大约45°。扫前牙时,扫描枪可以横向握持。</p> <p class="content"> (4)扫描咬合:嘱患者做正中咬合,用口镜牵拉口角,扫描头置于牙弓颊侧,镜头位于上下颌中间,取景器内能同时看到上下颌牙及其咬合状态。从后向前波浪式移动,依次完成双侧咬合扫描。</p> <p class="content"> (5)检查及修整:单颌扫描完成后,从前向后实时检查扫描图像,如有遗漏或模糊的区域,可重新扫描。如果图像完整,可对扫描图像的边缘进行适当修整。全口扫描完成后,检查整体数据是否存在缺失或重叠。 </p> <p class="content"><span class="bold">3.数据处理及上传</span> 在软件中编辑和优化扫描数据,生成三维数字模型,导出开放输出格式的模型文件。将扫描数据保存在患者病例档案中。将数据发送给技工室进行后续3D模型打印或CAD/CAM操作。 class="bold fontGreen">3.数据处理及上传</span> 在软件中编辑和优化扫描数据,生成三维数字模型,导出开放输出格式的模型文件。将扫描数据保存在患者病例档案中。将数据发送给技工室进行后续3D模型打印或CAD/CAM操作。 </p> <p class="titleQuot-1">【注意事项】</p> <p class="titleQuot-1 fTitle">【注意事项】</p> <p class="content">1.进行口内扫描前,应检查软件是否更新,并对扫描仪进行校准。</p> <p class="content">2.严格按照操作步骤使用口内扫描仪。</p> <p class="content">3.操作前与患者进行沟通,说明注意事项。</p> @@ -91,24 +86,24 @@ </div> <div class="bodystyle"> <h2 class="secondTitle">工作训练二 氧化锆解剖冠设计</h2> <div class="bodyPic"><img src="../../assets/images/0138-01.jpg" style="width:30%" alt="" active="true" /></div> <p class="titleQuot-1">【目的和要求】</p> <bookVideo :videoInfo="getResourceInfo('D8')" :BookId="config.activeBook.bookId"></bookVideo> <p class="titleQuot-1 fTitle">【目的和要求】</p> <p class="content">1.熟悉“Exocad”操作系统,以及软件中各种工具的功能及使用方法。</p> <p class="content">2.掌握“Exocad”解剖冠的设计流程及设计要点。</p> <p class="titleQuot-1">【实训内容】</p> <p class="titleQuot-1 fTitle">【实训内容】</p> <p class="content">设计16氧化锆解剖冠。</p> <p class="titleQuot-1">【实训学时】</p> <p class="titleQuot-1 fTitle">【实训学时】</p> <p class="content">4学时。</p> <p class="titleQuot-1">【实训用品】</p> <p class="content"><span class="bold">1.实训设备</span> Exocad设计软件、电脑。</p> <p class="content"><span class="bold">2.实训材料</span> 工作模型或扫描数据包。</p> <p class="titleQuot-1">【方法和步骤】</p> <p class="content"><span class="bold">1.启动工作</span> 接通电源,启动电脑桌面,双击“EXO”图标进入软件界面,进行修复体设计。</p> <p class="content"><span class="bold">2.建立订单</span> 根据技工单信息建立订单,在右键菜单下选择“导入扫描数据”完成第三方数据的导入(数据格式可以是STL、PLY、DCM)。按照左上角数据导入提示,导入工作模型及对颌模型。 <p class="titleQuot-1 fTitle">【实训用品】</p> <p class="content"><span class="bold fontGreen">1.实训设备</span> Exocad设计软件、电脑。</p> <p class="content"><span class="bold fontGreen">2.实训材料</span> 工作模型或扫描数据包。</p> <p class="titleQuot-1 fTitle">【方法和步骤】</p> <p class="content"><span class="bold fontGreen">1.启动工作</span> 接通电源,启动电脑桌面,双击“EXO”图标进入软件界面,进行修复体设计。 </p> <p class="content"><span class="bold">3.设计</span> 点击“设计”按钮,进入设计界面。</p> <p class="content"><span class="bold fontGreen">2.建立订单</span> 根据技工单信息建立订单,在右键菜单下选择“导入扫描数据”完成第三方数据的导入(数据格式可以是STL、PLY、DCM)。按照左上角数据导入提示,导入工作模型及对颌模型。 </p> <p class="content"><span class="bold fontGreen">3.设计</span> 点击“设计”按钮,进入设计界面。</p> <p class="content"> (1)确定颈缘线:在模型的颈缘处单击,系统会自动识别颈缘线。可以通过拖动颈缘线上的圆点进行修整,也可以通过画线的方式快速编辑颈缘的位置。颈缘线一旦进入倒凹区,就会变成红色(正常为绿色)。 </p> @@ -135,35 +130,31 @@ <p class="content">自由选项中的“增加/减少”“光滑/平整”等工具,可通过调整画笔强度和画笔范围,对修复体形态进行修改。</p> <p class="content">解剖形态选项中的“牙尖”“部分牙齿”“整个牙齿”“嵴”等工具,可以对修复体形态进行修改。</p> <p class="content">“适应调整”选项中,通过智能参数调整修复体触点松紧度与咬合。</p> <p class="content"><span class="bold">4.检查设计</span> 检查修复体外展隙、外形高点、邻接区等是否符合要求,是否符合牙列的协调性。</p> <p class="content"><span class="bold fontGreen">4.检查设计</span> 检查修复体外展隙、外形高点、邻接区等是否符合要求,是否符合牙列的协调性。 </p> <p class="content"><span class="bold">5.保存设计结果</span> 单击“保存”,保存设计结果,完成CAD设计。在指定的文件夹中,找到DCM或STL格式的数据,传送给铣床工作人员即可。</p> <p class="titleQuot-1">【注意事项】</p> class="bold fontGreen">5.保存设计结果</span> 单击“保存”,保存设计结果,完成CAD设计。在指定的文件夹中,找到DCM或STL格式的数据,传送给铣床工作人员即可。 </p> <p class="titleQuot-1 fTitle">【注意事项】</p> <p class="content">1.“Exocad”设计软件大多数流程都是自动化的操作,但操作者应根据修复体实际情况与过往经验,个性化地对修复体进行设计。</p> <p class="content">2.建立订单时应严格按照医生提供的设计单选择修复体类型,制作牙位和材料。订单编码与设计单编码要一致,方便日后查找。</p> <p class="content">3.在每个流程的操作过程中(如确定颈缘线、修复体形态设计等),操作者应该从多个角度进行观测,不可从单一角度完成修复体的设计。</p> <p class="content">4.设置间隙剂时,对于较尖锐的前牙(如下颌前牙),可将粘接剂厚度适当增大;对于<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />龈径短、聚合角度小的基牙,可将粘接剂厚度适当调小。</p> <p class="content">4.设置间隙剂时,对于较尖锐的前牙(如下颌前牙),可将粘接剂厚度适当增大;对于𬌗龈径短、聚合角度小的基牙,可将粘接剂厚度适当调小。</p> <p class="content">5.在进行修复体形态设计时,应运用多种工具,不同的工具有不同的操作效果。</p> <p class="content">6.确保每一步的步骤正确,正确有效的操作是下一个流程完好进行的前提。</p> <p class="content">7.基牙有倒凹时,在不影响边缘密合度的情况下,要勾选“移除倒凹”功能。</p> <p class="content">8.设计牙冠形态要整体考虑整个牙列的协调性。</p> <p class="content">9.根据患者<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />接触类型确定接触方式,设计时应考虑前止接触和后止接触。如果种植修复或牙周状况不佳,应减少咬合接触点的数量,减少<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />力。</p> <p class="content">9.根据患者𬌗接触类型确定接触方式,设计时应考虑前止接触和后止接触。如果种植修复或牙周状况不佳,应减少咬合接触点的数量,减少𬌗力。</p> <p class="right-info">(廖清三)</p> <h2 class="secondTitle">工作训练三 全瓷桥CAD设计</h2> <div class="bodyPic"><img src="../../assets/images/0139-04.jpg" style="width:30%" alt="" active="true" /></div> <p class="titleQuot-1">【目的和要求】</p> <bookVideo :videoInfo="getResourceInfo('D12')" :BookId="config.activeBook.bookId"></bookVideo> <p class="titleQuot-1 fTitle">【目的和要求】</p> <p class="content">1.熟悉解剖固定桥的设计步骤。</p> <p class="content">2.熟悉软件中的各种工具及参数的调改使用方法。</p> </div> <div class="page-bottom-right">123</div> </div> </div> <!-- Page 130 (偶数页) --> <div class="page-box" page="130"> <div v-if="showPageList.indexOf(130) > -1"> @@ -173,31 +164,30 @@ </div> </div> <div class="bodystyle"> <p class="titleQuot-1">【实训内容】</p> <p class="titleQuot-1 fTitle">【实训内容】</p> <p class="content">以3单位固定桥修复为例(如25缺失,以24、26为基牙),使用Exocad设计软件进行解剖式全瓷桥CAD的设计。</p> <p class="titleQuot-1">【实训学时】</p> <p class="titleQuot-1 fTitle">【实训学时】</p> <p class="content">4学时。</p> <p class="titleQuot-1">【实训用品】</p> <p class="content"><span class="bold">1.实训设备</span> Exocad设计软件、电脑。</p> <p class="content"><span class="bold">2.实训材料</span> 工作模型或扫描数据包。</p> <p class="titleQuot-1">【方法和步骤】</p> <p class="content"><span class="bold">1.创建订单</span> 输入订单号、客户信息及制作技师等内容。</p> <p class="titleQuot-1 fTitle">【实训用品】</p> <p class="content"><span class="bold fontGreen titleLeftmove">1.实训设备</span> Exocad设计软件、电脑。</p> <p class="content"><span class="bold fontGreen titleLeftmove">2.实训材料</span> 工作模型或扫描数据包。</p> <p class="titleQuot-1 fTitle">【方法和步骤】</p> <p class="content"><span class="bold fontGreen titleLeftmove">1.创建订单</span> 输入订单号、客户信息及制作技师等内容。</p> <p class="content"><span class="bold">2.选择牙位、确定修复体种类</span> 在Exocad牙位图电子技工单上点击24牙位,选择解剖全冠,根据医生提供的设计单要求选择氧化锆材料,确定信息。点击26牙位完成同样设定。点击25牙位,选择解剖缺失牙、氧化锆材料,确定信息。点击对颌牙及邻牙完成设定。保存已设定的信息,然后点击右侧“设计”按钮进入设计页面。 class="bold fontGreen titleLeftmove">2.选择牙位、确定修复体种类</span> 在Exocad牙位图电子技工单上点击24牙位,选择解剖全冠,根据医生提供的设计单要求选择氧化锆材料,确定信息。点击26牙位完成同样设定。点击25牙位,选择解剖缺失牙、氧化锆材料,确定信息。点击对颌牙及邻牙完成设定。保存已设定的信息,然后点击右侧“设计”按钮进入设计页面。 </p> <p class="content"><span class="bold">3.导入数据</span> 扫描模型或导入已有数据(方法同工作训练二)。</p> <p class="content"><span class="bold">4.确定边缘线位置及共同就位道方向</span> 使用边缘线检测器绘制基牙边缘范围,并修改各基牙边缘线形态,方法同单冠修复。判断选择的共同就位道是否合适,当生成的就位道方向不理想时可以手动调整,以从<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面俯视观察可以看到所有基牙边缘线上的绿点为佳。最后修改所选基牙的颈缘线形态,使颈缘线形态准确、顺滑。</p> <p class="content"><span class="bold">5.底部参数设定</span> 在Exocad软件“底部参数”工具栏设置间隙剂厚度、冠边缘参数、倒凹处理与刀具补偿的参数。方法参考全冠设计。金属基底粘接间隙一般可设定为0.02mm,金属基底冠边缘厚度可设置为0.1~0.3mm。由于固定桥的就位较单冠困难,所以间隙剂厚度设定可比单冠稍厚,数据设定参考全冠设计部分。 <p class="content"><span class="bold fontGreen titleLeftmove">3.导入数据</span> 扫描模型或导入已有数据(方法同工作训练二)。 </p> <p class="content"><span class="bold">6.修复体形态设计</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">4.确定边缘线位置及共同就位道方向</span> 使用边缘线检测器绘制基牙边缘范围,并修改各基牙边缘线形态,方法同单冠修复。判断选择的共同就位道是否合适,当生成的就位道方向不理想时可以手动调整,以从𬌗面俯视观察可以看到所有基牙边缘线上的绿点为佳。最后修改所选基牙的颈缘线形态,使颈缘线形态准确、顺滑。 </p> <p class="content"><span class="bold fontGreen titleLeftmove">5.底部参数设定</span> 在Exocad软件“底部参数”工具栏设置间隙剂厚度、冠边缘参数、倒凹处理与刀具补偿的参数。方法参考全冠设计。金属基底粘接间隙一般可设定为0.02mm,金属基底冠边缘厚度可设置为0.1~0.3mm。由于固定桥的就位较单冠困难,所以间隙剂厚度设定可比单冠稍厚,数据设定参考全冠设计部分。 </p> <p class="content"><span class="bold fontGreen titleLeftmove">6.修复体形态设计</span></p> <p class="content"> (1)基牙牙冠形态设计:根据患者信息及邻牙、对颌牙状况,从牙齿形态库中选择与之匹配的解剖牙冠置入牙列相应部位,也可复制相似牙冠。使用“排列牙齿位置”应用工具栏里的移动、旋转、缩放功能,可校正牙冠摆位,使其与边缘线密合,与邻牙、对颌牙协调,点击“生成牙冠”。借助“自由造型”工具栏下的“解剖形态”进一步调整牙冠的形态和凸度,调整过高接触点,与对颌牙建立正常的覆<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />、覆盖关系。用“自由造型”工具栏下的“适应调整”工具,调整静态咬合,切除早接触点并调整与邻牙接触点的松紧度。</p> (1)基牙牙冠形态设计:根据患者信息及邻牙、对颌牙状况,从牙齿形态库中选择与之匹配的解剖牙冠置入牙列相应部位,也可复制相似牙冠。使用“排列牙齿位置”应用工具栏里的移动、旋转、缩放功能,可校正牙冠摆位,使其与边缘线密合,与邻牙、对颌牙协调,点击“生成牙冠”。借助“自由造型”工具栏下的“解剖形态”进一步调整牙冠的形态和凸度,调整过高接触点,与对颌牙建立正常的覆𬌗、覆盖关系。用“自由造型”工具栏下的“适应调整”工具,调整静态咬合,切除早接触点并调整与邻牙接触点的松紧度。 </p> <p class="content">(2)桥体形态设计:在“自由造型—适应调整—缺失牙”工具栏将“到牙龈距离”数值调整为“0”或者微小的负值,使桥体组织面与牙槽嵴保持接触。</p> </div> @@ -213,39 +203,33 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="content">(3)外形细节修整:对<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面的沟窝、牙尖嵴、外形高点等部位进行精细调整,根据对颌牙在主动中位设定的<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />接触点,使修复体在牙尖交错位达到稳定的<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />接触。最后将修复体表面整体修整光顺,使解剖桥获得满意的外形。如基牙情况不良,可适当减少<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面接触点的数量。设计桥体时需要注意减径,应遵照医生的设计要求。</p> <p class="content"><span class="bold">7.连接体设计</span> 在“连接杆”界面,根据不同牙位,设置连接体的最小横截面积、连接杆的宽度和厚度等信息参数,通过“自由设计”调整连接体的形态、大小及位置。应根据实际情况适当增加连接体截面积的默认值,以保证固定桥的结构强度。 <p class="content"> (3)外形细节修整:对𬌗面的沟窝、牙尖嵴、外形高点等部位进行精细调整,根据对颌牙在主动中位设定的𬌗接触点,使修复体在牙尖交错位达到稳定的𬌗接触。最后将修复体表面整体修整光顺,使解剖桥获得满意的外形。如基牙情况不良,可适当减少𬌗面接触点的数量。设计桥体时需要注意减径,应遵照医生的设计要求。 </p> <p class="content"><span class="bold">8.组件融合</span> 连接体设计完成后,在“合并并保存修复体”界面将前序步骤设计的所有组件融为一体,并可以对合并保存的修复体做自由造型,直至形成满意的解剖桥设计。 class="bold fontGreen">7.连接体设计</span> 在“连接杆”界面,根据不同牙位,设置连接体的最小横截面积、连接杆的宽度和厚度等信息参数,通过“自由设计”调整连接体的形态、大小及位置。应根据实际情况适当增加连接体截面积的默认值,以保证固定桥的结构强度。 </p> <p class="content"><span class="bold">9.保存</span> 保存完成的设计。</p> <p class="titleQuot-1">【注意事项】</p> <p class="content">1.如果共同就位道的方向不理想,可以手动调节。以从<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面观察可以看到所有基牙边缘线上的绿点为佳。</p> <p class="content"><span class="bold fontGreen">8.组件融合</span> 连接体设计完成后,在“合并并保存修复体”界面将前序步骤设计的所有组件融为一体,并可以对合并保存的修复体做自由造型,直至形成满意的解剖桥设计。 </p> <p class="content"><span class="bold fontGreen">9.保存</span> 保存完成的设计。</p> <p class="titleQuot-1 fTitle">【注意事项】</p> <p class="content">1.如果共同就位道的方向不理想,可以手动调节。以从𬌗面观察可以看到所有基牙边缘线上的绿点为佳。</p> <p class="content">2.粘接间隙的厚度设置可比单冠稍厚,以便顺利就位。</p> <p class="content">3.桥体设计应使桥体龈面与牙槽嵴轻微接触。</p> <p class="content">4.设计桥体<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面时,需根据具体情况,注意适当减径。</p> <p class="content">4.设计桥体𬌗面时,需根据具体情况,注意适当减径。</p> <p class="content">5.邻接区的调整,需注意位置及接触面积的大小。</p> <p class="content">6.咬合接触点的设定,需要根据基牙的健康状况决定。</p> <p class="right-info">(王菲)</p> <h2 class="secondTitle">工作训练四 基底桥(回切法)CAD设计</h2> <div class="bodyPic"><img src="../../assets/images/0141-07.jpg" style="width:30%" alt="" active="true" /></div> <p class="titleQuot-1">【目的和要求】</p> <bookVideo :videoInfo="getResourceInfo('D13')" :BookId="config.activeBook.bookId"></bookVideo> <bookVideo :videoInfo="getResourceInfo('D14')" :BookId="config.activeBook.bookId"></bookVideo> <bookVideo :videoInfo="getResourceInfo('D15')" :BookId="config.activeBook.bookId"></bookVideo> <p class="titleQuot-1 fTitle">【目的和要求】</p> <p class="content">1.熟悉基底桥的基本结构。</p> <p class="content">2.熟悉基底桥设计的步骤。</p> <p class="content">3.熟悉软件中的各种工具及参数的调改使用方法。</p> <p class="titleQuot-1">【实训内容】</p> <div class="bodyPic"><img src="../../assets/images/0141-08.jpg" style="width:30%" alt="" active="true" /></div> <p class="titleQuot-1 fTitle">【实训内容】</p> <p class="content">以46缺失,45、47为桥基牙的三单位金-瓷固定桥修复为例,使用Exocad设计软件进行金属基底桥CAD设计。</p> </div> @@ -262,39 +246,39 @@ </div> </div> <div class="bodystyle"> <p class="titleQuot-1">【实训学时】</p> <p class="titleQuot-1 fTitle">【实训学时】</p> <p class="content">4学时。</p> <p class="titleQuot-1">【实训用品】</p> <p class="content"><span class="bold">1.实训设备</span> Exocad设计软件、电脑。</p> <p class="content"><span class="bold">2.实训材料</span> 工作模型或扫描数据包。</p> <p class="titleQuot-1">【方法和步骤】</p> <p class="content"><span class="bold">1.创建订单</span> 方法同工作训练二。</p> <p class="titleQuot-1 fTitle">【实训用品】</p> <p class="content"><span class="bold fontGreen">1.实训设备</span> Exocad设计软件、电脑。</p> <p class="content"><span class="bold fontGreen">2.实训材料</span> 工作模型或扫描数据包。</p> <p class="titleQuot-1 fTitle">【方法和步骤】</p> <p class="content"><span class="bold fontGreen">1.创建订单</span> 方法同工作训练二。</p> <p class="content"><span class="bold">2.选择牙位、确定修复体种类</span> 在Exocad牙位图电子技工单上选择牙位45、47,选择“回切全冠”,46选择“回切缺失牙”,材料选择非贵金属,15、16、17选择为对颌牙,确定后点击“设计”按钮进入主界面。 class="bold fontGreen">2.选择牙位、确定修复体种类</span> 在Exocad牙位图电子技工单上选择牙位45、47,选择“回切全冠”,46选择“回切缺失牙”,材料选择非贵金属,15、16、17选择为对颌牙,确定后点击“设计”按钮进入主界面。 </p> <p class="content"><span class="bold">3.导入数据</span> 扫描模型或者导入已有数据(方法同工作训练二)。</p> <p class="content"><span class="bold fontGreen">3.导入数据</span> 扫描模型或者导入已有数据(方法同工作训练二)。</p> <p class="content"><span class="bold">4.确定边缘线位置及共同就位道方向</span> 使用边缘线检测器绘制基牙边缘范围,并修改各基牙边缘线形态,方法同单冠修复。判断选择的共同就位道是否合适,可手动进行调整。 class="bold fontGreen">4.确定边缘线位置及共同就位道方向</span> 使用边缘线检测器绘制基牙边缘范围,并修改各基牙边缘线形态,方法同单冠修复。判断选择的共同就位道是否合适,可手动进行调整。 </p> <p class="content"><span class="bold">5.底部参数设定</span> Exocad软件在“底部参数”设置间隙剂厚度、冠边缘参数、倒凹处理与刀具补偿的参数。金属基底粘接间隙可设定为0.02mm,金属基底冠边缘厚度可设置为0.1~0.3mm。 class="bold fontGreen">5.底部参数设定</span> Exocad软件在“底部参数”设置间隙剂厚度、冠边缘参数、倒凹处理与刀具补偿的参数。金属基底粘接间隙可设定为0.02mm,金属基底冠边缘厚度可设置为0.1~0.3mm。 </p> <p class="content"><span class="bold">6.预期修复体形态设计</span></p> <p class="content"><span class="bold fontGreen">6.预期修复体形态设计</span></p> <p class="content">(1)排列牙冠:在“排列牙齿位置”界面的牙冠数据库中选择适合的牙冠形态,对牙齿进行空间姿态调整,以适合牙列空间。</p> <p class="content">(2)自由造型:调整牙冠形态和咬合关系,在“适应调整”工具栏,设置咬合参数,去除早接触点,并进行邻接关系松紧度的调整。</p> <p class="content"><span class="bold">7.预期修复体<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />接触设计</span> 根据医生提供的面弓参数,使用数字<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />架调整动态咬合下预期修复体的<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />面形态。</p> <p class="content"><span class="bold">8.预期修复体回切</span></p> <p class="content"><span class="bold fontGreen">7.预期修复体𬌗接触设计</span> 根据医生提供的面弓参数,使用数字𬌗架调整动态咬合下预期修复体的𬌗面形态。</p> <p class="content"><span class="bold fontGreen">8.预期修复体回切</span></p> <p class="content">(1)根据订单要求设置回切参数,设置“回切大小”及“最小厚度”,最小厚度一般设置为0.4mm。</p> <p class="content"> (2)形成金属加强带:选择“舌侧加强带”,桥基牙会自动生成金属带。勾选“保留已选部分”,手动勾画缺失牙舌侧金属带,宽度与弧度尽量保持一致,修整完成后点击“应用”。软件对修复体外形进行均匀回切,在保证最小厚度的情况下,基底冠仍会保留一定的解剖形态。之后可进行金属基底冠形态的调整,把金属带调整到同一水平高度,便于后续添加连接体。 </p> <p class="content">(3)在“适应调整—缺失牙”工具栏下,调整“到牙龈距离”参数,为桥体龈面保留瓷层厚度。在形态精细调整后,使用虚拟蜡刀光顺基底冠表面。</p> <p class="content"><span class="bold">9.连接体设计</span> 添加连接杆,根据不同牙位及美观要求,调整连接体的横截面积大小、宽度、厚度及位置。</p> <p class="content"><span class="bold">10.组件融合</span> 点击“合并并保存修复体”,将所有组件融为一体。再次对连接杆进行精细修整,并将金属带连接到一起,形成形态顺滑的金属带连接。</p> class="bold fontGreen">9.连接体设计</span> 添加连接杆,根据不同牙位及美观要求,调整连接体的横截面积大小、宽度、厚度及位置。</p> <p class="content"><span class="bold fontGreen">10.组件融合</span> 点击“合并并保存修复体”,将所有组件融为一体。再次对连接杆进行精细修整,并将金属带连接到一起,形成形态顺滑的金属带连接。 </p> </div> <div class="page-bottom-left">126</div> @@ -309,35 +293,33 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="content"><span class="bold">11.保存</span> 保存完成的设计。</p> <p class="titleQuot-1">【注意事项】</p> <p class="content"><span class="bold fontGreen">11.保存</span> 保存完成的设计。</p> <p class="titleQuot-1 fTitle">【注意事项】</p> <p class="content">1.回切参数要根据不同基底冠材料进行设置。</p> <p class="content">2.需要设置金属基底冠的最小厚度,不可太薄。当均匀回切和最小厚度之间存在矛盾时,要保证基底冠的最小厚度。</p> <p class="content"> 3.间隙剂的厚薄决定冠的松紧。在调整间隙剂参数时,应严格按照要求进行调整,金属带设置厚度及弧度要保持均匀,并保持在同一高度。当后牙基底冠邻面与天然牙邻间隙超过1.5mm时,邻面金属带设置需要有承托<img class="s-pic" src="../../assets/images/0026_02.png" alt="" />力的结构。</p> 3.间隙剂的厚薄决定冠的松紧。在调整间隙剂参数时,应严格按照要求进行调整,金属带设置厚度及弧度要保持均匀,并保持在同一高度。当后牙基底冠邻面与天然牙邻间隙超过1.5mm时,邻面金属带设置需要有承托𬌗力的结构。 </p> <p class="content">4.连接体设计需要保证强度,但不可设计过大而影响外展隙形态。前牙连接体设计应偏向舌侧,以免影响美观。</p> <p class="right-info">(王菲)</p> <h2 class="secondTitle">工作训练五 可摘局部义齿支架CAD设计</h2> <p class="titleQuot-1">【目的和要求】</p> <div class="bodyPic"><img src="../../assets/images/0143-02.jpg" style="width:30%" alt="" active="true" /></div> <bookVideo :videoInfo="getResourceInfo('D16')" :BookId="config.activeBook.bookId"></bookVideo> <bookVideo :videoInfo="getResourceInfo('D17')" :BookId="config.activeBook.bookId"></bookVideo> <p class="titleQuot-1 fTitle">【目的和要求】</p> <p class="content">1.掌握建立订单的方法,鉴别扫描数据的有效性。</p> <p class="content">2.掌握蜡型雕刻工具的使用方法。</p> <p class="content">3.熟悉可摘局部义齿支架数字蜡型各部件的设计制作过程。</p> <p class="titleQuot-1">【实训内容】</p> <p class="titleQuot-1 fTitle">【实训内容】</p> <p class="content">完成各类缺失可摘局部义齿的支架设计操作。</p> <p class="titleQuot-1">【实训学时】</p> <p class="titleQuot-1 fTitle">【实训学时】</p> <p class="content">4学时。</p> <p class="titleQuot-1">【实训用品】</p> <p class="content"><span class="bold">1.实训设备</span> Exocad软件、电脑。</p> <p class="content"><span class="bold">2.实训材料</span> 工作模型式扫描数据包。</p> <p class="titleQuot-1 fTitle">【实训用品】</p> <p class="content"><span class="bold fontGreen">1.实训设备</span> Exocad软件、电脑。</p> <p class="content"><span class="bold fontGreen">2.实训材料</span> 工作模型式扫描数据包。</p> </div> <div class="page-bottom-right">127</div> </div> </div> <!-- Page 134 (偶数页) --> <div class="page-box" page="134"> <div v-if="showPageList.indexOf(134) > -1"> @@ -347,24 +329,24 @@ </div> </div> <div class="bodystyle"> <p class="titleQuot-1">【方法和步骤】</p> <p class="titleQuot-1 fTitle">【方法和步骤】</p> <p class="content"><span class="bold">1.建立订单</span> 打开Exocad软件,输入患者基本信息,选择牙齿,设计内容选择“活动支架”,材料选择“3D打印”,点击“确定”,再点击“保存”,完成建立订单。点击右侧操作菜单中的“设计活动支架”进入设计页面。 class="bold fontGreen">1.建立订单</span> 打开Exocad软件,输入患者基本信息,选择牙齿,设计内容选择“活动支架”,材料选择“3D打印”,点击“确定”,再点击“保存”,完成建立订单。点击右侧操作菜单中的“设计活动支架”进入设计页面。 </p> <p class="content"><span class="bold">2.导入数据</span> 导入患者的扫描数据,为STL格式。检查数据有无错层、重影现象,咬合关系是否准确,基牙及唇颊、舌腭侧扫描是否完整,有无变形。检查过程中可使用Ctrl+D显示咬合空间、Ctrl+R显示空间尺等快捷键。扫描数据基本要求如下。 class="bold fontGreen">2.导入数据</span> 导入患者的扫描数据,为STL格式。检查数据有无错层、重影现象,咬合关系是否准确,基牙及唇颊、舌腭侧扫描是否完整,有无变形。检查过程中可使用Ctrl+D显示咬合空间、Ctrl+R显示空间尺等快捷键。扫描数据基本要求如下。 </p> <p class="content">(1)数据无错层、重影现象。</p> <p class="content">(2)咬合关系准确,无变形。</p> <p class="content">(3)局部件基牙清晰,缺失牙基托边缘完整。</p> <p class="content">(4)全口半口黏膜转折处扫完整,后部扫描完整。上颌扫至腭小凹后及上颌结节后2mm,下颌扫至磨牙后垫后2mm。</p> <p class="content">(5)基牙及唇颊、舌腭侧扫描完整。</p> <p class="content"><span class="bold">3.工作模型处理</span></p> <p class="content"><span class="bold fontGreen">3.工作模型处理</span></p> <p class="content">(1)确定义齿就位道方向:借助数字模型分析患者口腔组织状况,通过“视图方向设置”查看倒凹分布情况,并确定合适就位道方向。</p> <p class="content">(2)填补倒凹:调整合适的倒凹填充角度,点击“应用”或“下一步”,完成倒凹填补。</p> <p class="content">(3)确定卡环放置部位,去除多余的倒凹蜡:使用蜡型雕刻工具对卡环进入倒凹区的部位进行刮蜡处理,去除多余的倒凹蜡。</p> <p class="content">(4)缓冲区处理:对需要进行缓冲的区域,应用额外填除蜡。模型缺损或气泡也可在此步骤处理。</p> <p class="content"><span class="bold">4.支架设计</span></p> <p class="content"><span class="bold fontGreen">4.支架设计</span></p> <p class="content"> (1)绘制大连接体和蜡网:使用曲线工具绘制大连接体和蜡网。选取所需形式的固位网,点击“绘制新曲线”,在缺隙区牙槽嵴处逐点绘制大连接体和蜡网,或用快速编辑连续绘制曲线,完成绘制时双击形成闭合曲线,蜡网和大连接体需重叠相连。 </p> @@ -378,7 +360,7 @@ <p class="content">2)绘制终止线:完成之后,点击“向导”,进行终止线的绘制。若需更改终止线方向,则右键点击终止线,可以使用控制箭头来更改完成线的角度。完成之后,点击“下一步”。 </p> <p class="content"><span class="bold">5.编辑数字蜡型</span> 在编辑蜡型或自由造型步骤,对支架蜡型设计进行平滑和微调,处理光滑各个部件衔接部分和邻面区域的锐利边缘,使得支架边缘呈连续圆滑的曲线;填平内终止线处支架表面不平整的区域,避免放置外终止线时形成皱褶。完成操作后点击“下一步”。 class="bold fontGreen">5.编辑数字蜡型</span> 在编辑蜡型或自由造型步骤,对支架蜡型设计进行平滑和微调,处理光滑各个部件衔接部分和邻面区域的锐利边缘,使得支架边缘呈连续圆滑的曲线;填平内终止线处支架表面不平整的区域,避免放置外终止线时形成皱褶。完成操作后点击“下一步”。 </p> </div> @@ -395,13 +377,13 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">6.绘制支撑杆</span> 点击界面最右侧的“高级模式”,选择附件工具中的“支撑杆”,在蜡型设计上设置两点创建。在义齿跨度长的部位可增加支撑杆,以防变形移位。完成后用雕刻工具处理蜡型,让各结合处平滑过渡。 class="bold fontGreen">6.绘制支撑杆</span> 点击界面最右侧的“高级模式”,选择附件工具中的“支撑杆”,在蜡型设计上设置两点创建。在义齿跨度长的部位可增加支撑杆,以防变形移位。完成后用雕刻工具处理蜡型,让各结合处平滑过渡。 </p> <p class="content"><span class="bold">7.添加附件</span> 根据设计需求安放固位珠、固位钉、浮雕等部件。固位珠通过选择“高级模式”中的“曲线”绘制闭合曲线后应用;固位钉在缺隙处放置,调整位置、角度等参数后应用;浮雕可添加文字图像,设计凹凸效果。操作方法同项目三任务四中的相关内容,完成后点击“应用”,放置多个时可重复操作。 class="bold fontGreen">7.添加附件</span> 根据设计需求安放固位珠、固位钉、浮雕等部件。固位珠通过选择“高级模式”中的“曲线”绘制闭合曲线后应用;固位钉在缺隙处放置,调整位置、角度等参数后应用;浮雕可添加文字图像,设计凹凸效果。操作方法同项目三任务四中的相关内容,完成后点击“应用”,放置多个时可重复操作。 </p> <p class="content"><span class="bold">8.保存数据</span> 点击“保存”按钮,完成支架设计,并保存场景文件。</p> <p class="titleQuot-1">【注意事项】</p> <p class="content"><span class="bold fontGreen">8.保存数据</span> 点击“保存”按钮,完成支架设计,并保存场景文件。</p> <p class="titleQuot-1 fTitle">【注意事项】</p> <p class="content">1.在模型观测的数字蜡型修整环节中,不可将蜡去除过多,避免卡环进入倒凹过深,导致义齿就位困难。</p> <p class="content">2.内外终止线不可处于同一截面位置,避免义齿受力时于该位置折断。</p> <p class="content">3.需使用测量工具检测数字蜡型厚度,以确保支架有足够强度。</p> @@ -411,12 +393,12 @@ </p> <p class="right-info">(胥玉凤)</p> <h2 class="secondTitle">工作训练六 种植个性化钛基台CAD设计</h2> <div class="bodyPic"><img src="../../assets/images/0145-01.jpg" style="width:30%" alt="" active="true" /></div> <p class="titleQuot-1">【目的和要求】</p> <bookVideo :videoInfo="getResourceInfo('D10')" :BookId="config.activeBook.bookId"></bookVideo> <bookVideo :videoInfo="getResourceInfo('D9')" :BookId="config.activeBook.bookId"></bookVideo> <p class="titleQuot-1 fTitle">【目的和要求】</p> <p class="content">1.了解个性化钛基台的基本结构。</p> <p class="content">2.熟悉个性化钛基台设计的步骤。</p> <p class="titleQuot-1">【实训内容】</p> <p class="titleQuot-1 fTitle">【实训内容】</p> <p class="content">完成个性化基台的设计。</p> </div> @@ -433,33 +415,33 @@ </div> </div> <div class="bodystyle"> <p class="titleQuot-1">【实训学时】</p> <p class="titleQuot-1 fTitle">【实训学时】</p> <p class="content">2学时。</p> <p class="titleQuot-1">【实训用品】</p> <p class="content"><span class="bold">1.实训设备</span> Exocad设计软件。</p> <p class="content"><span class="bold">2.实训材料</span> 预成个性化基台钛柱、制作完成的个性化钛基台、工作模型。</p> <p class="titleQuot-1">【方法和步骤】</p> <p class="titleQuot-1 fTitle">【实训用品】</p> <p class="content"><span class="bold fontGreen">1.实训设备</span> Exocad设计软件。</p> <p class="content"><span class="bold fontGreen">2.实训材料</span> 预成个性化基台钛柱、制作完成的个性化钛基台、工作模型。</p> <p class="titleQuot-1 fTitle">【方法和步骤】</p> <p class="content"><span class="bold">1.导入模型</span> 开启电脑,双击打开Exocad设计软件,点击“载入”选项,选择打开要制作的病例模型,双击“CAD设计”进入软件基台设计界面。事先扫描好的种植数字模型会显示在屏幕上,包括上、下颌模型,种植体扫描杆,人工牙龈等所有模型信息。 class="bold fontGreen">1.导入模型</span> 开启电脑,双击打开Exocad设计软件,点击“载入”选项,选择打开要制作的病例模型,双击“CAD设计”进入软件基台设计界面。事先扫描好的种植数字模型会显示在屏幕上,包括上、下颌模型,种植体扫描杆,人工牙龈等所有模型信息。 </p> <p class="content"><span class="bold">2.基台种植体连接部分的设计</span> 根据工作模型上种植类型选择软件中相应的扫描杆数据(黄色),将其与实际扫描获得的扫描杆(绿色)进行重合对位,则会得到种植体在模型上的准确位置,并自动获得基台连接部分的结构。 class="bold fontGreen">2.基台种植体连接部分的设计</span> 根据工作模型上种植类型选择软件中相应的扫描杆数据(黄色),将其与实际扫描获得的扫描杆(绿色)进行重合对位,则会得到种植体在模型上的准确位置,并自动获得基台连接部分的结构。 </p> <p class="content"><span class="bold">3.标记人工牙龈袖口轮廓</span> 用鼠标标记出种植体周围人工牙龈的袖口轮廓形态。牙龈袖口轮廓可以指导成形个性化基台穿龈部分的形态,使基台与牙龈实现无缝隙的密合接触,避免基台和牙龈间食物的嵌塞,同时对牙龈进行生理性支持和塑形,维护牙龈的生理健康。 class="bold fontGreen">3.标记人工牙龈袖口轮廓</span> 用鼠标标记出种植体周围人工牙龈的袖口轮廓形态。牙龈袖口轮廓可以指导成形个性化基台穿龈部分的形态,使基台与牙龈实现无缝隙的密合接触,避免基台和牙龈间食物的嵌塞,同时对牙龈进行生理性支持和塑形,维护牙龈的生理健康。 </p> <p class="content"><span class="bold">4.数字排牙</span> 按照软件提示,在种植体近中邻牙和远中邻牙邻接面上各选一点,软件会自动出现要修复的数字牙齿外形,利用软件选项可以进行数字牙齿预排列。数字排牙的目的在于提前恢复出种植义齿的外形,以便指导个性化基台修复连接部分的设计,并预留出未来种植义齿的修复空间。 class="bold fontGreen">4.数字排牙</span> 按照软件提示,在种植体近中邻牙和远中邻牙邻接面上各选一点,软件会自动出现要修复的数字牙齿外形,利用软件选项可以进行数字牙齿预排列。数字排牙的目的在于提前恢复出种植义齿的外形,以便指导个性化基台修复连接部分的设计,并预留出未来种植义齿的修复空间。 </p> <p class="content"><span class="bold">5.基台穿龈部分的设计</span></p> <p class="content"><span class="bold fontGreen">5.基台穿龈部分的设计</span></p> <p class="content">(1)将基台穿龈部的边缘放置到牙龈袖口边缘位置,一般颊侧边缘位于龈下0.5~1.0mm,近远中和舌侧边缘应与牙龈平齐。</p> <p class="content">(2)将基台穿龈部外形用加减工具塑形至与牙龈袖口轮廓呈接触状态,以便支撑牙龈组织。</p> <p class="content"><span class="bold">6.设置基台就位方向</span> 设置基台的就位方向,以便将来种植义齿的顺利戴入。</p> <p class="content"><span class="bold">7.基台修复连接部分的设计</span></p> <p class="content"><span class="bold fontGreen">6.设置基台就位方向</span> 设置基台的就位方向,以便将来种植义齿的顺利戴入。</p> <p class="content"><span class="bold fontGreen">7.基台修复连接部分的设计</span></p> <p class="content">(1)基台的高度一般不低于4mm,并与对颌牙保持2mm左右的咬合空间。</p> <p class="content">(2)基台轴面外形的倾斜角度一般为2°,肩台边缘宽度为0.8~1.0mm,并预留出种植义齿轴面的修复空间。</p> <p class="content"><span class="bold">8.完成个性化钛基台的设计</span> 点击完成基台的设计,并进行数据保存。</p> <p class="titleQuot-1">【注意事项】</p> <p class="content"><span class="bold fontGreen">8.完成个性化钛基台的设计</span> 点击完成基台的设计,并进行数据保存。</p> <p class="titleQuot-1 fTitle">【注意事项】</p> <p class="content">1.基台的种植体类型要选择正确。</p> <p class="content">2.基台的穿龈部要与牙龈袖口保持密合接触,并且不能过度压迫牙龈。</p> @@ -479,27 +461,26 @@ <p class="content">3.基台的就位方向设置基本与牙体长轴保持一致。</p> <p class="right-info">(李文娟)</p> <h2 class="secondTitle">工作训练七 贴面工艺设计</h2> <div class="bodyPic"><img src="../../assets/images/0147-01.jpg" style="width:30%" alt="" active="true" /></div> <p class="titleQuot-1">【目的和要求】</p> <bookVideo :videoInfo="getResourceInfo('D11')" :BookId="config.activeBook.bookId"></bookVideo> <p class="titleQuot-1 fTitle">【目的和要求】</p> <p class="content">1.能通过Exocad软件中的贴面功能制作修复体。</p> <p class="content">2.掌握Exocad贴面的设计流程及设计要点。</p> <p class="content">3.熟悉Exocad软件中各种工具的功能及使用方法。</p> <p class="titleQuot-1">【实训内容】</p> <p class="titleQuot-1 fTitle">【实训内容】</p> <p class="content">完成42贴面的设计。</p> <p class="titleQuot-1">【实训学时】</p> <p class="titleQuot-1 fTitle">【实训学时】</p> <p class="content">2学时。</p> <p class="titleQuot-1">【实训用品】</p> <p class="titleQuot-1 fTitle">【实训用品】</p> <p class="content">实训设备:Exocad软件、电脑。</p> <p class="titleQuot-1">【方法和步骤】</p> <p class="titleQuot-1 fTitle">【方法和步骤】</p> <p class="content"><span class="bold">1.建立订单</span> 根据医生提供的技工单信息建立订单,输入患者姓名,选择患牙位42及对颌牙12,选择修复体类型(贴面)和材料(氧化锆)。点击右下角“确定”。在扫描模式下选择“数字印模扫描”。点击“保存”“设计”。 class="bold fontGreen">1.建立订单</span> 根据医生提供的技工单信息建立订单,输入患者姓名,选择患牙位42及对颌牙12,选择修复体类型(贴面)和材料(氧化锆)。点击右下角“确定”。在扫描模式下选择“数字印模扫描”。点击“保存”“设计”。 </p> <p class="content"><span class="bold">2.模型导入及修整</span> 进入设计页面后,点击“文件”,选择已经保存的文件,找到患者的文件夹,点击“lower”(PLV格式)导入下颌模型,点击“upper”(PLV格式)导入上颌模型。在3D数据编辑器模式下调整扫描数据定位方向,点击“下一步”。选择去除扫描数据上的早接触点,去除模型边缘无用的菲薄的边缘,点击“下一步”。由于扫描数据不准确,上颌和下颌之间至少有0.133mm的交叉,如果想使用虚拟咬合架或模型编辑功能,建议移除上下颌之间的交叉点,选择不修改模型数据。 class="bold fontGreen">2.模型导入及修整</span> 进入设计页面后,点击“文件”,选择已经保存的文件,找到患者的文件夹,点击“lower”(PLV格式)导入下颌模型,点击“upper”(PLV格式)导入上颌模型。在3D数据编辑器模式下调整扫描数据定位方向,点击“下一步”。选择去除扫描数据上的早接触点,去除模型边缘无用的菲薄的边缘,点击“下一步”。由于扫描数据不准确,上颌和下颌之间至少有0.133mm的交叉,如果想使用虚拟咬合架或模型编辑功能,建议移除上下颌之间的交叉点,选择不修改模型数据。 </p> <p class="content"><span class="bold">3.设计边缘线</span> 在边缘线检测器模式下,点击“代型边缘”,开始检测边缘线。点击“校正/手绘”,开始在42号牙位上描绘边缘线,当边缘线闭合后,点击“编辑”可移动边缘线的形态进行精修。精修完成后点击“下一步”。 class="bold fontGreen">3.设计边缘线</span> 在边缘线检测器模式下,点击“代型边缘”,开始检测边缘线。点击“校正/手绘”,开始在42号牙位上描绘边缘线,当边缘线闭合后,点击“编辑”可移动边缘线的形态进行精修。精修完成后点击“下一步”。 </p> </div> @@ -517,24 +498,23 @@ </div> <div class="bodystyle"> <p class="content"><span class="bold">4.确定就位道方向</span> 在调出的指定牙位基牙上初步勾勒边缘范围,然后软件会根据勾勒的范围自动生成推荐的就位道方向。可以根据贴面的具体设计适当调整就位道方向。点击设定当前视图为就位道方向,点击“下一步”生成嵌体底部。 class="bold fontGreen">4.确定就位道方向</span> 在调出的指定牙位基牙上初步勾勒边缘范围,然后软件会根据勾勒的范围自动生成推荐的就位道方向。可以根据贴面的具体设计适当调整就位道方向。点击设定当前视图为就位道方向,点击“下一步”生成嵌体底部。 </p> <p class="content"><span class="bold">5.确定间隙剂厚度</span> 在生成嵌体底部模式下,点击“间隙”按钮,设定粘接间隙。本病例粘接间隙设定为0.025mm,在临床操作中可以根据贴面的设计及患者的实际情况设置不同的粘接间隙。使用数值定义宽度。点击“边界”按钮设定牙冠边界参数。点击“下一步”生成最小厚度。 class="bold fontGreen">5.确定间隙剂厚度</span> 在生成嵌体底部模式下,点击“间隙”按钮,设定粘接间隙。本病例粘接间隙设定为0.025mm,在临床操作中可以根据贴面的设计及患者的实际情况设置不同的粘接间隙。使用数值定义宽度。点击“边界”按钮设定牙冠边界参数。点击“下一步”生成最小厚度。 </p> <p class="content"><span class="bold">6.设计修复体形态</span> 完成上述步骤后,软件会进入“排列牙齿”界面。在该界面下拖放牙齿以改变其位置和形状,进行适应对合调整。由于材料的最小厚度而产生的干扰性接触,可以选择忽略,在屏幕下方的按钮中选择设置最小厚度为0.41mm,点击“确定”返回排列牙齿界面,此时可根据患者的年龄、性别、同名牙形态和邻牙形态在软件预装的牙冠形态库中选择适合患者的修复体形态。考虑到牙齿形态应是个性化的,数据库中的牙齿形态往往无法满足实际需要,故可以选择复制同名牙的形态,镜像化后进行微调。此时按Shift键可以缩放牙齿,按Ctrl键可以旋转牙齿。在静态咬合模式下,对42牙进行微调。点击“下一步”,在“自由造型”模块下对贴面形态进行进一步的修整。该模块下有如下修整内容:“自由”“解剖形态”。“自由”按钮中可以使用:增加/减少、光滑/平整、适应调整。“解剖形态”按钮中可以选择:牙尖、部分牙齿、整个牙齿、嵴。根据实际情况选择合适的功能对修复体进行调整。 class="bold fontGreen">6.设计修复体形态</span> 完成上述步骤后,软件会进入“排列牙齿”界面。在该界面下拖放牙齿以改变其位置和形状,进行适应对合调整。由于材料的最小厚度而产生的干扰性接触,可以选择忽略,在屏幕下方的按钮中选择设置最小厚度为0.41mm,点击“确定”返回排列牙齿界面,此时可根据患者的年龄、性别、同名牙形态和邻牙形态在软件预装的牙冠形态库中选择适合患者的修复体形态。考虑到牙齿形态应是个性化的,数据库中的牙齿形态往往无法满足实际需要,故可以选择复制同名牙的形态,镜像化后进行微调。此时按Shift键可以缩放牙齿,按Ctrl键可以旋转牙齿。在静态咬合模式下,对42牙进行微调。点击“下一步”,在“自由造型”模块下对贴面形态进行进一步的修整。该模块下有如下修整内容:“自由”“解剖形态”。“自由”按钮中可以使用:增加/减少、光滑/平整、适应调整。“解剖形态”按钮中可以选择:牙尖、部分牙齿、整个牙齿、嵴。根据实际情况选择合适的功能对修复体进行调整。 </p> <p class="content"><span class="bold">7.保存设计结果</span> 保存设计结果数据,完成CAD设计。</p> <p class="titleQuot-1">【注意事项】</p> <p class="content"><span class="bold fontGreen">7.保存设计结果</span> 保存设计结果数据,完成CAD设计。</p> <p class="titleQuot-1 fTitle">【注意事项】</p> <p class="content">1.建立订单时应严格按照临床医生提供的义齿设计单选择牙位、修复体类型和材料。订单编码与设计单编码要一致,方便日后查找。</p> <p class="content">2.当自动生成的就位道方向不理想时,可手动调整方向,也可以自定义设定就位道。</p> <p class="content">3.设置间隙剂时,对于较尖锐的前牙,可将粘接剂厚度适当增大;对于切龈径短、聚合角度小的基牙,可适当调小粘接剂厚度。</p> <p class="right-info">(吕秋菊)</p> <h2 class="secondTitle">工作训练八 数控加工工艺设计</h2> <div class="bodyPic"><img src="../../assets/images/0148-01.jpg" style="width:30%" alt="" active="true" /></div> <p class="titleQuot-1">【目的和要求】</p> <bookVideo :videoInfo="getResourceInfo('D7')" :BookId="config.activeBook.bookId"></bookVideo> <p class="titleQuot-1 fTitle">【目的和要求】</p> <p class="content">1.了解单冠的排版步骤和支撑柱的放置。</p> <p class="content">2.了解单冠切削时选择的刀具和注意事项。</p> <p class="content">3.了解机床加工过程,观察加工时刀具相对于单冠的切削情况。</p> @@ -553,32 +533,33 @@ <img class="header-img" src="../../assets/images/pageHeader.png" alt="" /> </div> <div class="bodystyle"> <p class="titleQuot-1">【实训内容】</p> <p class="titleQuot-1 fTitle">【实训内容】</p> <p class="content">1.软件排版与坯料安装方法。</p> <p class="content">2.机床启动方法。</p> <p class="titleQuot-1">【实训学时】</p> <p class="titleQuot-1 fTitle">【实训学时】</p> <p class="content">2学时。</p> <p class="titleQuot-1">【实训用品】</p> <p class="content"><span class="bold">1.实训设备</span> hyperDENT软件、DMG10机床。</p> <p class="content"><span class="bold">2.实训材料</span> 单冠数据铣刀刀具、圆盘材料、夹具。</p> <p class="titleQuot-1">【方法和步骤】</p> <p class="content"><span class="bold">1.软件排版操作</span></p> <p class="titleQuot-1 fTitle">【实训用品】</p> <p class="content"><span class="bold fontGreen">1.实训设备</span> hyperDENT软件、DMG10机床。</p> <p class="content"><span class="bold fontGreen">2.实训材料</span> 单冠数据铣刀刀具、圆盘材料、夹具。</p> <p class="titleQuot-1 fTitle">【方法和步骤】</p> <p class="content"><span class="bold fontGreen">1.软件排版操作</span></p> <p class="content">(1)接收设计完成的单冠STL数据并检查数据是否有破损或碎片的情况,保证数据完整。</p> <p class="content">(2)打开软件,建立加工所需的机床,用导入毛坯的夹具导入毛坯并检查毛坯的厚度,保证毛坯厚度大于单冠数据1mm以上。</p> <p class="content">(3)在软件中导入单冠数据,进行位置的摆放,单冠位置距离夹具和毛坯中已有的数据要保持大于0.5mm的间距。</p> <p class="content">(4)选择自动识别边缘线,然后选择自动放置支撑柱,再手动调整支撑柱的位置,单冠3根支撑柱为好。支撑柱位置选择避开邻接位置,距离边缘线1mm。</p> <p class="content">(5)选择加工单冠的模板进行程序运算。</p> <p class="content"><span class="bold">2.安装坯料</span></p> <p class="content"><span class="bold fontGreen">2.安装坯料</span></p> <p class="content">(1)检查机床上的刀具,按照软件模板中的参数安装在相对应的位置上,刀具刀刃在对刀仪上检测合格。</p> <p class="content">(2)把毛坯圆盘安装在夹具中,拧紧螺丝时要对称,相互用力,力量适中。</p> <p class="content">(3)按照箭头指定的方向,把安装了毛坯的夹具安装到机床工作台中,并打开气动开关将夹具固定牢固。</p> <p class="content"><span class="bold">3.加工义齿</span></p> <p class="content"><span class="bold fontGreen">3.加工义齿</span></p> <p class="content">(1)把软件运算出来的程序传输到机床,启动机床。</p> <p class="content">(2)刚启动时要将机床的速率降低,观察刀具在毛坯中起始位置的情况,以便于观察刀具轨迹是否和软件里的数据轮廓一致。若无任何问题,则将机床调至正常速率开始加工。 </p> <p class="content">(3)加工完成后,打开气动开关取出夹具,使用打磨手机将单冠取下并清洗干净。</p> <p class="content"><span class="bold">4.义齿检查</span> 将实物与数据进行对比,查看边缘的完整冠内的轮廓和冠外的形态是否符合数据要求,再带到模型上,检测密合程度。</p> class="bold fontGreen">4.义齿检查</span> 将实物与数据进行对比,查看边缘的完整冠内的轮廓和冠外的形态是否符合数据要求,再带到模型上,检测密合程度。 </p> </div> <div class="page-bottom-right">133</div> @@ -594,33 +575,30 @@ </div> </div> <div class="bodystyle"> <p class="titleQuot-1">【注意事项】</p> <p class="titleQuot-1 fTitle">【注意事项】</p> <p class="content">1.软件排版时要检查好数据在毛坯中的位置,选择规定的加工模板。</p> <p class="content">2.严格按照规定操作使用机床、夹具、刀具。</p> <p class="content">3.机床运行中不可以离开工作岗位。</p> <p class="content">4.加工出来的冠试戴到模型上时不能用力,防止损伤模型边缘。</p> <p class="right-info">(李文娟)</p> <h2 class="secondTitle">工作训练九 金属3D打印工艺设计</h2> <p class="titleQuot-1">【目的和要求】</p> <p class="titleQuot-1 fTitle">【目的和要求】</p> <p class="content">1.了解冠桥的排版步骤和支撑柱的放置。</p> <p class="content">2.了解满足打印机加工条件的要求。</p> <p class="content">3.了解打印机加工的成形过程。</p> <p class="content">4.实际观察加工完成后的冠试戴和密合程度。</p> <p class="titleQuot-1">【实训内容】</p> <p class="titleQuot-1 fTitle">【实训内容】</p> <p class="content">1.软件排版的操作方法。</p> <p class="content">2.金属3D打印的准备工作机床启动。</p> <p class="titleQuot-1">【实训学时】</p> <p class="titleQuot-1 fTitle">【实训学时】</p> <p class="content">2学时。</p> <p class="titleQuot-1">【实训用品】</p> <p class="content"><span class="bold">1.实训设备</span> 电脑、CAM bridge软件、EOSM270打印机床。</p> <p class="content"><span class="bold">2.实训材料</span> 工作基板1块。</p> <p class="titleQuot-1">【方法和步骤】</p> <p class="content"><span class="bold">1.软件的排版操作</span></p> <p class="titleQuot-1 fTitle">【实训用品】</p> <p class="content"><span class="bold fontGreen">1.实训设备</span> 电脑、CAM bridge软件、EOSM270打印机床。</p> <p class="content"><span class="bold fontGreen">2.实训材料</span> 工作基板1块。</p> <p class="titleQuot-1 fTitle">【方法和步骤】</p> <p class="content"><span class="bold fontGreen">1.软件的排版操作</span></p> <p class="content">(1)接收设计完成的STL数据并检查数据是否有破损或碎片的情况,保证数据完整。</p> <p class="content">(2)将数据导入软件中,选择不同种类分别放置在各自的区域,使用3D调整功能检查每个数据相对于工作基板是否保持高度一致。</p> </div> <div class="page-bottom-left">134</div> </div> @@ -636,7 +614,7 @@ <div class="bodystyle"> <p class="content">(3)自动添加支撑柱,在陡峭和桥体较厚的位置手动增加支撑柱,防止变形。</p> <p class="content">(4)调整和添加支撑柱后,软件把三维数据转化为二维数据传输至机床准备加工。</p> <p class="content"><span class="bold">2.机床准备和加工</span></p> <p class="content"><span class="bold fontGreen titleLeftmove">2.机床准备和加工</span></p> <p class="content"> (1)工作基板需经过喷砂后使得表面变成磨砂状态,这样可以使第一层铺粉变得均匀,用打磨工具去除边角的毛刺倒角以便更好地保护刮刀,用乙醇擦拭干净基板表面使第一层打印可以与基板更好地连接。</p> <p class="content"> @@ -645,8 +623,9 @@ <p class="content">(3)工作舱内开始充氮气,使得氧气含量降低至0.8%以下,刮刀预铺粉将工作基板表面均匀铺上第一层粉末。</p> <p class="content">(4)启动机床开始加工,在加工过程中观察支撑区域的激光扫描路径和数据区域的激光路径的区别。打印完成后取出基板放到加热炉内做应力释放。</p> <p class="content"><span class="bold">3.义齿检查</span> 取下牙冠,将实物与数据进行对比,查看边缘的完整、冠内的轮廓和冠外的形态是否符合数据要求,再试戴到模型上,检测密合程度。</p> <p class="titleQuot-1">【注意事项】</p> class="bold fontGreen">3.义齿检查</span> 取下牙冠,将实物与数据进行对比,查看边缘的完整、冠内的轮廓和冠外的形态是否符合数据要求,再试戴到模型上,检测密合程度。 </p> <p class="titleQuot-1 fTitle">【注意事项】</p> <p class="content">1.软件排版时要检查好数据,手动调整支撑柱的密度。</p> <p class="content">2.基板的调整必须在规定的范围内,防止出现第一层打印失败。</p> <p class="content">3.加工出来的冠试戴到模型上时不能用力,防止损伤模型边缘。</p> @@ -659,7 +638,7 @@ <div class="page-box" page="142"> <div v-if="showPageList.indexOf(142) > -1"> <div class="bodystyle"> <h1 class="firstTitle-l mb-70 pt-70">参考文献</h1> <h1 class="firstTitle-l mb-70 pt-70 bold">参考文献</h1> <p class="content">[1]王勇.口腔数字化技术[M].北京:人民卫生出版社,2018.</p> <p class="content">[2]R.马斯里,C.F.德里斯科尔.口腔数字化技术临床应用[M].任光辉,董凯译.北京:化学工业出版社.2018.</p> <p class="content">[3]赵世勇.数字化种植导板临床应用技术图解[M].北京:人民卫生出版社,2018.</p> @@ -678,12 +657,29 @@ <script> import bookVideo from "@/components/bookVideo/index.vue"; export default { name: "chapterSeven", props: { showPageList: { type: Array, }, getResourceInfo: { type: Function, // 明确指定它是一个函数 required: true, }, }, components: { bookVideo, }, data() { return { }; }, mounted() { }, methods: { }, } </script> src/books/digitalDentalRestorationTechnology/view/components/index.vue
@@ -1,972 +1,771 @@ <template> <div class="page-main" @scroll="throttledScrollHandler"> <div id="searchDomBox" style="display: none"> <div id="searchContent"></div> </div> <div class="page-content" :style="{ fontSize: fontSize + 'px', transform: `scale(${pageZoom})`, transformOrigin: 'center top', }"> <pageHeader v-if="showCatalogList.indexOf(1) > -1" :showPageList="loadPageList"></pageHeader> <chapterOne v-if="showCatalogList.indexOf(2) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterOne> <chapterTwo v-if="showCatalogList.indexOf(3) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterTwo> <chapterThree v-if="showCatalogList.indexOf(4) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterThree> <chapterFour v-if="showCatalogList.indexOf(5) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterFour> <chapterFive v-if="showCatalogList.indexOf(6) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterFive> <chapterSix v-if="showCatalogList.indexOf(7) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterSix> <chapterSeven v-if="showCatalogList.indexOf(8) > -1" :showPageList="loadPageList" :resourceList="resourceList"> </chapterSeven> </div> <div class="page-main" @scroll="throttledScrollHandler"> <div id="searchDomBox" style="display: none"> <div id="searchContent"></div> </div> <div class="page-content" :style="{ fontSize: fontSize + 'px', transform: `scale(${pageZoom})`, transformOrigin: 'center top', }"> <pageHeader v-if="showCatalogList.indexOf(1) > -1" :showPageList="loadPageList"></pageHeader> <chapterOne v-if="showCatalogList.indexOf(2) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun" :interfaceQuestion="bookQuestionsList"> </chapterOne> <chapterTwo v-if="showCatalogList.indexOf(3) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun" :interfaceQuestion="bookQuestionsList"> </chapterTwo> <chapterThree v-if="showCatalogList.indexOf(4) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun" :interfaceQuestion="bookQuestionsList"> </chapterThree> <chapterFour v-if="showCatalogList.indexOf(5) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun" :interfaceQuestion="bookQuestionsList"> </chapterFour> <chapterFive v-if="showCatalogList.indexOf(6) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun" :interfaceQuestion="bookQuestionsList"> </chapterFive> <chapterSix v-if="showCatalogList.indexOf(7) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun" :interfaceQuestion="bookQuestionsList"> </chapterSix> <chapterSeven v-if="showCatalogList.indexOf(8) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun" :interfaceQuestion="bookQuestionsList"> </chapterSeven> </div> </div> </template> <script> import Vue from "vue"; import pageHeader from "./header.vue"; import chapterOne from "./chapter001.vue" import chapterTwo from "./chapter002.vue" import chapterThree from "./chapter003.vue" import chapterFour from "./chapter004.vue" import chapterFive from "./chapter005.vue" import chapterSix from "./chapter006.vue" import chapterSeven from "./chapter007.vue" import chapterOne from "./chapter001.vue"; import chapterTwo from "./chapter002.vue"; import chapterThree from "./chapter003.vue"; import chapterFour from "./chapter004.vue"; import chapterFive from "./chapter005.vue"; import chapterSix from "./chapter006.vue"; import chapterSeven from "./chapter007.vue"; import NoteIcon from "@/assets/images/biji.png"; import MG from "@/assets/js/middleGround/WebMiddleGroundApi"; import _ from "lodash"; import Swiper from "swiper/bundle"; import "swiper/swiper-bundle.css"; import Viewer from "viewerjs"; import "viewerjs/dist/viewer.css"; export default { name: "pageContent", data() { return { catalogLength: 8, // 总章节数 showCatalogList: [], // 显示的章节 loadThreshold: 300, // 触发加载阈值 throttleThreshold: 100, // 节流阈值 previousScrollTop: 0, throttledScrollHandler: null, observer: null, loadPageObserver: null, loadPageList: [], questionDataMap: {}, renderSignMap: {}, highlightData: null, audioPath: "", currentTime: null, videoList: [], resourceList: {}, }; name: "pageContent", data() { return { catalogLength: 8, // 总章节数 showCatalogList: [], // 显示的章节 loadThreshold: 300, // 触发加载阈值 throttleThreshold: 100, // 节流阈值 previousScrollTop: 0, throttledScrollHandler: null, observer: null, loadPageObserver: null, loadPageList: [], questionDataMap: {}, renderSignMap: {}, highlightData: null, audioPath: "", currentTime: null, videoList: [], resourceList: [], bookQuestionsList: [], }; }, computed: { fontSize() { this.transformDom(this.$store.state.qiankun.fontSize); return this.$store.state.qiankun.fontSize ? this.$store.state.qiankun.fontSize : 14; }, computed: { fontSize() { this.transformDom(this.$store.state.qiankun.fontSize); return this.$store.state.qiankun.fontSize ? this.$store.state.qiankun.fontSize : 14; }, pageZoom() { return this.$store.state.qiankun.scale ? this.$store.state.qiankun.scale / 100 : 1; }, pageZoom() { return this.$store.state.qiankun.scale ? this.$store.state.qiankun.scale / 100 : 1; }, watch: { showCatalogList: { handler(newVal, oldVal) { if ( this.$store.state.qiankun && this.$store.state.qiankun.catalogChange ) { // 调用父层方法 this.$store.state.qiankun.catalogChange({ showCatalogList: newVal, }); } // 启动页码观察 setTimeout(() => { this.initObservation(); this.initThemeColor(); }, 500); }, }, loadPageList: { handler(newVal, oldVal) { setTimeout(() => { this.transformDom(this.$store.state.qiankun.fontSize); this.initSwiper(); this.initViewer(); this.closeAudio(); this.closeVideo(); }, 200); }, }, pageZoom: { handler(newVal, oldVal) { const scrollBox = ( this.container ? this.container : document ).querySelector(".page-main"); scrollBox.scrollTop = (scrollBox.scrollTop / oldVal) * newVal; }, }, resourceList: { handler(newVal, oldVal) { this.resourceList = newVal; }, }, }, mounted() { // 默认加载章节 this.showCatalogList = [1]; // 滚动监听节流 this.throttledScrollHandler = _.throttle( this.scrollFun, this.throttleThreshold, { leading: true, trailing: false } ); // 定义子层方法 if (this.setGlobalState) { // 提供页面跳转功能 this.setGlobalState({ gotoPage: (catalog, page) => { this.gotoPage(catalog, page); }, // 渲染笔记、高亮、划线 renderSign: (type, data) => { // 因为调整为页面懒加载,所以渲染标记也需要按照页面进行处理,先储存数据,页面加载完成再渲染对应的标记; this.handelSignData(type, data); // this.renderSign(type, data); }, // 删除笔记、高亮、划线 delSign: (data) => { this.delSign(data); }, // 全文检索 searchBookByKeyword: (keyword) => { return this.searchTextByPage(keyword); }, // 跳转检索结果位置 jumpSearchItem: (data) => { this.searchItemLocation(data); }, }); }, watch: { showCatalogList: { handler(newVal, oldVal) { if ( this.$store.state.qiankun && this.$store.state.qiankun.catalogChange ) { // 调用父层方法 this.$store.state.qiankun.catalogChange({ showCatalogList: newVal, }); } // 创建一个新的 Intersection Observer 实例,用于观察目标元素和执行相应的回调函数。 // new IntersectionObserver(callback, options):使用之前定义的 callback 回调函数和 options 配置选项来初始化 Intersection Observer 实例。 this.observer = new IntersectionObserver(this.pageChangeCallback, { root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。 rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合 threshold: 0.5, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。 }); this.loadPageObserver = new IntersectionObserver(this.loadPageCallback, { root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。 rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合 threshold: 0, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。 }); // this.getBookResourceList(); // 启动页码观察 setTimeout(() => { this.initObservation(); this.initThemeColor(); this.initObservation(); }, 500); // 测试页面跳转 // setTimeout(() => { // this.gotoPage(8, 143); // }, 500); // const pageDom = (this.container ? this.container : document) // .querySelector("#app") // .querySelectorAll(".page-box"); // 检索 // console.log(this.searchTextByPage("保护内脏器官"), "searchTextByPage"); // 检索跳转 // this.searchItemLocation({ // catalog: 2, // page: 10, // txt: " 运动系统是由骨、骨连结和骨骼肌三部分组成的。全身的骨通过骨连结组成人体骨骼(见图1-1)。骨骼是人体的支架,具有保护内脏器官、供肌肉附着和作为肌肉运动的杠杆等作用。在神经系统的支配下,肌肉收缩牵动所附着的骨绕着关节转动,使身体产生各种动作。所以,运动系统具有运动、支持和保护等功能,幼年时期的骨骼还具有造血功能。 ", // txtIndex: 57 // }); // }, 500); }, }, methods: { // setZoom1() { // let scale = this.$store.state.qiankun.scale + 10; // const scrollBox = ( // this.container ? this.container : document // ).querySelector(".page-main"); // this.$store.commit("setZoom", scale); // }, // setZoom2() { // let scale = this.$store.state.qiankun.scale - 10; // const scrollBox = ( // this.container ? this.container : document // ).querySelector(".page-main"); // this.$store.commit("setZoom", scale); // }, // 请求资源Json async getBookResourceList() { this.resourceList = await this.config.getBookResources( process.env.VUE_APP_RESOURCE_CTX + (process.env.VUE_APP_ENV == "product" ? process.env.VUE_APP_BOOK_ID : "clinicalDiseasesSummary") loadPageList: { handler(newVal, oldVal) { setTimeout(() => { this.transformDom(this.$store.state.qiankun.fontSize); this.initSwiper(); this.initViewer(); this.closeAudio(); this.closeVideo(); this.initThemeColor(); }, 200); }, }, pageZoom: { handler(newVal, oldVal) { const scrollBox = ( this.container ? this.container : document ).querySelector(".page-main"); scrollBox.scrollTop = (scrollBox.scrollTop / oldVal) * newVal; }, }, resourceList: { handler(newVal, oldVal) { this.resourceList = newVal; }, }, bookQuestionsList: { handler(newVal, oldVal) { this.bookQuestionsList = newVal; }, }, }, mounted() { // 默认加载章节 this.showCatalogList = [1]; // 滚动监听节流 this.throttledScrollHandler = _.throttle( this.scrollFun, this.throttleThreshold, { leading: true, trailing: false } ); // 定义子层方法 if (this.setGlobalState) { // 提供页面跳转功能 this.setGlobalState({ gotoPage: (catalog, page) => { this.gotoPage(catalog, page); }, // 渲染笔记、高亮、划线 renderSign: (type, data) => { // 因为调整为页面懒加载,所以渲染标记也需要按照页面进行处理,先储存数据,页面加载完成再渲染对应的标记; this.handelSignData(type, data); // this.renderSign(type, data); }, // 删除笔记、高亮、划线 delSign: (data) => { this.delSign(data); }, // 全文检索 searchBookByKeyword: (keyword) => { return this.searchTextByPage(keyword); }, // 跳转检索结果位置 jumpSearchItem: (data) => { this.searchItemLocation(data); }, }); } // 创建一个新的 Intersection Observer 实例,用于观察目标元素和执行相应的回调函数。 // new IntersectionObserver(callback, options):使用之前定义的 callback 回调函数和 options 配置选项来初始化 Intersection Observer 实例。 this.observer = new IntersectionObserver(this.pageChangeCallback, { root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。 rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合 threshold: 0.5, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。 }); this.loadPageObserver = new IntersectionObserver(this.loadPageCallback, { root: null, // 指定根元素,这里设为 null,表示选取整个视窗作为根元素。 rootMargin: "0px", // 指定根元素的边界,这里设为 "0px",表示根元素的边界和视窗的边界重合 threshold: 0, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。 }); this.getBookResourceList(); // 获取整本书题目 this.getBookQuestionList(); // 启动页码观察 setTimeout(() => { this.initObservation(); }, 500); // 测试页面跳转 // setTimeout(() => { // this.gotoPage(7, 125); // }, 500); }, methods: { // 请求资源Json getBookResourceList() { this.config .getBookResources( process.env.VUE_APP_RESOURCE_CTX + (process.env.VUE_APP_ENV == "product" ? process.env.VUE_APP_BOOK_ID : "digitalDentalRestorationTechnology") ) .then((data) => { this.resourceList = data; }) .catch((error) => { console.error("获取图书资源列表失败:", error); }); }, // 获取图书问题列表 getBookQuestionList() { let query = { storeInfo: this.config.activeBook.storeRefcode, path: "*", cmsPath: this.config.activeBook.rootCmsItemId, cmsType: "*", productId: this.config.activeBook.bookId, queryType: "*", itemFields: { Embedded_QuestionBank_Stem: [], Embedded_QuestionBank_AnalysisCon: [], Embedded_QuestionBank_Answer: [], Embedded_QuestionBank_Option: [], Embedded_QuestionBank_QuestionType: [], Embedded_QuestionBank_StemStyle: [], Embedded_QuestionBank_OptionStyle: [], Embedded_QuestionBank_KnowledgePoint: [], Embedded_QuestionBank_Difficulty: [], }, }; MG.store .getProductDetail(query) .then((res) => { let bookQuestionList = []; if (res.datas.cmsDatas[0].datas.length > 0) { res.datas.cmsDatas[0].datas.forEach((item) => { if (item.datas.Type === "questionBankItem") { bookQuestionList.push(item); } }); } this.bookQuestionsList = bookQuestionList; }) .catch((error) => { console.error("获取图书问题列表失败:", error); }); }, resourceListFun(id, key) { let data = this.resourceList.find(item => item.key == id) return key ? data[key] : data }, // 滚动监听 scrollFun(event) { this.handleVideoPicture(); // 判断向上滚动还是向下滚动 if (event.target.scrollTop > this.previousScrollTop) { this.getAduio(); // 向下 const currentScrollTop = event.target.scrollTop + event.target.offsetHeight; if ( currentScrollTop >= event.target.scrollHeight - this.loadThreshold ) { // 到达阈值 if ( this.showCatalogList[this.showCatalogList.length - 1] < this.catalogLength ) { // 加载下一章 this.showCatalogList.push( this.showCatalogList[this.showCatalogList.length - 1] + 1 ); }, // 滚动监听 scrollFun(event) { this.handleVideoPicture(); // 判断向上滚动还是向下滚动 if (event.target.scrollTop > this.previousScrollTop) { this.getAduio(); // 向下 const currentScrollTop = event.target.scrollTop + event.target.offsetHeight; if ( currentScrollTop >= event.target.scrollHeight - this.loadThreshold ) { console.log(1); // 到达阈值 if ( this.showCatalogList[this.showCatalogList.length - 1] < this.catalogLength ) { // 加载下一章 this.showCatalogList.push( this.showCatalogList[this.showCatalogList.length - 1] + 1 ); if (this.showCatalogList.length > 3) { // 超过三章隐藏顶部一章 this.showCatalogList.shift(); } } } } else if (event.target.scrollTop < this.previousScrollTop) { this.handleAudio(); // 向上 const currentScrollTop = event.target.scrollTop; if (currentScrollTop <= this.loadThreshold) { // 到达阈值 if (this.showCatalogList[0] > 0) { // 加载上一章 this.showCatalogList.unshift(this.showCatalogList[0] - 1); if (this.showCatalogList.length > 3) { // 超过三章隐藏底部一章 this.showCatalogList.pop(); } } } if (this.showCatalogList.length > 3) { // 超过三章隐藏顶部一章 this.showCatalogList.shift(); } // showCatalogList 当前显示的三个章节,watch监听传递给主应用 // 更新上一次滚动的位置 this.previousScrollTop = event.target.scrollTop; }, // 章节、页面跳转 gotoPage(catalog, page) { if (catalog >= 0 && catalog <= this.catalogLength) { // 处理渲染章节 if (catalog == 0) { this.showCatalogList = [0, 1]; } else if (catalog == this.catalogLength) { this.showCatalogList = [ this.catalogLength - 2, this.catalogLength - 1, this.catalogLength, ]; } else { this.showCatalogList = [catalog - 1, catalog, catalog + 1]; } setTimeout(() => { // 跳转页码 const pageDom = ( this.container ? this.container : document ).querySelector(`[page="${page}"]`); if (pageDom) { pageDom.scrollIntoView(); } else { console.log("页码错误!"); } }, 500); } else { console.log("章节错误!"); } } } else if (event.target.scrollTop < this.previousScrollTop) { this.handleAudio(); // 向上 const currentScrollTop = event.target.scrollTop; if (currentScrollTop <= this.loadThreshold) { // 到达阈值 if (this.showCatalogList[0] > 0) { // 加载上一章 this.showCatalogList.unshift(this.showCatalogList[0] - 1); if (this.showCatalogList.length > 3) { // 超过三章隐藏底部一章 this.showCatalogList.pop(); } }, } } } // showCatalogList 当前显示的三个章节,watch监听传递给主应用 // 更新上一次滚动的位置 this.previousScrollTop = event.target.scrollTop; }, // 章节、页面跳转 gotoPage(catalog, page) { if (catalog >= 0 && catalog <= this.catalogLength) { // 处理渲染章节 if (catalog == 0) { this.showCatalogList = [0, 1]; } else if (catalog == this.catalogLength) { this.showCatalogList = [ this.catalogLength - 2, this.catalogLength - 1, this.catalogLength, ]; } else { this.showCatalogList = [catalog - 1, catalog, catalog + 1]; } setTimeout(() => { // 跳转页码 const pageDom = ( this.container ? this.container : document ).querySelector(`[page="${page}"]`); if (pageDom) { pageDom.scrollIntoView(); } else { console.log("页码错误!"); } }, 500); } else { console.log("章节错误!"); } }, // 处理标记数据 handelSignData(type, data) { if (this.loadPageList.indexOf(Number(data.page)) > -1) { // 立即渲染 this.renderSign(type, data); // 处理标记数据 handelSignData(type, data) { if (this.loadPageList.indexOf(Number(data.page)) > -1) { // 立即渲染 this.renderSign(type, data); } // 储存数据 if (!this.renderSignMap[type]) this.renderSignMap[type] = {}; if (!this.renderSignMap[type][data.page]) this.renderSignMap[type][data.page] = []; this.renderSignMap[type][data.page].push(data); }, // 渲染标记 renderSign(type, data) { // 父层设置禁止渲染标记时不再进行渲染 if (this.$store.state.qiankun.disableSign) { return false; } const existence = ( this.container ? this.container : document ).querySelector(`[dataid="${data.id}"]`); // 去重 if (!existence) { const pageDom = ( this.container ? this.container : document ).querySelector(`[page="${data.page}"]`); // 创建 createTreeWalker 迭代器,用于遍历文本节点,保存到一个数组 const treeWalker = document.createTreeWalker( pageDom, NodeFilter.SHOW_TEXT ); const allTextNodes = []; let currentNode = treeWalker.nextNode(); while (currentNode) { allTextNodes.push(currentNode); currentNode = treeWalker.nextNode(); } for (let i = 0; i < allTextNodes.length; i++) { const textDom = allTextNodes[i]; if (textDom.textContent.indexOf(data.txt) > -1) { let reg = new RegExp(`${data.txt}`, "ig"); switch (type) { case "Highlight": // 高亮 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Highlight" dataid="${data.id}" style="background: ${data.color};" class="highLight" onclick="signClick('Highlight','${data.id}','${data.chapterNum}')">${data.txt}</span>` ); break; case "Dashing": // 划线 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Dashing" dataid="${data.id}" style="text-decoration-color:${data.color};" class="underline" onclick="signClick('Dashing','${data.id}','${data.chapterNum}')">${data.txt}</span>` ); break; case "Note": // 笔记 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Note" dataid="${data.id}" style="border-bottom-color:${data.color}" class="notesline" onclick="signClick('Note','${data.id}','${data.chapterNum}')" onmouseover="noteHover('Note','${data.id}','${data.chapterNum}')" onmouseout="noteOut('Note')">${data.txt}<img src="${NoteIcon}"/></span>` ); break; } // 储存数据 if (!this.renderSignMap[type]) this.renderSignMap[type] = {}; if (!this.renderSignMap[type][data.page]) this.renderSignMap[type][data.page] = []; this.renderSignMap[type][data.page].push(data); }, // 渲染标记 renderSign(type, data) { // 父层设置禁止渲染标记时不再进行渲染 if (this.$store.state.qiankun.disableSign) { return false; } } } }, // 删除标记渲染 delSign({ ids, type }) { if (ids && ids.length) { for (let i = 0; i < ids.length; i++) { const id = ids[i]; const dom = ( this.container ? this.container : document ).querySelector(`[dataid="${id}"]`); dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace( dom.outerHTML, dom.outerText ); } } if (type) { const doms = ( this.container ? this.container : document ).querySelectorAll(`[datatype="${type}"]`); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace( dom.outerHTML, dom.outerText ); } } }, initObservation() { const sections = ( this.container ? this.container : document ).querySelectorAll(".page-box"); sections.forEach((section) => { if (this.config.activeBook && this.config.activeBook.tryPageCount) { const page = section.getAttribute("page"); if (Number(page) > this.config.activeBook.tryPageCount) { let chapterDom = this.getParentWithClass(section, "chapter"); const chapterNum = chapterDom.getAttribute("num"); this.catalogLength = Number(chapterNum) - 1; section.remove(); return false; } } // observer 观察每个元素,以便在它们进入或离开视窗时触发回调函数。 const isObserver = section.getAttribute("observer"); const isLoadObserver = section.getAttribute("loadObserver"); if (!isObserver) { this.observer.observe(section); section.setAttribute("observer", "1"); } if (!isLoadObserver) { this.loadPageObserver.observe(section); section.setAttribute("loadObserver", "1"); } }); }, initThemeColor() { // 获取各种需要主题色的节点 const colorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-color"); const backgroundColorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-back"); const borderColorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-border"); // 获取配置的主题色 const bookThemeColor = this.config.activeBook && this.config.activeBook.bookThemeColor ? this.config.activeBook.bookThemeColor : null; const chapterThemeColor = this.config.activeBook && this.config.activeBook.chapterThemeColor ? this.config.activeBook.chapterThemeColor : null; const pageThemeColor = this.config.activeBook && this.config.activeBook.pageThemeColor ? this.config.activeBook.pageThemeColor : null; colorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.color = themeColor; } }); backgroundColorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.backgroundColor = themeColor; } }); borderColorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.borderColor = themeColor; } }); }, getParentWithClass(element, className) { while (element.parentElement) { element = element.parentElement; if (element.classList.contains(className)) { return element; } } }, pageChangeCallback(entries, observer) { //entries:代表观察到的目标元素的集合。 observer:代表观察者对象。 entries.forEach((entry) => { //entry.isIntersecting:检查当前目标元素是否与根元素相交。 if (entry.isIntersecting) { const target = entry.target; //entry.target:获取当前目标元素 const page = target.getAttribute("page"); const catalogDom = this.tool.getParentNodeByClassName( target, "chapter" ); const catalog = catalogDom.getAttribute("num"); let text = null; if (target.querySelector("p")) { text = target.querySelector("p").textContent.substring(0, 50); } // 返回页码和章节信息 if (this.$store.state.qiankun && this.$store.state.qiankun.pageChange) this.$store.state.qiankun.pageChange({ page: page, catalog: catalog, text, }); // const sections = Array.from(document.querySelectorAll(".section")); //sections:获取所有具有 .section 类名的元素,并转换为数组。 // let index = sections.findIndex((section) => section === target) + 1; //index:查找当前目标元素在 sections 数组中的索引,并加 1,用于确定当前页码。 } }); }, loadPageCallback(entries, observer) { entries.forEach(async (entry) => { if (entry.isIntersecting) { const target = entry.target; const page = target.getAttribute("page"); if (this.loadPageList.indexOf(Number(page)) == -1) { const catalogDom = this.tool.getParentNodeByClassName( target, "chapter" ); // 添加页码 this.loadPageList.push(Number(page)); const catalog = catalogDom.getAttribute("num"); // if (!this.questionDataMap[page]) { // if (testData && testData[catalog]) { // if (testData[catalog][page]) { // if (Array.isArray(testData[catalog][page])) { // this.questionDataMap[page] = await getQuestionList( // page, // testData[catalog][page], // this.config.activeBook // ); // } else { // const obj = {}; // for (let key in testData[catalog][page]) { // obj[key] = await getQuestionList( // [], // testData[catalog][page][key], // this.config.activeBook // ); // } // this.questionDataMap[page] = obj; // } // console.log("题目", this.questionDataMap); // } // } // } // 渲染这一页的标记 for (const key in this.renderSignMap) { if (this.renderSignMap[key][page]) { this.renderSignMap[key][page].forEach((item) => { this.renderSign(key, item); }); } } const existence = ( this.container ? this.container : document ).querySelector(`[dataid="${data.id}"]`); // 去重 if (!existence) { const pageDom = ( this.container ? this.container : document ).querySelector(`[page="${data.page}"]`); // 创建 createTreeWalker 迭代器,用于遍历文本节点,保存到一个数组 const treeWalker = document.createTreeWalker( pageDom, NodeFilter.SHOW_TEXT // 处理高亮 if (this.highlightData) { // 高亮行 setTimeout(() => { // 获取页面所有text节点 const pageTextList = document.createTreeWalker( target, NodeFilter.SHOW_TEXT ); const allTextNodes = []; let currentNode = treeWalker.nextNode(); // 匹配关键字 const allPageTextNodes = []; let currentNode = pageTextList.nextNode(); while (currentNode) { allTextNodes.push(currentNode); currentNode = treeWalker.nextNode(); allPageTextNodes.push(currentNode); currentNode = pageTextList.nextNode(); } for (let i = 0; i < allTextNodes.length; i++) { const textDom = allTextNodes[i]; if (textDom.textContent.indexOf(data.txt) > -1) { let reg = new RegExp(`${data.txt}`, "ig"); switch (type) { case "Highlight": // 高亮 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Highlight" dataid="${data.id}" style="background: ${data.color};" class="highLight" onclick="signClick('Highlight','${data.id}','${data.chapterNum}')">${data.txt}</span>` ); break; case "Dashing": // 划线 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Dashing" dataid="${data.id}" style="text-decoration-color:${data.color};" class="underline" onclick="signClick('Dashing','${data.id}','${data.chapterNum}')">${data.txt}</span>` ); break; case "Note": // 笔记 textDom.parentNode.innerHTML = textDom.parentNode.innerHTML.replace( reg, `<span datatype="Note" dataid="${data.id}" style="border-bottom-color:${data.color}" class="notesline" onclick="signClick('Note','${data.id}','${data.chapterNum}')" onmouseover="noteHover('Note','${data.id}','${data.chapterNum}')" onmouseout="noteOut('Note')">${data.txt}<img src="${NoteIcon}"/></span>` ); break; } } for (let i = 0; i < allPageTextNodes.length; i++) { const textDom = allPageTextNodes[i]; let txtIndex = textDom.textContent.indexOf( this.highlightData.txt ); if (txtIndex > -1) { textDom.parentNode.style.transition = "background-color 0.8s"; textDom.parentNode.scrollIntoView(); textDom.parentNode.style.backgroundColor = "#79bbf0"; setTimeout(() => { textDom.parentNode.style.backgroundColor = ""; }, 1000); } } }, 100); } }, // 删除标记渲染 delSign({ ids, type }) { if (ids && ids.length) { for (let i = 0; i < ids.length; i++) { const id = ids[i]; const dom = ( this.container ? this.container : document ).querySelector(`[dataid="${id}"]`); dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace( dom.outerHTML, dom.outerText ); } if (this.loadPageList.length > 5) { // 超过5页 this.loadPageList.shift(); } if (type) { const doms = ( this.container ? this.container : document ).querySelectorAll(`[datatype="${type}"]`); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; dom.parentNode.innerHTML = dom.parentNode.innerHTML.replace( dom.outerHTML, dom.outerText ); } } }, initObservation() { const sections = ( this.container ? this.container : document ).querySelectorAll(".page-box"); sections.forEach((section) => { if (this.config.activeBook && this.config.activeBook.tryPageCount) { const page = section.getAttribute("page"); if (Number(page) > this.config.activeBook.tryPageCount) { let chapterDom = this.getParentWithClass(section, "chapter"); const chapterNum = chapterDom.getAttribute("num"); this.catalogLength = Number(chapterNum) - 1; section.remove(); return false; } } // observer 观察每个元素,以便在它们进入或离开视窗时触发回调函数。 const isObserver = section.getAttribute("observer"); const isLoadObserver = section.getAttribute("loadObserver"); if (!isObserver) { this.observer.observe(section); section.setAttribute("observer", "1"); } if (!isLoadObserver) { this.loadPageObserver.observe(section); section.setAttribute("loadObserver", "1"); } }); }, initThemeColor() { // 获取各种需要主题色的节点 const colorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-color"); const backgroundColorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-back"); const borderColorDom = ( this.container ? this.container : document ).querySelectorAll(".theme-border"); // 获取配置的主题色 const bookThemeColor = this.config.activeBook && this.config.activeBook.bookThemeColor ? this.config.activeBook.bookThemeColor : null; const chapterThemeColor = this.config.activeBook && this.config.activeBook.chapterThemeColor ? this.config.activeBook.chapterThemeColor : null; const pageThemeColor = this.config.activeBook && this.config.activeBook.pageThemeColor ? this.config.activeBook.pageThemeColor : null; colorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.color = themeColor; } }); backgroundColorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.backgroundColor = themeColor; } }); borderColorDom.forEach((domItem) => { // 获取章节、页码 let pageDom = this.getParentWithClass(domItem, "page-box"); let chapterDom = this.getParentWithClass(domItem, "chapter"); let page, chapterNum; if (pageDom) page = pageDom.getAttribute("page"); if (chapterDom) chapterNum = chapterDom.getAttribute("num"); // 向上匹配主题色 const themeColor = page && pageThemeColor && pageThemeColor[page] ? pageThemeColor[page] : chapterNum && chapterThemeColor && chapterThemeColor[chapterNum] ? chapterThemeColor[chapterNum] : bookThemeColor; if (themeColor) { domItem.style.borderColor = themeColor; } }); }, getParentWithClass(element, className) { while (element.parentElement) { element = element.parentElement; if (element.classList.contains(className)) { return element; } } }, pageChangeCallback(entries, observer) { //entries:代表观察到的目标元素的集合。 observer:代表观察者对象。 entries.forEach((entry) => { //entry.isIntersecting:检查当前目标元素是否与根元素相交。 if (entry.isIntersecting) { const target = entry.target; //entry.target:获取当前目标元素 const page = target.getAttribute("page"); const catalogDom = this.tool.getParentNodeByClassName( target, "chapter" ); const catalog = catalogDom.getAttribute("num"); let text = null; if (target.querySelector("p")) { text = target.querySelector("p").textContent.substring(0, 50); } // 返回页码和章节信息 if (this.$store.state.qiankun && this.$store.state.qiankun.pageChange) this.$store.state.qiankun.pageChange({ page: page, catalog: catalog, text, }); // const sections = Array.from(document.querySelectorAll(".section")); //sections:获取所有具有 .section 类名的元素,并转换为数组。 // let index = sections.findIndex((section) => section === target) + 1; //index:查找当前目标元素在 sections 数组中的索引,并加 1,用于确定当前页码。 } }); }, loadPageCallback(entries, observer) { entries.forEach(async (entry) => { if (entry.isIntersecting) { const target = entry.target; const page = target.getAttribute("page"); if (this.loadPageList.indexOf(Number(page)) == -1) { const catalogDom = this.tool.getParentNodeByClassName( target, "chapter" ); // 添加页码 this.loadPageList.push(Number(page)); const catalog = catalogDom.getAttribute("num"); // if (!this.questionDataMap[page]) { // if (testData && testData[catalog]) { // if (testData[catalog][page]) { // if (Array.isArray(testData[catalog][page])) { // this.questionDataMap[page] = await getQuestionList( // page, // testData[catalog][page], // this.config.activeBook // ); // } else { // const obj = {}; // for (let key in testData[catalog][page]) { // obj[key] = await getQuestionList( // [], // testData[catalog][page][key], // this.config.activeBook // ); // } // this.questionDataMap[page] = obj; // } // console.log("题目", this.questionDataMap); // } // } // } // 渲染这一页的标记 for (const key in this.renderSignMap) { if (this.renderSignMap[key][page]) { this.renderSignMap[key][page].forEach((item) => { this.renderSign(key, item); }); } } // 处理高亮 if (this.highlightData) { // 高亮行 setTimeout(() => { // 获取页面所有text节点 const pageTextList = document.createTreeWalker( target, NodeFilter.SHOW_TEXT ); // 匹配关键字 const allPageTextNodes = []; let currentNode = pageTextList.nextNode(); while (currentNode) { allPageTextNodes.push(currentNode); currentNode = pageTextList.nextNode(); } for (let i = 0; i < allPageTextNodes.length; i++) { const textDom = allPageTextNodes[i]; let txtIndex = textDom.textContent.indexOf( this.highlightData.txt ); if (txtIndex > -1) { textDom.parentNode.style.transition = "background-color 0.8s"; textDom.parentNode.scrollIntoView(); textDom.parentNode.style.backgroundColor = "#79bbf0"; setTimeout(() => { textDom.parentNode.style.backgroundColor = ""; }, 1000); } } }, 100); } if (this.loadPageList.length > 5) { // 超过5页 this.loadPageList.shift(); } } } }); }, initSwiper() { const doms = ( this.container ? this.container : document ).querySelectorAll(".swiper-img"); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; new Swiper(dom, { loop: false, // 无缝 autoplay: { //自动开始 delay: 3000, //时间间隔 disableOnInteraction: false, //*手动操作轮播图后不会暂停* }, paginationClickable: true, slidesPerView: 1, // 一组三个 spaceBetween: 30, // 间隔 // 如果需要前进后退按钮 navigation: { nextEl: dom.querySelector(".swiper-button-next"), prevEl: dom.querySelector(".swiper-button-prev"), }, // 窗口变化,重新init,针对F11全屏和放大缩小,必须加 // observer: true, // observeParents: true // // 如果需要分页器 // pagination: { // el: (this.container ? this.container : document).querySelector( // ".swiper-pagination" // ), // clickable: true // 分页器可以点击 // } }); } const pptDoms = ( this.container ? this.container : document ).querySelectorAll(".swiper_ppt"); for (let i = 0; i < pptDoms.length; i++) { const dom = pptDoms[i]; new Swiper(dom, { loop: false, // 无缝 autoplay: false, paginationClickable: true, slidesPerView: 1, // 一组三个 spaceBetween: 30, // 间隔 // 如果需要前进后退按钮 navigation: { nextEl: dom.querySelector(".swiper-button-next"), prevEl: dom.querySelector(".swiper-button-prev"), }, // 窗口变化,重新init,针对F11全屏和放大缩小,必须加 observer: true, observeParents: true, on: { init: (value) => { let currentPage = value.activeIndex + 1; // 获取当前页(从1开始计数) let totalPages = value.slides.length; // 获取总页数 var paginationInfoEl = dom.querySelector(".pageBox"); if (paginationInfoEl) paginationInfoEl.textContent = currentPage + "/" + totalPages; }, slideChange: (value) => { let currentPage = value.activeIndex + 1; // 获取当前页(从1开始计数) let totalPages = value.slides.length; // 获取总页数 var paginationInfoEl = dom.querySelector(".pageBox"); if (paginationInfoEl) paginationInfoEl.textContent = currentPage + "/" + totalPages; }, }, }); } }, initViewer() { const doms = ( this.container ? this.container : document ).querySelectorAll(".openImgBox"); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; new Viewer(dom, { container: this.container ? this.container.querySelector("#app") : "body", navbar: true, // 显示导航栏 toolbar: true, // 显示工具栏 title: true, // 显示标题 }); } }, // 根据关键字全文检索 searchTextByPage(keyword) { const searchResult = []; let catalogIndex = 0; // 所有章节组件(每本书制作时单独配置) const pageData = { pageHeader, chapterOne, chapterTwo, chapterThree, chapterFour, chapterFive, chapterSix, chapterSeven }; // 遍历所有章节文件 for (const key in pageData) { catalogIndex++; let pageComponent, pageExample; // 先渲染一次当前章节文件(这时页面的内容为空),获取页码信息 pageComponent = Vue.extend(pageData[key]); pageExample = new pageComponent({ propsData: { showPageList: [], questionData: {}, isSearch: true, }, }); pageExample.$mount( (this.container ? this.container : document).querySelector( "#searchContent" ) ); // 获取页码 const pageDom = (this.container ? this.container : document) .querySelector("#searchDomBox") .querySelectorAll(".page-box"); const pages = []; for (let i = 0; i < pageDom.length; i++) { const pageDomItem = pageDom[i]; pages.push(Number(pageDomItem.getAttribute("page"))); } // 获取页面结束,卸载销毁 pageExample.$destroy(); (this.container ? this.container : document).querySelector( "#searchDomBox" ).innerHTML = '<div id="searchContent"></div>'; // 遍历页码 if (pages.length) { for (let i = 0; i < pages.length; i++) { const pageNum = pages[i]; // 动态渲染对应章节的页码 pageComponent = Vue.extend(pageData[key]); pageExample = new pageComponent({ propsData: { showPageList: [pageNum], questionData: {}, isSearch: true, }, }); pageExample.$mount( (this.container ? this.container : document).querySelector( "#searchContent" ) ); // 获取对应页面dom const thisPageDom = (this.container ? this.container : document) .querySelector("#searchDomBox") .querySelector(`[page="${pageNum}"]`); if (thisPageDom) { // 获取页面所有text节点 const pageTextList = document.createTreeWalker( thisPageDom, NodeFilter.SHOW_TEXT ); // 匹配关键字 const allPageTextNodes = []; let currentNode = pageTextList.nextNode(); while (currentNode) { allPageTextNodes.push(currentNode); currentNode = pageTextList.nextNode(); } for (let i = 0; i < allPageTextNodes.length; i++) { const textDom = allPageTextNodes[i]; let txtIndex = textDom.textContent.indexOf(keyword); if (txtIndex > -1) { // 记录关键字所在页码、章节以及匹配到的段落 searchResult.push({ page: pageNum, catalog: catalogIndex, txt: textDom.textContent, txtIndex: txtIndex, }); } } // 结束,卸载销毁 pageExample.$destroy(); (this.container ? this.container : document).querySelector( "#searchDomBox" ).innerHTML = '<div id="searchContent"></div>'; } } } } // 输出搜索结果 console.log(searchResult); return searchResult; }, // 根据检索结果跳转对应位置并高亮 searchItemLocation(data) { // 记录高亮信息 this.highlightData = data; // 跳转 this.gotoPage(data.catalog, data.page, () => { }); }, // 页面向下滚动,音频小窗播放功能 getAduio() { let allVideo = ( this.container ? this.container : document ).querySelectorAll(".audio"); allVideo = Array.from(allVideo); this.videoList = allVideo; if (allVideo.length) { // 查找播放状态的最后一条音频 const playAudio = allVideo .reverse() .find((item) => item.paused == false); if (playAudio) { const bottomGap = playAudio.getBoundingClientRect().bottom; if (bottomGap < 0) { playAudio.pause(); this.audioPath = playAudio.src; this.currentTime = playAudio.currentTime; } } } }, // 页面向上滚动,音频小窗回收 handleAudio() { if (!this.audioPath) return false; let allVideo = ( this.container ? this.container : document ).querySelectorAll(".audio"); allVideo = Array.from(allVideo); if (allVideo.length) { //查找与小窗播放音频同源的页面audio DOM const playAudio = allVideo.find((item) => item.src == this.audioPath); if (playAudio) { const bottomGap = playAudio.getBoundingClientRect().bottom; if (bottomGap >= 0) { if (this.$refs.audioPlayer) { const playerState = this.$refs.audioPlayer.getVideoPlayer(); this.audioPath = ""; playAudio.currentTime = playerState.currentTime; if (!playerState.paused) playAudio.play(); } } } } }, // 关闭mini video closeMiniAudio() { this.audioPath = ""; }, // 点击音频播放,关闭其他音频 closeAudio() { let allAudio = ( this.container ? this.container : document ).querySelectorAll(".audio"); for (let index = 0; index < allAudio.length; index++) { const item = allAudio[index]; item.addEventListener("play", () => { const audioList = Array.from(allAudio); for (let cindex = 0; cindex < audioList.length; cindex++) { const citem = audioList[cindex]; if (citem.currentSrc != item.src) { citem.pause(); } } this.closeMiniAudio(); }); } }, // 点击视频关闭其他 closeVideo() { let allVideo = ( this.container ? this.container : document ).querySelectorAll(".video"); for (let index = 0; index < allVideo.length; index++) { const item = allVideo[index]; item.addEventListener("playing", (item) => { const path = item.srcElement.src; const videoList = Array.from(allVideo); for (let cindex = 0; cindex < videoList.length; cindex++) { const citem = videoList[cindex]; if (citem.currentSrc != path && path) { citem.pause(); } } }); } }, // 视频小窗 handleVideoPicture() { let doms = (this.container ? this.container : document).querySelectorAll( ".video" ); doms = Array.from(doms); if (!doms.length) return false; const playVudio = doms.reverse().find((item) => item.paused == false); if (playVudio) { const bottomGap = playVudio.getBoundingClientRect().bottom; const topGap = playVudio.getBoundingClientRect().top; if (bottomGap < 0 || topGap > window.innerHeight) { try { if (playVudio.readyState) playVudio.requestPictureInPicture(); } catch (error) { console.log(error, "小窗错误error"); } } } }, //其他类名下字体大小变化 transformDom(fs) { if (!fs) return; let doms = (this.container ? this.container : document).querySelectorAll( ".block" ); if (!doms.length) return; for (let index = 0; index < doms.length; index++) { const dom = doms[index]; dom.style.fontSize = fs + "px"; } }, } } }); }, components: { initSwiper() { const doms = ( this.container ? this.container : document ).querySelectorAll(".swiper-img"); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; new Swiper(dom, { loop: false, // 无缝 autoplay: { //自动开始 delay: 3000, //时间间隔 disableOnInteraction: false, //*手动操作轮播图后不会暂停* }, paginationClickable: true, slidesPerView: 1, // 一组三个 spaceBetween: 30, // 间隔 // 如果需要前进后退按钮 navigation: { nextEl: dom.querySelector(".swiper-button-next"), prevEl: dom.querySelector(".swiper-button-prev"), }, // 窗口变化,重新init,针对F11全屏和放大缩小,必须加 // observer: true, // observeParents: true // // 如果需要分页器 // pagination: { // el: (this.container ? this.container : document).querySelector( // ".swiper-pagination" // ), // clickable: true // 分页器可以点击 // } }); } const pptDoms = ( this.container ? this.container : document ).querySelectorAll(".swiper_ppt"); for (let i = 0; i < pptDoms.length; i++) { const dom = pptDoms[i]; new Swiper(dom, { loop: false, // 无缝 autoplay: false, paginationClickable: true, slidesPerView: 1, // 一组三个 spaceBetween: 30, // 间隔 // 如果需要前进后退按钮 navigation: { nextEl: dom.querySelector(".swiper-button-next"), prevEl: dom.querySelector(".swiper-button-prev"), }, // 窗口变化,重新init,针对F11全屏和放大缩小,必须加 observer: true, observeParents: true, on: { init: (value) => { let currentPage = value.activeIndex + 1; // 获取当前页(从1开始计数) let totalPages = value.slides.length; // 获取总页数 var paginationInfoEl = dom.querySelector(".pageBox"); if (paginationInfoEl) paginationInfoEl.textContent = currentPage + "/" + totalPages; }, slideChange: (value) => { let currentPage = value.activeIndex + 1; // 获取当前页(从1开始计数) let totalPages = value.slides.length; // 获取总页数 var paginationInfoEl = dom.querySelector(".pageBox"); if (paginationInfoEl) paginationInfoEl.textContent = currentPage + "/" + totalPages; }, }, }); } }, initViewer() { const doms = ( this.container ? this.container : document ).querySelectorAll(".openImgBox"); for (let i = 0; i < doms.length; i++) { const dom = doms[i]; new Viewer(dom, { container: this.container ? this.container.querySelector("#app") : "body", navbar: true, // 显示导航栏 toolbar: true, // 显示工具栏 title: true, // 显示标题 }); } }, // 根据关键字全文检索 searchTextByPage(keyword) { const searchResult = []; let catalogIndex = 0; // 所有章节组件(每本书制作时单独配置) const pageData = { pageHeader, chapterOne, chapterTwo, @@ -974,22 +773,252 @@ chapterFour, chapterFive, chapterSix, chapterSeven chapterSeven, }; // 遍历所有章节文件 for (const key in pageData) { catalogIndex++; let pageComponent, pageExample; // 先渲染一次当前章节文件(这时页面的内容为空),获取页码信息 pageComponent = Vue.extend(pageData[key]); pageExample = new pageComponent({ propsData: { showPageList: [], questionData: {}, isSearch: true, }, }); pageExample.$mount( (this.container ? this.container : document).querySelector( "#searchContent" ) ); // 获取页码 const pageDom = (this.container ? this.container : document) .querySelector("#searchDomBox") .querySelectorAll(".page-box"); const pages = []; for (let i = 0; i < pageDom.length; i++) { const pageDomItem = pageDom[i]; pages.push(Number(pageDomItem.getAttribute("page"))); } // 获取页面结束,卸载销毁 pageExample.$destroy(); (this.container ? this.container : document).querySelector( "#searchDomBox" ).innerHTML = '<div id="searchContent"></div>'; // 遍历页码 if (pages.length) { for (let i = 0; i < pages.length; i++) { const pageNum = pages[i]; // 动态渲染对应章节的页码 pageComponent = Vue.extend(pageData[key]); pageExample = new pageComponent({ propsData: { showPageList: [pageNum], questionData: {}, isSearch: true, }, }); pageExample.$mount( (this.container ? this.container : document).querySelector( "#searchContent" ) ); // 获取对应页面dom const thisPageDom = (this.container ? this.container : document) .querySelector("#searchDomBox") .querySelector(`[page="${pageNum}"]`); if (thisPageDom) { // 获取页面所有text节点 const pageTextList = document.createTreeWalker( thisPageDom, NodeFilter.SHOW_TEXT ); // 匹配关键字 const allPageTextNodes = []; let currentNode = pageTextList.nextNode(); while (currentNode) { allPageTextNodes.push(currentNode); currentNode = pageTextList.nextNode(); } for (let i = 0; i < allPageTextNodes.length; i++) { const textDom = allPageTextNodes[i]; let txtIndex = textDom.textContent.indexOf(keyword); if (txtIndex > -1) { // 记录关键字所在页码、章节以及匹配到的段落 searchResult.push({ page: pageNum, catalog: catalogIndex, txt: textDom.textContent, txtIndex: txtIndex, }); } } // 结束,卸载销毁 pageExample.$destroy(); (this.container ? this.container : document).querySelector( "#searchDomBox" ).innerHTML = '<div id="searchContent"></div>'; } } } } // 输出搜索结果 console.log(searchResult); return searchResult; }, // 根据检索结果跳转对应位置并高亮 searchItemLocation(data) { // 记录高亮信息 this.highlightData = data; // 跳转 this.gotoPage(data.catalog, data.page, () => { }); }, // 页面向下滚动,音频小窗播放功能 getAduio() { let allVideo = ( this.container ? this.container : document ).querySelectorAll(".audio"); allVideo = Array.from(allVideo); this.videoList = allVideo; if (allVideo.length) { // 查找播放状态的最后一条音频 const playAudio = allVideo .reverse() .find((item) => item.paused == false); if (playAudio) { const bottomGap = playAudio.getBoundingClientRect().bottom; if (bottomGap < 0) { playAudio.pause(); this.audioPath = playAudio.src; this.currentTime = playAudio.currentTime; } } } }, // 页面向上滚动,音频小窗回收 handleAudio() { if (!this.audioPath) return false; let allVideo = ( this.container ? this.container : document ).querySelectorAll(".audio"); allVideo = Array.from(allVideo); if (allVideo.length) { //查找与小窗播放音频同源的页面audio DOM const playAudio = allVideo.find((item) => item.src == this.audioPath); if (playAudio) { const bottomGap = playAudio.getBoundingClientRect().bottom; if (bottomGap >= 0) { if (this.$refs.audioPlayer) { const playerState = this.$refs.audioPlayer.getVideoPlayer(); this.audioPath = ""; playAudio.currentTime = playerState.currentTime; if (!playerState.paused) playAudio.play(); } } } } }, // 关闭mini video closeMiniAudio() { this.audioPath = ""; }, // 点击音频播放,关闭其他音频 closeAudio() { let allAudio = ( this.container ? this.container : document ).querySelectorAll(".audio"); for (let index = 0; index < allAudio.length; index++) { const item = allAudio[index]; item.addEventListener("play", () => { const audioList = Array.from(allAudio); for (let cindex = 0; cindex < audioList.length; cindex++) { const citem = audioList[cindex]; if (citem.currentSrc != item.src) { citem.pause(); } } this.closeMiniAudio(); }); } }, // 点击视频关闭其他 closeVideo() { let allVideo = ( this.container ? this.container : document ).querySelectorAll(".video"); for (let index = 0; index < allVideo.length; index++) { const item = allVideo[index]; item.addEventListener("playing", (item) => { const path = item.srcElement.src; const videoList = Array.from(allVideo); for (let cindex = 0; cindex < videoList.length; cindex++) { const citem = videoList[cindex]; if (citem.currentSrc != path && path) { citem.pause(); } } }); } }, // 视频小窗 handleVideoPicture() { let doms = (this.container ? this.container : document).querySelectorAll( ".video" ); doms = Array.from(doms); if (!doms.length) return false; const playVudio = doms.reverse().find((item) => item.paused == false); if (playVudio) { const bottomGap = playVudio.getBoundingClientRect().bottom; const topGap = playVudio.getBoundingClientRect().top; if (bottomGap < 0 || topGap > window.innerHeight) { try { if (playVudio.readyState) playVudio.requestPictureInPicture(); } catch (error) { console.log(error, "小窗错误error"); } } } }, //其他类名下字体大小变化 transformDom(fs) { if (!fs) return; let doms = (this.container ? this.container : document).querySelectorAll( ".block" ); if (!doms.length) return; for (let index = 0; index < doms.length; index++) { const dom = doms[index]; dom.style.fontSize = fs + "px"; } }, }, components: { pageHeader, chapterOne, chapterTwo, chapterThree, chapterFour, chapterFive, chapterSix, chapterSeven, }, }; </script> <style lang="less" scoped> .page-main { width: 100% !important; height: 100% !important; overflow: auto; width: 100% !important; height: 100% !important; overflow: auto; .page-content { max-width: 816px; min-width: 375px; margin: 0 auto; padding-bottom: 100px; } .page-content { max-width: 816px; min-width: 375px; margin: 0 auto; padding-bottom: 100px; } } </style> src/books/exerciseTherapyTechniques/assets/images/0158-01.jpgsrc/books/exerciseTherapyTechniques/assets/images/0163-01.jpgsrc/books/medicalImagingAnatomy/assets/images/0095-01.jpgsrc/books/medicalImagingAnatomy/assets/images/0271-01.jpgsrc/books/medicalImagingAnatomy/assets/images/0311-02.jpgsrc/books/preventiveDentistry/assets/examinationList.js
@@ -1,7 +1,7 @@ const testData = { 2: { 18: [ 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 21987, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, ], }, }; src/books/preventiveDentistry/view/components/chapter001.vue
@@ -193,7 +193,7 @@ <p class="content"> 公元752年,王焘在《外台秘要》中已有柳枝制刷的记载,将杨柳枝用牙咬成絮状,揩刷牙面。宋代日本名僧道元禅师在《正法眼藏》中记载“僧侣们除漱口之外,尚用剪成寸余之马尾,植于牛角制成的器物上,用以刷洗牙”。公元916—1125年,辽代出现了骨柄植毛牙刷,与近代牙刷相似,国外17世纪才有植毛牙刷。公元1281年罗元益所著《卫生宝鉴》中提到要早晚刷牙2次,忽思慧在《饮膳正要》中提出“凡清旦刷牙,不如夜刷牙齿疾不生”,强调晚上刷牙的重要性。考古发现,明朝帝王们的一些牙上有楔状缺损,说明在那时刷牙就已成为习惯。 </p> <h4 class="fourthTitle ">二、科学形成时期</h4> <h4 class="fourthTitle">二、科学形成时期</h4> <bookVideo :videoInfo="getResourceInfo('Z16')" :BookId="config.activeBook.bookId"></bookVideo> <p class="content"> 在口腔预防医学的历史上,发现口腔细菌、认识氟化物及窝沟封闭剂的诞生,大大推动了口腔预防医学的发展。前两者让人们认识了引起口腔疾病的病因,为针对性地开展口腔疾病预防奠定了基础。第三者使口腔预防有了有效的预防措施,减少了龋病的发生。 @@ -347,7 +347,7 @@ </div> </div> <preView :md5="p_md5" :pdfTitle="somePdfTitleValue" ref="pdfDialogRef"></preView> <dialogExaminations :cardList="interfaceQuestion" :questionIDList=questionIDList :page="questionNum" <dialogExaminations :cardList="interfaceQuestion" :questionIDList="questionIDList" :page="questionNum" :questionTitle="questionTitleMain" ref="dialogRef"> </dialogExaminations> </div> @@ -365,18 +365,18 @@ }, getResourceInfo: { type: Function, // 明确指定它是一个函数 required: true required: true, }, interfaceQuestion: { type: Array, required: true, default: () => [], } }, }, components: { preView, bookVideo, dialogExaminations dialogExaminations, }, data() { return { @@ -387,7 +387,6 @@ questionTitleMain: "", questionIDList: [], chapterNum: 2, cardArrayList: [], examinations: [ { questionTitleMain: "拓展练习", @@ -397,31 +396,12 @@ questionData: { one: "", }, }; }, watch: { interfaceQuestion: { handler(newValue, oldValue) { console.log('--- 子组件:interfaceQuestion 更新了! ---'); console.log('新值 (newValue):', newValue); console.log('旧值 (oldValue):', oldValue); if (newValue && newValue.length > 0) { } }, deep: true, immediate: true }, }, mounted() { console.log(this.interfaceQuestion, "interfaceQuestion"); this.getQuestionData() this.getQuestionData(); }, methods: { toUrl(val) { if (val != null) { this.p_md5 = val.md5; @@ -436,7 +416,9 @@ ); }, getQuestionData() { let questionData = localStorage.getItem("preventiveDentistry-book-chapter01-questionData"); let questionData = localStorage.getItem( "preventiveDentistry-book-chapter01-questionData" ); if (questionData) { this.questionData = JSON.parse(questionData); } @@ -444,15 +426,11 @@ openQuestion(num) { if (num != undefined) { this.questionNum = this.examinations[num].questionNum; console.log(this.questionNum); this.questionTitleMain = this.examinations[num].questionTitleMain; console.log(this.questionTitleMain); this.cardArrayList = this.interfaceQuestion; console.log(this.cardArrayList); this.questionIDList = testData[this.chapterNum][this.questionNum]; console.log(this.questionIDList); this.$refs.dialogRef.openDialogQuestion(); this.$nextTick(() => { this.$refs.dialogRef.openDialogQuestion(); }); } }, }, src/books/preventiveDentistry/view/components/chapter002.vue
@@ -8,7 +8,6 @@ </div> <div class="bodystyle"> <h2 class="secondTitle">第二章 口腔流行病学</h2> <div class="bodyPic"><img class="t80" src="../../assets/images/0023-02.jpg" alt="" active="true" /> </div> <p class="center"><span class="bold">素质目标</span></p> @@ -39,7 +38,6 @@ <div class="footer-container">011</div> </div> </div> <div class="page-box" page="20"> <div v-if="showPageList.indexOf(20) > -1"> <div class="header"> src/books/preventiveDentistry/view/components/index.vue
@@ -228,20 +228,6 @@ this.gotoPage(2, 18); }, 500); // const pageDom = (this.container ? this.container : document) // .querySelector("#app") // .querySelectorAll(".page-box"); // 检索 // console.log(this.searchTextByPage("保护内脏器官"), "searchTextByPage"); // 检索跳转 // this.searchItemLocation({ // catalog: 2, // page: 10, // txt: " 运动系统是由骨、骨连结和骨骼肌三部分组成的。全身的骨通过骨连结组成人体骨骼(见图1-1)。骨骼是人体的支架,具有保护内脏器官、供肌肉附着和作为肌肉运动的杠杆等作用。在神经系统的支配下,肌肉收缩牵动所附着的骨绕着关节转动,使身体产生各种动作。所以,运动系统具有运动、支持和保护等功能,幼年时期的骨骼还具有造血功能。 ", // txtIndex: 57 // }); // }, 500); }, methods: { // 请求资源Json @@ -282,19 +268,14 @@ } MG.store.getProductDetail(query) .then(res => { console.log(res.datas.cmsDatas[0].datas, "获取bookQuestionList成功"); let bookQuestionList = []; if (res.datas.cmsDatas[0].datas.length > 0) { res.datas.cmsDatas[0].datas.forEach(item => { if (item.datas.Type === "questionBankItem") { bookQuestionList.push(item); } if (item.id == 21987) { console.log(item, "21987"); } }); } console.log(bookQuestionList, "bookQuestionList"); this.bookQuestionsList = bookQuestionList; }) .catch(error => { @@ -304,8 +285,10 @@ resourceListFun(id, key) { let data = this.resourceList.find(item => item.key == id) return key ? data[key] : data console.log(data,"data"); }, // 滚动监听 scrollFun(event) { this.handleVideoPicture(); src/books/rehabilitationAssessmentTechniques/view/components/chapter1.vue
@@ -2,13 +2,15 @@ <div class="chapter" num="2"> <!-- 第12页 - 偶数页 --> <div class="page-box" page="12"> <div v-if="showPageList.indexOf(12) > -1"> <div v-if="showPageList.indexOf(12) > -1 "> <div class="bodystyle"> <h1 class="firstTitle-l">第一章 总论</h1> <div class="bodyPic"><img src="../../assets/images/0023-01.jpg" style="width:30%" <div class="bodyPic"> <img src="../../assets/images/0023-01.jpg" style="width:30%" active="true" /> </div> <div class="bodyPic"><img src="../../assets/images/0023-02.jpg" style="width:80%" <div class="bodyPic"> <img src="../../assets/images/0023-02.jpg" style="width:80%" active="true" /> </div> <p class="center"><span class="bold">素质目标</span></p> @@ -43,7 +45,7 @@ <!-- 第13页 - 奇数页 --> <div class="page-box" page="13"> <div v-if="showPageList.indexOf(13) > -1"> <div v-if="showPageList.indexOf(13) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -78,7 +80,7 @@ <!-- 第14页 - 偶数页 --> <div class="page-box" page="14"> <div v-if="showPageList.indexOf(14) > -1"> <div v-if="showPageList.indexOf(14) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 总论</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -114,7 +116,7 @@ <!-- 第15页 - 奇数页 --> <div class="page-box" page="15"> <div v-if="showPageList.indexOf(15) > -1"> <div v-if="showPageList.indexOf(15) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -151,7 +153,7 @@ <!-- 第16页 - 偶数页 --> <div class="page-box" page="16"> <div v-if="showPageList.indexOf(16) > -1"> <div v-if="showPageList.indexOf(16) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 总论</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -189,7 +191,7 @@ <!-- 第17页 - 奇数页 --> <div class="page-box" page="17"> <div v-if="showPageList.indexOf(17) > -1"> <div v-if="showPageList.indexOf(17) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -226,7 +228,7 @@ <!-- 第18页 - 偶数页 --> <div class="page-box" page="18"> <div v-if="showPageList.indexOf(18) > -1"> <div v-if="showPageList.indexOf(18) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 总论</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -267,7 +269,7 @@ <!-- 第19页 - 奇数页 --> <div class="page-box" page="19"> <div v-if="showPageList.indexOf(19) > -1"> <div v-if="showPageList.indexOf(19) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -311,7 +313,7 @@ <!-- 第20页 - 偶数页 --> <div class="page-box" page="20"> <div v-if="showPageList.indexOf(20) > -1"> <div v-if="showPageList.indexOf(20) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 总论</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -347,7 +349,7 @@ <!-- 第21页 - 奇数页 --> <div class="page-box" page="21"> <div v-if="showPageList.indexOf(21) > -1"> <div v-if="showPageList.indexOf(21) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -387,7 +389,7 @@ <!-- 第22页 - 偶数页 --> <div class="page-box" page="22"> <div v-if="showPageList.indexOf(22) > -1"> <div v-if="showPageList.indexOf(22) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 总论</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -434,7 +436,7 @@ <!-- 第23页 - 奇数页 --> <div class="page-box" page="23"> <div v-if="showPageList.indexOf(23) > -1"> <div v-if="showPageList.indexOf(23) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -485,7 +487,7 @@ <!-- 第24页 - 偶数页 --> <div class="page-box" page="24"> <div v-if="showPageList.indexOf(24) > -1"> <div v-if="showPageList.indexOf(24) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 总论</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -527,7 +529,7 @@ <!-- 第25页 - 奇数页 --> <div class="page-box" page="25"> <div v-if="showPageList.indexOf(25) > -1"> <div v-if="showPageList.indexOf(25) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -571,7 +573,7 @@ <!-- 第26页 - 偶数页 --> <div class="page-box" page="26"> <div v-if="showPageList.indexOf(26) > -1"> <div v-if="showPageList.indexOf(26) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 总论</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -617,7 +619,7 @@ <!-- 第27页 - 奇数页 --> <div class="page-box" page="27"> <div v-if="showPageList.indexOf(27) > -1"> <div v-if="showPageList.indexOf(27) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -658,7 +660,7 @@ <!-- 第28页 - 偶数页 --> <div class="page-box" page="28"> <div v-if="showPageList.indexOf(28) > -1"> <div v-if="showPageList.indexOf(28) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 总论</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -704,7 +706,7 @@ <!-- 第29页 - 奇数页 --> <div class="page-box" page="29"> <div v-if="showPageList.indexOf(29) > -1"> <div v-if="showPageList.indexOf(29) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -745,7 +747,7 @@ <!-- 第30页 - 偶数页 --> <div class="page-box" page="30"> <div v-if="showPageList.indexOf(30) > -1"> <div v-if="showPageList.indexOf(30) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 总论</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -776,7 +778,7 @@ <!-- 第31页 - 奇数页 --> <div class="page-box" page="31"> <div v-if="showPageList.indexOf(31) > -1"> <div v-if="showPageList.indexOf(31) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -818,7 +820,7 @@ <!-- 第32页 - 偶数页 --> <div class="page-box" page="32"> <div v-if="showPageList.indexOf(32) > -1"> <div v-if="showPageList.indexOf(32) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 总论</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -853,7 +855,7 @@ <!-- 第33页 - 奇数页 --> <div class="page-box" page="33"> <div v-if="showPageList.indexOf(33) > -1"> <div v-if="showPageList.indexOf(33) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -899,7 +901,7 @@ <!-- 第34页 - 偶数页 --> <div class="page-box" page="34"> <div v-if="showPageList.indexOf(34) > -1"> <div v-if="showPageList.indexOf(34) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 总论</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -946,7 +948,7 @@ <!-- 第35页 - 奇数页 --> <div class="page-box" page="35"> <div v-if="showPageList.indexOf(35) > -1"> <div v-if="showPageList.indexOf(35) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 src/books/rehabilitationAssessmentTechniques/view/components/chapter10.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="11"> <!-- 第233页 - 奇数页 --> <div class="page-box" page="233"> <div v-if="showPageList.indexOf(233) > -1"> <div v-if="showPageList.indexOf(233) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -44,7 +44,7 @@ <!-- 第234页 - 偶数页 --> <div class="page-box" page="234"> <div v-if="showPageList.indexOf(234) > -1"> <div v-if="showPageList.indexOf(234) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十章 平衡和协调功能评定</span> @@ -80,7 +80,7 @@ <!-- 第235页 - 奇数页 --> <div class="page-box" page="235"> <div v-if="showPageList.indexOf(235) > -1"> <div v-if="showPageList.indexOf(235) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -116,7 +116,7 @@ <!-- 第236页 - 偶数页 --> <div class="page-box" page="236"> <div v-if="showPageList.indexOf(236) > -1"> <div v-if="showPageList.indexOf(236) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十章 平衡和协调功能评定</span> @@ -152,7 +152,7 @@ <!-- 第237页 - 奇数页 --> <div class="page-box" page="237"> <div v-if="showPageList.indexOf(237) > -1"> <div v-if="showPageList.indexOf(237) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -192,7 +192,7 @@ <!-- 第238页 - 偶数页 --> <div class="page-box" page="238"> <div v-if="showPageList.indexOf(238) > -1"> <div v-if="showPageList.indexOf(238) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十章 平衡和协调功能评定</span> @@ -228,7 +228,7 @@ <!-- 第239页 - 奇数页 --> <div class="page-box" page="239"> <div v-if="showPageList.indexOf(239) > -1"> <div v-if="showPageList.indexOf(239) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -274,7 +274,7 @@ <!-- 第240页 - 偶数页 --> <div class="page-box" page="240"> <div v-if="showPageList.indexOf(240) > -1"> <div v-if="showPageList.indexOf(240) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十章 平衡和协调功能评定</span> @@ -316,7 +316,7 @@ <!-- 第241页 - 奇数页 --> <div class="page-box" page="241"> <div v-if="showPageList.indexOf(241) > -1"> <div v-if="showPageList.indexOf(241) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -348,7 +348,7 @@ <!-- 第242页 - 偶数页 --> <div class="page-box" page="242"> <div v-if="showPageList.indexOf(242) > -1"> <div v-if="showPageList.indexOf(242) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十章 平衡和协调功能评定</span> @@ -387,7 +387,7 @@ <!-- 第243页 - 奇数页 --> <div class="page-box" page="243"> <div v-if="showPageList.indexOf(243) > -1"> <div v-if="showPageList.indexOf(243) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -406,7 +406,7 @@ <!-- 第244页 - 偶数页 --> <div class="page-box" page="244"> <div v-if="showPageList.indexOf(244) > -1"> <div v-if="showPageList.indexOf(244) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十章 平衡和协调功能评定</span> @@ -439,7 +439,7 @@ <!-- 第245页 - 奇数页 --> <div class="page-box" page="245"> <div v-if="showPageList.indexOf(245) > -1"> <div v-if="showPageList.indexOf(245) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -469,7 +469,7 @@ <!-- 第246页 - 偶数页 --> <div class="page-box" page="246"> <div v-if="showPageList.indexOf(246) > -1"> <div v-if="showPageList.indexOf(246) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十章 平衡和协调功能评定</span> @@ -494,7 +494,7 @@ <!-- 第247页 - 奇数页 --> <div class="page-box" page="247"> <div v-if="showPageList.indexOf(247) > -1"> <div v-if="showPageList.indexOf(247) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -539,7 +539,7 @@ <!-- 第248页 - 偶数页 --> <div class="page-box" page="248"> <div v-if="showPageList.indexOf(248) > -1"> <div v-if="showPageList.indexOf(248) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十章 平衡和协调功能评定</span> @@ -585,7 +585,7 @@ <!-- 第249页 - 奇数页 --> <div class="page-box" page="249"> <div v-if="showPageList.indexOf(249) > -1"> <div v-if="showPageList.indexOf(249) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -627,7 +627,7 @@ <!-- 第250页 - 偶数页 --> <div class="page-box" page="250"> <div v-if="showPageList.indexOf(250) > -1"> <div v-if="showPageList.indexOf(250) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十章 平衡和协调功能评定</span> @@ -675,7 +675,7 @@ <!-- 第251页 - 奇数页 --> <div class="page-box" page="251"> <div v-if="showPageList.indexOf(251) > -1"> <div v-if="showPageList.indexOf(251) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -724,7 +724,7 @@ <!-- 第252页 - 偶数页 --> <div class="page-box" page="252"> <div v-if="showPageList.indexOf(252) > -1"> <div v-if="showPageList.indexOf(252) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十章 平衡和协调功能评定</span> @@ -768,7 +768,7 @@ <!-- 第253页 - 奇数页 --> <div class="page-box" page="253"> <div v-if="showPageList.indexOf(253) > -1"> <div v-if="showPageList.indexOf(253) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 src/books/rehabilitationAssessmentTechniques/view/components/chapter11.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="12"> <!-- 第254页 - 偶数页 --> <div class="page-box" page="254"> <div v-if="showPageList.indexOf(254) > -1"> <div v-if="showPageList.indexOf(254) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -47,7 +47,7 @@ <!-- 第255页 - 奇数页 --> <div class="page-box" page="255"> <div v-if="showPageList.indexOf(255) > -1"> <div v-if="showPageList.indexOf(255) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -84,7 +84,7 @@ <!-- 第256页 - 偶数页 --> <div class="page-box" page="256"> <div v-if="showPageList.indexOf(256) > -1"> <div v-if="showPageList.indexOf(256) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -134,7 +134,7 @@ <!-- 第257页 - 奇数页 --> <div class="page-box" page="257"> <div v-if="showPageList.indexOf(257) > -1"> <div v-if="showPageList.indexOf(257) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -167,7 +167,7 @@ <!-- 第258页 - 偶数页 --> <div class="page-box" page="258"> <div v-if="showPageList.indexOf(258) > -1"> <div v-if="showPageList.indexOf(258) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -210,7 +210,7 @@ <!-- 第259页 - 奇数页 --> <div class="page-box" page="259"> <div v-if="showPageList.indexOf(259) > -1"> <div v-if="showPageList.indexOf(259) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -257,7 +257,7 @@ <!-- 第260页 - 偶数页 --> <div class="page-box" page="260"> <div v-if="showPageList.indexOf(260) > -1"> <div v-if="showPageList.indexOf(260) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -293,7 +293,7 @@ <!-- 第261页 - 奇数页 --> <div class="page-box" page="261"> <div v-if="showPageList.indexOf(261) > -1"> <div v-if="showPageList.indexOf(261) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -331,7 +331,7 @@ <!-- 第262页 - 偶数页 --> <div class="page-box" page="262"> <div v-if="showPageList.indexOf(262) > -1"> <div v-if="showPageList.indexOf(262) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -368,7 +368,7 @@ <!-- 第263页 - 奇数页 --> <div class="page-box" page="263"> <div v-if="showPageList.indexOf(263) > -1"> <div v-if="showPageList.indexOf(263) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -413,7 +413,7 @@ <!-- 第264页 - 偶数页 --> <div class="page-box" page="264"> <div v-if="showPageList.indexOf(264) > -1"> <div v-if="showPageList.indexOf(264) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -449,7 +449,7 @@ <!-- 第265页 - 奇数页 --> <div class="page-box" page="265"> <div v-if="showPageList.indexOf(265) > -1"> <div v-if="showPageList.indexOf(265) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -491,7 +491,7 @@ <!-- 第266页 - 偶数页 --> <div class="page-box" page="266"> <div v-if="showPageList.indexOf(266) > -1"> <div v-if="showPageList.indexOf(266) > -1 "> <div class="page-header-right"> <span class="header-title"> @@ -535,7 +535,7 @@ <!-- 第267页 - 奇数页 --> <div class="page-box" page="267"> <div v-if="showPageList.indexOf(267) > -1"> <div v-if="showPageList.indexOf(267) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -573,7 +573,7 @@ <!-- 第268页 - 偶数页 --> <div class="page-box" page="268"> <div v-if="showPageList.indexOf(268) > -1"> <div v-if="showPageList.indexOf(268) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -610,7 +610,7 @@ <!-- 第269页 - 奇数页 --> <div class="page-box" page="269"> <div v-if="showPageList.indexOf(269) > -1"> <div v-if="showPageList.indexOf(269) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -645,7 +645,7 @@ <!-- 第270页 - 偶数页 --> <div class="page-box" page="270"> <div v-if="showPageList.indexOf(270) > -1"> <div v-if="showPageList.indexOf(270) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -679,7 +679,7 @@ <!-- 第271页 - 奇数页 --> <div class="page-box" page="271"> <div v-if="showPageList.indexOf(271) > -1"> <div v-if="showPageList.indexOf(271) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -720,7 +720,7 @@ <!-- 第272页 - 偶数页 --> <div class="page-box" page="272"> <div v-if="showPageList.indexOf(272) > -1"> <div v-if="showPageList.indexOf(272) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -757,7 +757,7 @@ <!-- 第273页 - 奇数页 --> <div class="page-box" page="273"> <div v-if="showPageList.indexOf(273) > -1"> <div v-if="showPageList.indexOf(273) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -804,7 +804,7 @@ <!-- 第274页 - 偶数页 --> <div class="page-box" page="274"> <div v-if="showPageList.indexOf(274) > -1"> <div v-if="showPageList.indexOf(274) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -844,7 +844,7 @@ <!-- 第275页 - 奇数页 --> <div class="page-box" page="275"> <div v-if="showPageList.indexOf(275) > -1"> <div v-if="showPageList.indexOf(275) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -874,7 +874,7 @@ <!-- 第276页 - 偶数页 --> <div class="page-box" page="276"> <div v-if="showPageList.indexOf(276) > -1"> <div v-if="showPageList.indexOf(276) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -914,7 +914,7 @@ <!-- 第277页 - 奇数页 --> <div class="page-box" page="277"> <div v-if="showPageList.indexOf(277) > -1"> <div v-if="showPageList.indexOf(277) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -956,7 +956,7 @@ <!-- 第278页 - 偶数页 --> <div class="page-box" page="278"> <div v-if="showPageList.indexOf(278) > -1"> <div v-if="showPageList.indexOf(278) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -996,7 +996,7 @@ <!-- 第279页 - 奇数页 --> <div class="page-box" page="279"> <div v-if="showPageList.indexOf(279) > -1"> <div v-if="showPageList.indexOf(279) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1039,7 +1039,7 @@ <!-- 第280页 - 偶数页 --> <div class="page-box" page="280"> <div v-if="showPageList.indexOf(280) > -1"> <div v-if="showPageList.indexOf(280) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十一章 步态分析</span> @@ -1078,7 +1078,7 @@ <!-- 第281页 - 奇数页 --> <div class="page-box" page="281"> <div v-if="showPageList.indexOf(281) > -1"> <div v-if="showPageList.indexOf(281) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 src/books/rehabilitationAssessmentTechniques/view/components/chapter12.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="13"> <!-- 第282页 - 偶数页 --> <div class="page-box" page="282"> <div v-if="showPageList.indexOf(282) > -1"> <div v-if="showPageList.indexOf(282) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十二章 日常生活活动能力和生活质量评定</span> @@ -43,7 +43,7 @@ <!-- 第283页 - 奇数页 --> <div class="page-box" page="283"> <div v-if="showPageList.indexOf(283) > -1"> <div v-if="showPageList.indexOf(283) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -83,7 +83,7 @@ <!-- 第284页 - 偶数页 --> <div class="page-box" page="284"> <div v-if="showPageList.indexOf(284) > -1"> <div v-if="showPageList.indexOf(284) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十二章 日常生活活动能力和生活质量评定</span> @@ -127,7 +127,7 @@ <!-- 第285页 - 奇数页 --> <div class="page-box" page="285"> <div v-if="showPageList.indexOf(285) > -1"> <div v-if="showPageList.indexOf(285) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -177,7 +177,7 @@ <!-- 第286页 - 偶数页 --> <div class="page-box" page="286"> <div v-if="showPageList.indexOf(286) > -1"> <div v-if="showPageList.indexOf(286) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十二章 日常生活活动能力和生活质量评定</span> @@ -197,7 +197,7 @@ <!-- 第287页 - 奇数页 --> <div class="page-box" page="287"> <div v-if="showPageList.indexOf(287) > -1"> <div v-if="showPageList.indexOf(287) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -249,7 +249,7 @@ <!-- 第288页 - 偶数页 --> <div class="page-box" page="288"> <div v-if="showPageList.indexOf(288) > -1"> <div v-if="showPageList.indexOf(288) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十二章 日常生活活动能力和生活质量评定</span> @@ -280,7 +280,7 @@ <!-- 第289页 - 奇数页 --> <div class="page-box" page="289"> <div v-if="showPageList.indexOf(289) > -1"> <div v-if="showPageList.indexOf(289) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -311,7 +311,7 @@ <!-- 第290页 - 偶数页 --> <div class="page-box" page="290"> <div v-if="showPageList.indexOf(290) > -1"> <div v-if="showPageList.indexOf(290) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十二章 日常生活活动能力和生活质量评定</span> @@ -342,7 +342,7 @@ <!-- 第291页 - 奇数页 --> <div class="page-box" page="291"> <div v-if="showPageList.indexOf(291) > -1"> <div v-if="showPageList.indexOf(291) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -370,7 +370,7 @@ <!-- 第292页 - 偶数页 --> <div class="page-box" page="292"> <div v-if="showPageList.indexOf(292) > -1"> <div v-if="showPageList.indexOf(292) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十二章 日常生活活动能力和生活质量评定</span> @@ -417,7 +417,7 @@ <!-- 第293页 - 奇数页 --> <div class="page-box" page="293"> <div v-if="showPageList.indexOf(293) > -1"> <div v-if="showPageList.indexOf(293) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -437,7 +437,7 @@ <!-- 第294页 - 偶数页 --> <div class="page-box" page="294"> <div v-if="showPageList.indexOf(294) > -1"> <div v-if="showPageList.indexOf(294) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十二章 日常生活活动能力和生活质量评定</span> @@ -485,7 +485,7 @@ <!-- 第295页 - 奇数页 --> <div class="page-box" page="295"> <div v-if="showPageList.indexOf(295) > -1"> <div v-if="showPageList.indexOf(295) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -532,7 +532,7 @@ <!-- 第296页 - 偶数页 --> <div class="page-box" page="296"> <div v-if="showPageList.indexOf(296) > -1"> <div v-if="showPageList.indexOf(296) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十二章 日常生活活动能力和生活质量评定</span> @@ -582,7 +582,7 @@ <!-- 第297页 - 奇数页 --> <div class="page-box" page="297"> <div v-if="showPageList.indexOf(297) > -1"> <div v-if="showPageList.indexOf(297) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -629,7 +629,7 @@ <!-- 第298页 - 偶数页 --> <div class="page-box" page="298"> <div v-if="showPageList.indexOf(298) > -1"> <div v-if="showPageList.indexOf(298) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十二章 日常生活活动能力和生活质量评定</span> @@ -677,7 +677,7 @@ <!-- 第299页 - 奇数页 --> <div class="page-box" page="299"> <div v-if="showPageList.indexOf(299) > -1"> <div v-if="showPageList.indexOf(299) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -718,7 +718,7 @@ <!-- 第300页 - 偶数页 --> <div class="page-box" page="300"> <div v-if="showPageList.indexOf(300) > -1"> <div v-if="showPageList.indexOf(300) > -1 "> <div class="page-header-right"> <span class="header-title"> 第十二章 日常生活活动能力和生活质量评定</span> @@ -751,7 +751,7 @@ <!-- 第301页 - 奇数页 --> <div class="page-box" page="301"> <div v-if="showPageList.indexOf(301) > -1"> <div v-if="showPageList.indexOf(301) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -771,7 +771,7 @@ <!-- 第302页 - 偶数页 --> <div class="page-box" page="302"> <div v-if="showPageList.indexOf(302) > -1"> <div v-if="showPageList.indexOf(302) > -1 "> <div class="page-header-right"> <span class="header-title">第十二章 日常生活活动能力和生活质量评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -793,7 +793,7 @@ <!-- 第303页 - 奇数页 --> <div class="page-box" page="303"> <div v-if="showPageList.indexOf(303) > -1"> <div v-if="showPageList.indexOf(303) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -812,7 +812,7 @@ <!-- 第304页 - 偶数页 --> <div class="page-box" page="304"> <div v-if="showPageList.indexOf(304) > -1"> <div v-if="showPageList.indexOf(304) > -1 "> <div class="page-header-right"> <span class="header-title">第十二章 日常生活活动能力和生活质量评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -839,7 +839,7 @@ <!-- 第305页 - 奇数页 --> <div class="page-box" page="305"> <div v-if="showPageList.indexOf(305) > -1"> <div v-if="showPageList.indexOf(305) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -873,7 +873,7 @@ <!-- 第306页 - 偶数页 --> <div class="page-box" page="306"> <div v-if="showPageList.indexOf(306) > -1"> <div v-if="showPageList.indexOf(306) > -1 "> <div class="page-header-right"> <span class="header-title">第十二章 日常生活活动能力和生活质量评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -910,7 +910,7 @@ <!-- 第307页 - 奇数页 --> <div class="page-box" page="307"> <div v-if="showPageList.indexOf(307) > -1"> <div v-if="showPageList.indexOf(307) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -945,7 +945,7 @@ <!-- 第308页 - 偶数页 --> <div class="page-box" page="308"> <div v-if="showPageList.indexOf(308) > -1"> <div v-if="showPageList.indexOf(308) > -1 "> <div class="page-header-right"> <span class="header-title">第十二章 日常生活活动能力和生活质量评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -985,7 +985,7 @@ <!-- 第309页 - 奇数页 --> <div class="page-box" page="309"> <div v-if="showPageList.indexOf(309) > -1"> <div v-if="showPageList.indexOf(309) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1027,7 +1027,7 @@ <!-- 第310页 - 偶数页 --> <div class="page-box" page="310"> <div v-if="showPageList.indexOf(310) > -1"> <div v-if="showPageList.indexOf(310) > -1 "> <div class="page-header-right"> <span class="header-title">第十二章 日常生活活动能力和生活质量评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -1065,7 +1065,7 @@ <!-- 第311页 - 奇数页 --> <div class="page-box" page="311"> <div v-if="showPageList.indexOf(311) > -1"> <div v-if="showPageList.indexOf(311) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1101,7 +1101,7 @@ <!-- 第312页 - 偶数页 --> <div class="page-box" page="312"> <div v-if="showPageList.indexOf(312) > -1"> <div v-if="showPageList.indexOf(312) > -1 "> <div class="page-header-right"> <span class="header-title">第十二章 日常生活活动能力和生活质量评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -1119,7 +1119,7 @@ <!-- 第313页 - 奇数页 --> <div class="page-box" page="313"> <div v-if="showPageList.indexOf(313) > -1"> <div v-if="showPageList.indexOf(313) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1158,7 +1158,7 @@ <!-- 第314页 - 偶数页 --> <div class="page-box" page="314"> <div v-if="showPageList.indexOf(314) > -1"> <div v-if="showPageList.indexOf(314) > -1 "> <div class="page-header-right"> <span class="header-title">第十二章 日常生活活动能力和生活质量评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -1194,7 +1194,7 @@ <!-- 第315页 - 奇数页 --> <div class="page-box" page="315"> <div v-if="showPageList.indexOf(315) > -1"> <div v-if="showPageList.indexOf(315) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 src/books/rehabilitationAssessmentTechniques/view/components/chapter13.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="14"> <!-- 第316页 - 偶数页 --> <div class="page-box" page="316"> <div v-if="showPageList.indexOf(316) > -1"> <div v-if="showPageList.indexOf(316) > -1 "> <div class="page-header-right"> <span class="header-title">第十三章 情绪和心理功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -42,7 +42,7 @@ <!-- 第317页 - 奇数页 --> <div class="page-box" page="317"> <div v-if="showPageList.indexOf(317) > -1"> <div v-if="showPageList.indexOf(317) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -85,7 +85,7 @@ <!-- 第318页 - 偶数页 --> <div class="page-box" page="318"> <div v-if="showPageList.indexOf(318) > -1"> <div v-if="showPageList.indexOf(318) > -1 "> <div class="page-header-right"> <span class="header-title">第十三章 情绪和心理功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -123,7 +123,7 @@ <!-- 第319页 - 奇数页 --> <div class="page-box" page="319"> <div v-if="showPageList.indexOf(319) > -1"> <div v-if="showPageList.indexOf(319) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -163,7 +163,7 @@ <!-- 第320页 - 偶数页 --> <div class="page-box" page="320"> <div v-if="showPageList.indexOf(320) > -1"> <div v-if="showPageList.indexOf(320) > -1 "> <div class="page-header-right"> <span class="header-title">第十三章 情绪和心理功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -192,7 +192,7 @@ <!-- 第321页 - 奇数页 --> <div class="page-box" page="321"> <div v-if="showPageList.indexOf(321) > -1"> <div v-if="showPageList.indexOf(321) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -228,7 +228,7 @@ <!-- 第322页 - 偶数页 --> <div class="page-box" page="322"> <div v-if="showPageList.indexOf(322) > -1"> <div v-if="showPageList.indexOf(322) > -1 "> <div class="page-header-right"> <span class="header-title">第十三章 情绪和心理功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -265,7 +265,7 @@ <!-- 第323页 - 奇数页 --> <div class="page-box" page="323"> <div v-if="showPageList.indexOf(323) > -1"> <div v-if="showPageList.indexOf(323) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -293,7 +293,7 @@ <!-- 第324页 - 偶数页 --> <div class="page-box" page="324"> <div v-if="showPageList.indexOf(324) > -1"> <div v-if="showPageList.indexOf(324) > -1 "> <div class="page-header-right"> <span class="header-title">第十三章 情绪和心理功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -316,7 +316,7 @@ <!-- 第325页 - 奇数页 --> <div class="page-box" page="325"> <div v-if="showPageList.indexOf(325) > -1"> <div v-if="showPageList.indexOf(325) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -336,7 +336,7 @@ <!-- 第326页 - 偶数页 --> <div class="page-box" page="326"> <div v-if="showPageList.indexOf(326) > -1"> <div v-if="showPageList.indexOf(326) > -1 "> <div class="page-header-right"> <span class="header-title">第十三章 情绪和心理功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -354,7 +354,7 @@ <!-- 第327页 - 奇数页 --> <div class="page-box" page="327"> <div v-if="showPageList.indexOf(327) > -1"> <div v-if="showPageList.indexOf(327) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -373,7 +373,7 @@ <!-- 第328页 - 偶数页 --> <div class="page-box" page="328"> <div v-if="showPageList.indexOf(328) > -1"> <div v-if="showPageList.indexOf(328) > -1 "> <div class="page-header-right"> <span class="header-title">第十三章 情绪和心理功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -394,7 +394,7 @@ <!-- 第329页 - 奇数页 --> <div class="page-box" page="329"> <div v-if="showPageList.indexOf(329) > -1"> <div v-if="showPageList.indexOf(329) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -430,7 +430,7 @@ <!-- 第330页 - 偶数页 --> <div class="page-box" page="330"> <div v-if="showPageList.indexOf(330) > -1"> <div v-if="showPageList.indexOf(330) > -1 "> <div class="page-header-right"> <span class="header-title">第十三章 情绪和心理功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -469,7 +469,7 @@ <!-- 第331页 - 奇数页 --> <div class="page-box" page="331"> <div v-if="showPageList.indexOf(331) > -1"> <div v-if="showPageList.indexOf(331) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -489,7 +489,7 @@ <!-- 第332页 - 偶数页 --> <div class="page-box" page="332"> <div v-if="showPageList.indexOf(332) > -1"> <div v-if="showPageList.indexOf(332) > -1 "> <div class="page-header-right"> <span class="header-title">第十三章 情绪和心理功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -507,7 +507,7 @@ <!-- 第333页 - 奇数页 --> <div class="page-box" page="333"> <div v-if="showPageList.indexOf(333) > -1"> <div v-if="showPageList.indexOf(333) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -526,7 +526,7 @@ <!-- 第334页 - 偶数页 --> <div class="page-box" page="334"> <div v-if="showPageList.indexOf(334) > -1"> <div v-if="showPageList.indexOf(334) > -1 "> <div class="page-header-right"> <span class="header-title">第十三章 情绪和心理功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -555,7 +555,7 @@ <!-- 第335页 - 奇数页 --> <div class="page-box" page="335"> <div v-if="showPageList.indexOf(335) > -1"> <div v-if="showPageList.indexOf(335) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 src/books/rehabilitationAssessmentTechniques/view/components/chapter14.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="15"> <!-- 第336页 - 偶数页 --> <div class="page-box" page="336"> <div v-if="showPageList.indexOf(336) > -1"> <div v-if="showPageList.indexOf(336) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -42,7 +42,7 @@ <!-- 第337页 - 奇数页 --> <div class="page-box" page="337"> <div v-if="showPageList.indexOf(337) > -1"> <div v-if="showPageList.indexOf(337) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -83,7 +83,7 @@ <!-- 第338页 - 偶数页 --> <div class="page-box" page="338"> <div v-if="showPageList.indexOf(338) > -1"> <div v-if="showPageList.indexOf(338) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -122,7 +122,7 @@ <!-- 第339页 - 奇数页 --> <div class="page-box" page="339"> <div v-if="showPageList.indexOf(339) > -1"> <div v-if="showPageList.indexOf(339) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -166,7 +166,7 @@ <!-- 第340页 - 偶数页 --> <div class="page-box" page="340"> <div v-if="showPageList.indexOf(340) > -1"> <div v-if="showPageList.indexOf(340) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -205,7 +205,7 @@ <!-- 第341页 - 奇数页 --> <div class="page-box" page="341"> <div v-if="showPageList.indexOf(341) > -1"> <div v-if="showPageList.indexOf(341) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -239,7 +239,7 @@ <!-- 第342页 - 偶数页 --> <div class="page-box" page="342"> <div v-if="showPageList.indexOf(342) > -1"> <div v-if="showPageList.indexOf(342) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -272,7 +272,7 @@ <!-- 第343页 - 奇数页 --> <div class="page-box" page="343"> <div v-if="showPageList.indexOf(343) > -1"> <div v-if="showPageList.indexOf(343) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -304,7 +304,7 @@ <!-- 第344页 - 偶数页 --> <div class="page-box" page="344"> <div v-if="showPageList.indexOf(344) > -1"> <div v-if="showPageList.indexOf(344) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -332,7 +332,7 @@ <!-- 第345页 - 奇数页 --> <div class="page-box" page="345"> <div v-if="showPageList.indexOf(345) > -1"> <div v-if="showPageList.indexOf(345) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -368,7 +368,7 @@ <!-- 第346页 - 偶数页 --> <div class="page-box" page="346"> <div v-if="showPageList.indexOf(346) > -1"> <div v-if="showPageList.indexOf(346) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -398,7 +398,7 @@ <!-- 第347页 - 奇数页 --> <div class="page-box" page="347"> <div v-if="showPageList.indexOf(347) > -1"> <div v-if="showPageList.indexOf(347) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -437,7 +437,7 @@ <!-- 第348页 - 偶数页 --> <div class="page-box" page="348"> <div v-if="showPageList.indexOf(348) > -1"> <div v-if="showPageList.indexOf(348) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -486,7 +486,7 @@ <!-- 第349页 - 奇数页 --> <div class="page-box" page="349"> <div v-if="showPageList.indexOf(349) > -1"> <div v-if="showPageList.indexOf(349) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -530,7 +530,7 @@ <!-- 第350页 - 偶数页 --> <div class="page-box" page="350"> <div v-if="showPageList.indexOf(350) > -1"> <div v-if="showPageList.indexOf(350) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -579,7 +579,7 @@ <!-- 第351页 - 奇数页 --> <div class="page-box" page="351"> <div v-if="showPageList.indexOf(351) > -1"> <div v-if="showPageList.indexOf(351) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -605,7 +605,7 @@ <!-- 第352页 - 偶数页 --> <div class="page-box" page="352"> <div v-if="showPageList.indexOf(352) > -1"> <div v-if="showPageList.indexOf(352) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -630,7 +630,7 @@ <!-- 第353页 - 奇数页 --> <div class="page-box" page="353"> <div v-if="showPageList.indexOf(353) > -1"> <div v-if="showPageList.indexOf(353) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -649,7 +649,7 @@ <!-- 第354页 - 偶数页 --> <div class="page-box" page="354"> <div v-if="showPageList.indexOf(354) > -1"> <div v-if="showPageList.indexOf(354) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -675,7 +675,7 @@ <!-- 第355页 - 奇数页 --> <div class="page-box" page="355"> <div v-if="showPageList.indexOf(355) > -1"> <div v-if="showPageList.indexOf(355) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -700,7 +700,7 @@ <!-- 第356页 - 偶数页 --> <div class="page-box" page="356"> <div v-if="showPageList.indexOf(356) > -1"> <div v-if="showPageList.indexOf(356) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> src/books/rehabilitationAssessmentTechniques/view/components/chapter15.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="16"> <!-- 357页 --> <div class="page-box" page="357"> <div v-if="showPageList.indexOf(357) > -1"> <div v-if="showPageList.indexOf(357) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -51,7 +51,7 @@ <!-- 358页 --> <div class="page-box" page="358"> <div v-if="showPageList.indexOf(358) > -1"> <div v-if="showPageList.indexOf(358) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -94,7 +94,7 @@ <!-- 359页 --> <div class="page-box" page="359"> <div v-if="showPageList.indexOf(359) > -1"> <div v-if="showPageList.indexOf(359) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -148,7 +148,7 @@ <!-- 360页 --> <div class="page-box" page="360"> <div v-if="showPageList.indexOf(360) > -1"> <div v-if="showPageList.indexOf(360) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -203,7 +203,7 @@ <!-- 361页 --> <div class="page-box" page="361"> <div v-if="showPageList.indexOf(361) > -1"> <div v-if="showPageList.indexOf(361) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -244,7 +244,7 @@ <!-- 362页 --> <div class="page-box" page="362"> <div v-if="showPageList.indexOf(362) > -1"> <div v-if="showPageList.indexOf(362) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -281,7 +281,7 @@ <!-- 363页 --> <div class="page-box" page="363"> <div v-if="showPageList.indexOf(363) > -1"> <div v-if="showPageList.indexOf(363) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -323,7 +323,7 @@ <!-- 364页 --> <div class="page-box" page="364"> <div v-if="showPageList.indexOf(364) > -1"> <div v-if="showPageList.indexOf(364) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -368,7 +368,7 @@ <!-- 365页 --> <div class="page-box" page="365"> <div v-if="showPageList.indexOf(365) > -1"> <div v-if="showPageList.indexOf(365) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -392,7 +392,7 @@ <!-- 366页 --> <div class="page-box" page="366"> <div v-if="showPageList.indexOf(366) > -1"> <div v-if="showPageList.indexOf(366) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -437,7 +437,7 @@ <!-- 367页 --> <div class="page-box" page="367"> <div v-if="showPageList.indexOf(367) > -1"> <div v-if="showPageList.indexOf(367) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -477,7 +477,7 @@ <!-- 368页 --> <div class="page-box" page="368"> <div v-if="showPageList.indexOf(368) > -1"> <div v-if="showPageList.indexOf(368) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -523,7 +523,7 @@ <!-- 369页 --> <div class="page-box" page="369"> <div v-if="showPageList.indexOf(369) > -1"> <div v-if="showPageList.indexOf(369) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -584,7 +584,7 @@ <!-- 370页 --> <div class="page-box" page="370"> <div v-if="showPageList.indexOf(370) > -1"> <div v-if="showPageList.indexOf(370) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -636,7 +636,7 @@ <!-- 371页 --> <div class="page-box" page="371"> <div v-if="showPageList.indexOf(371) > -1"> <div v-if="showPageList.indexOf(371) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -682,7 +682,7 @@ <!-- 372页 --> <div class="page-box" page="372"> <div v-if="showPageList.indexOf(372) > -1"> <div v-if="showPageList.indexOf(372) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -714,7 +714,7 @@ <!-- 373页 --> <div class="page-box" page="373"> <div v-if="showPageList.indexOf(373) > -1"> <div v-if="showPageList.indexOf(373) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -757,7 +757,7 @@ <!-- 374页 --> <div class="page-box" page="374"> <div v-if="showPageList.indexOf(374) > -1"> <div v-if="showPageList.indexOf(374) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -807,7 +807,7 @@ <!-- 375页 --> <div class="page-box" page="375"> <div v-if="showPageList.indexOf(375) > -1"> <div v-if="showPageList.indexOf(375) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -848,7 +848,7 @@ <!-- 376页 --> <div class="page-box" page="376"> <div v-if="showPageList.indexOf(376) > -1"> <div v-if="showPageList.indexOf(376) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -895,7 +895,7 @@ <!-- 377页 --> <div class="page-box" page="377"> <div v-if="showPageList.indexOf(377) > -1"> <div v-if="showPageList.indexOf(377) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> src/books/rehabilitationAssessmentTechniques/view/components/chapter16.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="17"> <!-- 378页 --> <div class="page-box" page="378"> <div v-if="showPageList.indexOf(378) > -1"> <div v-if="showPageList.indexOf(378) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -11,7 +11,6 @@ </div> </div> <div class="bodystyle"> <h1 class="firstTitle-l">第十六章 电诊断</h1> <div class="bodyPic"><img src="../../assets/images/0389-01.jpg" style="width:30%" active="true" /> </div> @@ -52,7 +51,7 @@ <!-- 379页 --> <div class="page-box" page="379"> <div v-if="showPageList.indexOf(379) > -1"> <div v-if="showPageList.indexOf(379) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -96,7 +95,7 @@ <!-- 380页 --> <div class="page-box" page="380"> <div v-if="showPageList.indexOf(380) > -1"> <div v-if="showPageList.indexOf(380) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -148,7 +147,7 @@ <!-- 381页 --> <div class="page-box" page="381"> <div v-if="showPageList.indexOf(381) > -1"> <div v-if="showPageList.indexOf(381) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -191,7 +190,7 @@ <!-- 382页 --> <div class="page-box" page="382"> <div v-if="showPageList.indexOf(382) > -1"> <div v-if="showPageList.indexOf(382) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -234,7 +233,7 @@ <!-- 383页 --> <div class="page-box" page="383"> <div v-if="showPageList.indexOf(383) > -1"> <div v-if="showPageList.indexOf(383) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -287,7 +286,7 @@ <!-- 384页 --> <div class="page-box" page="384"> <div v-if="showPageList.indexOf(384) > -1"> <div v-if="showPageList.indexOf(384) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -332,7 +331,7 @@ <!-- 385页 --> <div class="page-box" page="385"> <div v-if="showPageList.indexOf(385) > -1"> <div v-if="showPageList.indexOf(385) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -381,7 +380,7 @@ <!-- 386页 --> <div class="page-box" page="386"> <div v-if="showPageList.indexOf(386) > -1"> <div v-if="showPageList.indexOf(386) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -419,7 +418,7 @@ <!-- 387页 --> <div class="page-box" page="387"> <div v-if="showPageList.indexOf(387) > -1"> <div v-if="showPageList.indexOf(387) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -468,7 +467,7 @@ <!-- 388页 --> <div class="page-box" page="388"> <div v-if="showPageList.indexOf(388) > -1"> <div v-if="showPageList.indexOf(388) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -514,7 +513,7 @@ <!-- 389页 --> <div class="page-box" page="389"> <div v-if="showPageList.indexOf(389) > -1"> <div v-if="showPageList.indexOf(389) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -565,7 +564,7 @@ <!-- 390页 --> <div class="page-box" page="390"> <div v-if="showPageList.indexOf(390) > -1"> <div v-if="showPageList.indexOf(390) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -606,7 +605,7 @@ <!-- 391页 --> <div class="page-box" page="391"> <div v-if="showPageList.indexOf(391) > -1"> <div v-if="showPageList.indexOf(391) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -642,7 +641,7 @@ <!-- 392页 --> <div class="page-box" page="392"> <div v-if="showPageList.indexOf(392) > -1"> <div v-if="showPageList.indexOf(392) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> src/books/rehabilitationAssessmentTechniques/view/components/chapter17.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="17"> <!-- 393页 --> <div class="page-box" page="393"> <div v-if="showPageList.indexOf(393) > -1"> <div v-if="showPageList.indexOf(393) > -1 "> <div class="bodystyle"> <h1 class="firstTitle-l">参考文献</h1> <p class="content">[1]白玉龙.康复功能评定学学习指导习题集[M].2版.北京:人民卫生出版社,2019.</p> @@ -40,7 +40,7 @@ <!-- 394页 --> <div class="page-box" page="394"> <div v-if="showPageList.indexOf(394) > -1"> <div v-if="showPageList.indexOf(394) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -69,7 +69,7 @@ <!-- 395页 --> <div class="page-box" page="395"> <div v-if="showPageList.indexOf(395) > -1"> <div v-if="showPageList.indexOf(395) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -94,7 +94,7 @@ <!-- 396页 --> <div class="page-box" page="396"> <div v-if="showPageList.indexOf(396) > -1"> <div v-if="showPageList.indexOf(396) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -118,7 +118,7 @@ <!-- 397页 --> <div class="page-box" page="397"> <div v-if="showPageList.indexOf(397) > -1"> <div v-if="showPageList.indexOf(397) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -146,7 +146,7 @@ <!-- 398页 --> <div class="page-box" page="398"> <div v-if="showPageList.indexOf(398) > -1"> <div v-if="showPageList.indexOf(398) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -173,7 +173,7 @@ <!-- 399页 --> <div class="page-box" page="399"> <div v-if="showPageList.indexOf(399) > -1"> <div v-if="showPageList.indexOf(399) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -198,7 +198,7 @@ <!-- 400页 --> <div class="page-box" page="400"> <div v-if="showPageList.indexOf(400) > -1"> <div v-if="showPageList.indexOf(400) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -221,7 +221,7 @@ <!-- 401页 --> <div class="page-box" page="401"> <div v-if="showPageList.indexOf(401) > -1"> <div v-if="showPageList.indexOf(401) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -246,7 +246,7 @@ <!-- 402页 --> <div class="page-box" page="402"> <div v-if="showPageList.indexOf(402) > -1"> <div v-if="showPageList.indexOf(402) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -270,7 +270,7 @@ <!-- 403页 --> <div class="page-box" page="403"> <div v-if="showPageList.indexOf(403) > -1"> <div v-if="showPageList.indexOf(403) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -295,7 +295,7 @@ <!-- 404页 --> <div class="page-box" page="404"> <div v-if="showPageList.indexOf(404) > -1"> <div v-if="showPageList.indexOf(404) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -319,7 +319,7 @@ <!-- 405页 --> <div class="page-box" page="405"> <div v-if="showPageList.indexOf(405) > -1"> <div v-if="showPageList.indexOf(405) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -344,7 +344,7 @@ <!-- 406页 --> <div class="page-box" page="406"> <div v-if="showPageList.indexOf(406) > -1"> <div v-if="showPageList.indexOf(406) > -1 "> <div class="page-header"> <!-- 右上页眉 --> <div class="page-header-right"> @@ -368,7 +368,7 @@ <!-- 407页 --> <div class="page-box" page="407"> <div v-if="showPageList.indexOf(407) > -1"> <div v-if="showPageList.indexOf(407) > -1 "> <div class="page-header"> <!-- 左上页眉 --> <div class="page-header-left"> @@ -393,7 +393,7 @@ <!-- 408页 --> <div class="page-box" page="408"> <div v-if="showPageList.indexOf(408) > -1"> <div v-if="showPageList.indexOf(408) > -1 "> <div class="bodystyle"> </div> src/books/rehabilitationAssessmentTechniques/view/components/chapter2.vue
@@ -1,7 +1,7 @@ <template> <div class="chapter" num="4"> <div class="page-box" page="36"> <div v-if="showPageList.indexOf(36) > -1"> <div v-if="showPageList.indexOf(36) > -1 "> <div class="page-header-right"> <span class="header-title">第二章 人体形态评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -46,7 +46,7 @@ </div> </div> <div class="page-box" page="37"> <div v-if="showPageList.indexOf(37) > -1"> <div v-if="showPageList.indexOf(37) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -81,7 +81,7 @@ </div> </div> <div class="page-box" page="38"> <div v-if="showPageList.indexOf(38) > -1"> <div v-if="showPageList.indexOf(38) > -1 "> <div class="page-header-right"> <span class="header-title">第二章 人体形态评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -119,7 +119,7 @@ </div> </div> <div class="page-box" page="39"> <div v-if="showPageList.indexOf(39) > -1"> <div v-if="showPageList.indexOf(39) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -159,7 +159,7 @@ </div> </div> <div class="page-box" page="40"> <div v-if="showPageList.indexOf(40) > -1"> <div v-if="showPageList.indexOf(40) > -1 "> <div class="page-header-right"> <span class="header-title">第二章 人体形态评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -199,7 +199,7 @@ </div> </div> <div class="page-box" page="41"> <div v-if="showPageList.indexOf(41) > -1"> <div v-if="showPageList.indexOf(41) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -240,7 +240,7 @@ </div> </div> <div class="page-box" page="42"> <div v-if="showPageList.indexOf(42) > -1"> <div v-if="showPageList.indexOf(42) > -1 "> <div class="page-header-right"> <span class="header-title">第二章 人体形态评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -279,7 +279,7 @@ </div> </div> <div class="page-box" page="43"> <div v-if="showPageList.indexOf(43) > -1"> <div v-if="showPageList.indexOf(43) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -311,7 +311,7 @@ </div> </div> <div class="page-box" page="44"> <div v-if="showPageList.indexOf(44) > -1"> <div v-if="showPageList.indexOf(44) > -1 "> <div class="page-header-right"> <span class="header-title">第二章 人体形态评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -327,7 +327,7 @@ </div> </div> <div class="page-box" page="45"> <div v-if="showPageList.indexOf(45) > -1"> <div v-if="showPageList.indexOf(45) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -365,7 +365,7 @@ </div> </div> <div class="page-box" page="46"> <div v-if="showPageList.indexOf(46) > -1"> <div v-if="showPageList.indexOf(46) > -1 "> <div class="page-header-right"> <span class="header-title">第二章 人体形态评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -410,7 +410,7 @@ </div> </div> <div class="page-box" page="47"> <div v-if="showPageList.indexOf(47) > -1"> <div v-if="showPageList.indexOf(47) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -461,7 +461,7 @@ </div> </div> <div class="page-box" page="48"> <div v-if="showPageList.indexOf(48) > -1"> <div v-if="showPageList.indexOf(48) > -1 "> <div class="page-header-right"> <span class="header-title">第二章 人体形态评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -494,7 +494,7 @@ </div> </div> <div class="page-box" page="49"> <div v-if="showPageList.indexOf(49) > -1"> <div v-if="showPageList.indexOf(49) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -533,7 +533,7 @@ </div> </div> <div class="page-box" page="50"> <div v-if="showPageList.indexOf(50) > -1"> <div v-if="showPageList.indexOf(50) > -1 "> <div class="page-header-right"> <span class="header-title">第二章 人体形态评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -580,7 +580,7 @@ </div> </div> <div class="page-box" page="51"> <div v-if="showPageList.indexOf(51) > -1"> <div v-if="showPageList.indexOf(51) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -627,7 +627,7 @@ </div> </div> <div class="page-box" page="52"> <div v-if="showPageList.indexOf(52) > -1"> <div v-if="showPageList.indexOf(52) > -1 "> <div class="page-header-right"> <span class="header-title">第二章 人体形态评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -669,7 +669,7 @@ </div> </div> <div class="page-box" page="53"> <div v-if="showPageList.indexOf(53) > -1"> <div v-if="showPageList.indexOf(53) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -702,7 +702,7 @@ </div> </div> <div class="page-box" page="54"> <div v-if="showPageList.indexOf(54) > -1"> <div v-if="showPageList.indexOf(54) > -1 "> <div class="page-header-right"> <span class="header-title">第二章 人体形态评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -738,7 +738,7 @@ </div> </div> <div class="page-box" page="55"> <div v-if="showPageList.indexOf(55) > -1"> <div v-if="showPageList.indexOf(55) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -761,7 +761,7 @@ </div> </div> <div class="page-box" page="56"> <div v-if="showPageList.indexOf(56) > -1"> <div v-if="showPageList.indexOf(56) > -1 "> <div class="page-header-right"> <span class="header-title">第二章 人体形态评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -801,7 +801,7 @@ </div> </div> <div class="page-box" page="57"> <div v-if="showPageList.indexOf(57) > -1"> <div v-if="showPageList.indexOf(57) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 src/books/rehabilitationAssessmentTechniques/view/components/chapter3.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="4"> <!-- 第58页 - 偶数页 --> <div class="page-box" page="58"> <div v-if="showPageList.indexOf(58) > -1"> <div v-if="showPageList.indexOf(58) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> @@ -45,7 +45,7 @@ <!-- 第59页 - 奇数页 --> <div class="page-box" page="59"> <div v-if="showPageList.indexOf(59) > -1"> <div v-if="showPageList.indexOf(59) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -81,7 +81,7 @@ <!-- 第60页 - 偶数页 --> <div class="page-box" page="60"> <div v-if="showPageList.indexOf(60) > -1"> <div v-if="showPageList.indexOf(60) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> @@ -115,7 +115,7 @@ <!-- 第61页 - 奇数页 --> <div class="page-box" page="61"> <div v-if="showPageList.indexOf(61) > -1"> <div v-if="showPageList.indexOf(61) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -149,7 +149,7 @@ <!-- 第62页 - 偶数页 --> <div class="page-box" page="62"> <div v-if="showPageList.indexOf(62) > -1"> <div v-if="showPageList.indexOf(62) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> @@ -195,7 +195,7 @@ <!-- 第63页 - 奇数页 --> <div class="page-box" page="63"> <div v-if="showPageList.indexOf(63) > -1"> <div v-if="showPageList.indexOf(63) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -230,7 +230,7 @@ <!-- 第64页 - 偶数页 --> <div class="page-box" page="64"> <div v-if="showPageList.indexOf(64) > -1"> <div v-if="showPageList.indexOf(64) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> @@ -267,7 +267,7 @@ <!-- 第65页 - 奇数页 --> <div class="page-box" page="65"> <div v-if="showPageList.indexOf(65) > -1"> <div v-if="showPageList.indexOf(65) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -305,7 +305,7 @@ <!-- 第66页 - 偶数页 --> <div class="page-box" page="66"> <div v-if="showPageList.indexOf(66) > -1"> <div v-if="showPageList.indexOf(66) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> @@ -332,7 +332,7 @@ <!-- 第67页 - 奇数页 --> <div class="page-box" page="67"> <div v-if="showPageList.indexOf(67) > -1"> <div v-if="showPageList.indexOf(67) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -370,7 +370,7 @@ <!-- 第68页 - 偶数页 --> <div class="page-box" page="68"> <div v-if="showPageList.indexOf(68) > -1"> <div v-if="showPageList.indexOf(68) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> @@ -414,7 +414,7 @@ <!-- 第69页 - 奇数页 --> <div class="page-box" page="69"> <div v-if="showPageList.indexOf(69) > -1"> <div v-if="showPageList.indexOf(69) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -449,7 +449,7 @@ <!-- 第70页 - 偶数页 --> <div class="page-box" page="70"> <div v-if="showPageList.indexOf(70) > -1"> <div v-if="showPageList.indexOf(70) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> @@ -474,7 +474,7 @@ <!-- 第71页 - 奇数页 --> <div class="page-box" page="71"> <div v-if="showPageList.indexOf(71) > -1"> <div v-if="showPageList.indexOf(71) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -510,7 +510,7 @@ <!-- 第72页 - 偶数页 --> <div class="page-box" page="72"> <div v-if="showPageList.indexOf(72) > -1"> <div v-if="showPageList.indexOf(72) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> @@ -554,7 +554,7 @@ <!-- 第73页 - 奇数页 --> <div class="page-box" page="73"> <div v-if="showPageList.indexOf(73) > -1"> <div v-if="showPageList.indexOf(73) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -586,7 +586,7 @@ <!-- 第74页 - 偶数页 --> <div class="page-box" page="74"> <div v-if="showPageList.indexOf(74) > -1"> <div v-if="showPageList.indexOf(74) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> @@ -617,7 +617,7 @@ <!-- 第75页 - 奇数页 --> <div class="page-box" page="75"> <div v-if="showPageList.indexOf(75) > -1"> <div v-if="showPageList.indexOf(75) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -664,7 +664,7 @@ <!-- 第76页 - 偶数页 --> <div class="page-box" page="76"> <div v-if="showPageList.indexOf(76) > -1"> <div v-if="showPageList.indexOf(76) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> @@ -699,7 +699,7 @@ <!-- 第77页 - 奇数页 --> <div class="page-box" page="77"> <div v-if="showPageList.indexOf(77) > -1"> <div v-if="showPageList.indexOf(77) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -745,7 +745,7 @@ <!-- 第78页 - 偶数页 --> <div class="page-box" page="78"> <div v-if="showPageList.indexOf(78) > -1"> <div v-if="showPageList.indexOf(78) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> @@ -793,7 +793,7 @@ <!-- 第79页 - 奇数页 --> <div class="page-box" page="79"> <div v-if="showPageList.indexOf(79) > -1"> <div v-if="showPageList.indexOf(79) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -820,7 +820,7 @@ <!-- 第80页 - 偶数页 --> <div class="page-box" page="80"> <div v-if="showPageList.indexOf(80) > -1"> <div v-if="showPageList.indexOf(80) > -1 "> <div class="page-header-right"> <span class="header-title">第三章 心肺功能评定</span> <img class="header-img" src="../../asse../../asse../../assets/images/pageHeader.png" /> src/books/rehabilitationAssessmentTechniques/view/components/chapter4.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="5"> <!-- 第81页 - 奇数页 --> <div class="page-box" page="81"> <div v-if="showPageList.indexOf(81) > -1"> <div v-if="showPageList.indexOf(81) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -45,7 +45,7 @@ <!-- 第82页 - 偶数页 --> <div class="page-box" page="82"> <div v-if="showPageList.indexOf(82) > -1"> <div v-if="showPageList.indexOf(82) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -81,7 +81,7 @@ <!-- 第83页 - 奇数页 --> <div class="page-box" page="83"> <div v-if="showPageList.indexOf(83) > -1"> <div v-if="showPageList.indexOf(83) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -130,7 +130,7 @@ <!-- 第84页 - 偶数页 --> <div class="page-box" page="84"> <div v-if="showPageList.indexOf(84) > -1"> <div v-if="showPageList.indexOf(84) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -167,7 +167,7 @@ <!-- 第85页 - 奇数页 --> <div class="page-box" page="85"> <div v-if="showPageList.indexOf(85) > -1"> <div v-if="showPageList.indexOf(85) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -198,7 +198,7 @@ <!-- 第86页 - 偶数页 --> <div class="page-box" page="86"> <div v-if="showPageList.indexOf(86) > -1"> <div v-if="showPageList.indexOf(86) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -229,7 +229,7 @@ <!-- 第87页 - 奇数页 --> <div class="page-box" page="87"> <div v-if="showPageList.indexOf(87) > -1"> <div v-if="showPageList.indexOf(87) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -273,7 +273,7 @@ <!-- 第88页 - 偶数页 --> <div class="page-box" page="88"> <div v-if="showPageList.indexOf(88) > -1"> <div v-if="showPageList.indexOf(88) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -316,7 +316,7 @@ <!-- 第89页 - 奇数页 --> <div class="page-box" page="89"> <div v-if="showPageList.indexOf(89) > -1"> <div v-if="showPageList.indexOf(89) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -359,7 +359,7 @@ <!-- 第90页 - 偶数页 --> <div class="page-box" page="90"> <div v-if="showPageList.indexOf(90) > -1"> <div v-if="showPageList.indexOf(90) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -392,7 +392,7 @@ <!-- 第91页 - 奇数页 --> <div class="page-box" page="91"> <div v-if="showPageList.indexOf(91) > -1"> <div v-if="showPageList.indexOf(91) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -444,7 +444,7 @@ <!-- 第92页 - 偶数页 --> <div class="page-box" page="92"> <div v-if="showPageList.indexOf(92) > -1"> <div v-if="showPageList.indexOf(92) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -494,7 +494,7 @@ <!-- 第93页 - 奇数页 --> <div class="page-box" page="93"> <div v-if="showPageList.indexOf(93) > -1"> <div v-if="showPageList.indexOf(93) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -545,7 +545,7 @@ <!-- 第94页 - 偶数页 --> <div class="page-box" page="94"> <div v-if="showPageList.indexOf(94) > -1"> <div v-if="showPageList.indexOf(94) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -597,7 +597,7 @@ <!-- 第95页 - 奇数页 --> <div class="page-box" page="95"> <div v-if="showPageList.indexOf(95) > -1"> <div v-if="showPageList.indexOf(95) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -650,7 +650,7 @@ <!-- 第96页 - 偶数页 --> <div class="page-box" page="96"> <div v-if="showPageList.indexOf(96) > -1"> <div v-if="showPageList.indexOf(96) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -701,7 +701,7 @@ <!-- 第97页 - 奇数页 --> <div class="page-box" page="97"> <div v-if="showPageList.indexOf(97) > -1"> <div v-if="showPageList.indexOf(97) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -752,7 +752,7 @@ <!-- 第98页 - 偶数页 --> <div class="page-box" page="98"> <div v-if="showPageList.indexOf(98) > -1"> <div v-if="showPageList.indexOf(98) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -802,7 +802,7 @@ <!-- 第99页 - 奇数页 --> <div class="page-box" page="99"> <div v-if="showPageList.indexOf(99) > -1"> <div v-if="showPageList.indexOf(99) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -851,7 +851,7 @@ <!-- 第100页 - 偶数页 --> <div class="page-box" page="100"> <div v-if="showPageList.indexOf(100) > -1"> <div v-if="showPageList.indexOf(100) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -898,7 +898,7 @@ <!-- 第101页 - 奇数页 --> <div class="page-box" page="101"> <div v-if="showPageList.indexOf(101) > -1"> <div v-if="showPageList.indexOf(101) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -949,7 +949,7 @@ <!-- 第102页 - 偶数页 --> <div class="page-box" page="102"> <div v-if="showPageList.indexOf(102) > -1"> <div v-if="showPageList.indexOf(102) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -993,7 +993,7 @@ <!-- 第103页 - 奇数页 --> <div class="page-box" page="103"> <div v-if="showPageList.indexOf(103) > -1"> <div v-if="showPageList.indexOf(103) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1047,7 +1047,7 @@ <!-- 第104页 - 偶数页 --> <div class="page-box" page="104"> <div v-if="showPageList.indexOf(104) > -1"> <div v-if="showPageList.indexOf(104) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -1095,7 +1095,7 @@ <!-- 第105页 - 奇数页 --> <div class="page-box" page="105"> <div v-if="showPageList.indexOf(105) > -1"> <div v-if="showPageList.indexOf(105) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1145,7 +1145,7 @@ <!-- 第106页 - 偶数页 --> <div class="page-box" page="106"> <div v-if="showPageList.indexOf(106) > -1"> <div v-if="showPageList.indexOf(106) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -1195,7 +1195,7 @@ <!-- 第107页 - 奇数页 --> <div class="page-box" page="107"> <div v-if="showPageList.indexOf(107) > -1"> <div v-if="showPageList.indexOf(107) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1238,7 +1238,7 @@ <!-- 第108页 - 偶数页 --> <div class="page-box" page="108"> <div v-if="showPageList.indexOf(108) > -1"> <div v-if="showPageList.indexOf(108) > -1 "> <div class="page-header-right"> <span class="header-title">第四章 肌力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -1277,7 +1277,7 @@ <!-- 第109页 - 奇数页 --> <div class="page-box" page="109"> <div v-if="showPageList.indexOf(109) > -1"> <div v-if="showPageList.indexOf(109) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 src/books/rehabilitationAssessmentTechniques/view/components/chapter5.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="6"> <!-- 第110页 - 偶数页 --> <div class="page-box" page="110"> <div v-if="showPageList.indexOf(110) > -1"> <div v-if="showPageList.indexOf(110) > -1 "> <div class="page-header-right"> <span class="header-title">第五章 肌张力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -45,7 +45,7 @@ <!-- 第111页 - 奇数页 --> <div class="page-box" page="111"> <div v-if="showPageList.indexOf(111) > -1"> <div v-if="showPageList.indexOf(111) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -81,7 +81,7 @@ <!-- 第112页 - 偶数页 --> <div class="page-box" page="112"> <div v-if="showPageList.indexOf(112) > -1"> <div v-if="showPageList.indexOf(112) > -1 "> <div class="page-header-right"> <span class="header-title">第五章 肌张力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -122,7 +122,7 @@ <!-- 第113页 - 奇数页 --> <div class="page-box" page="113"> <div v-if="showPageList.indexOf(113) > -1"> <div v-if="showPageList.indexOf(113) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -164,7 +164,7 @@ <!-- 第114页 - 偶数页 --> <div class="page-box" page="114"> <div v-if="showPageList.indexOf(114) > -1"> <div v-if="showPageList.indexOf(114) > -1 "> <div class="page-header-right"> <span class="header-title">第五章 肌张力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -197,7 +197,7 @@ <!-- 第115页 - 奇数页 --> <div class="page-box" page="115"> <div v-if="showPageList.indexOf(115) > -1"> <div v-if="showPageList.indexOf(115) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -237,7 +237,7 @@ <!-- 第116页 - 偶数页 --> <div class="page-box" page="116"> <div v-if="showPageList.indexOf(116) > -1"> <div v-if="showPageList.indexOf(116) > -1 "> <div class="page-header-right"> <span class="header-title">第五章 肌张力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -285,7 +285,7 @@ <!-- 第117页 - 奇数页 --> <div class="page-box" page="117"> <div v-if="showPageList.indexOf(117) > -1"> <div v-if="showPageList.indexOf(117) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -333,7 +333,7 @@ <!-- 第118页 - 偶数页 --> <div class="page-box" page="118"> <div v-if="showPageList.indexOf(118) > -1"> <div v-if="showPageList.indexOf(118) > -1 "> <div class="page-header-right"> <span class="header-title">第五章 肌张力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -385,7 +385,7 @@ <!-- 第119页 - 奇数页 --> <div class="page-box" page="119"> <div v-if="showPageList.indexOf(119) > -1"> <div v-if="showPageList.indexOf(119) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -437,7 +437,7 @@ <!-- 第120页 - 偶数页 --> <div class="page-box" page="120"> <div v-if="showPageList.indexOf(120) > -1"> <div v-if="showPageList.indexOf(120) > -1 "> <div class="page-header-right"> <span class="header-title">第五章 肌张力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -478,7 +478,7 @@ <!-- 第121页 - 奇数页 --> <div class="page-box" page="121"> <div v-if="showPageList.indexOf(121) > -1"> <div v-if="showPageList.indexOf(121) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -532,7 +532,7 @@ <!-- 第122页 - 偶数页 --> <div class="page-box" page="122"> <div v-if="showPageList.indexOf(122) > -1"> <div v-if="showPageList.indexOf(122) > -1 "> <div class="page-header-right"> <span class="header-title">第五章 肌张力评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -571,7 +571,7 @@ <!-- 第123页 - 奇数页 --> <div class="page-box" page="123"> <div v-if="showPageList.indexOf(123) > -1"> <div v-if="showPageList.indexOf(123) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 src/books/rehabilitationAssessmentTechniques/view/components/chapter6.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="7"> <!-- 第124页 - 偶数页 --> <div class="page-box" page="124"> <div v-if="showPageList.indexOf(124) > -1"> <div v-if="showPageList.indexOf(124) > -1 "> <div class="page-header-right"> <span class="header-title">第六章 关节活动度评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -46,7 +46,7 @@ <!-- 第125页 - 奇数页 --> <div class="page-box" page="125"> <div v-if="showPageList.indexOf(125) > -1"> <div v-if="showPageList.indexOf(125) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -80,7 +80,7 @@ <!-- 第126页 - 偶数页 --> <div class="page-box" page="126"> <div v-if="showPageList.indexOf(126) > -1"> <div v-if="showPageList.indexOf(126) > -1 "> <div class="page-header-right"> <span class="header-title">第六章 关节活动度评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -98,7 +98,7 @@ <!-- 第127页 - 奇数页 --> <div class="page-box" page="127"> <div v-if="showPageList.indexOf(127) > -1"> <div v-if="showPageList.indexOf(127) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -129,7 +129,7 @@ <!-- 第128页 - 偶数页 --> <div class="page-box" page="128"> <div v-if="showPageList.indexOf(128) > -1"> <div v-if="showPageList.indexOf(128) > -1 "> <div class="page-header-right"> <span class="header-title">第六章 关节活动度评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -164,7 +164,7 @@ <!-- 第129页 - 奇数页 --> <div class="page-box" page="129"> <div v-if="showPageList.indexOf(129) > -1"> <div v-if="showPageList.indexOf(129) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -205,7 +205,7 @@ <!-- 第130页 - 偶数页 --> <div class="page-box" page="130"> <div v-if="showPageList.indexOf(130) > -1"> <div v-if="showPageList.indexOf(130) > -1 "> <div class="page-header-right"> <span class="header-title">第六章 关节活动度评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -245,7 +245,7 @@ <!-- 第131页 - 奇数页 --> <div class="page-box" page="131"> <div v-if="showPageList.indexOf(131) > -1"> <div v-if="showPageList.indexOf(131) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -282,7 +282,7 @@ <!-- 第132页 - 偶数页 --> <div class="page-box" page="132"> <div v-if="showPageList.indexOf(132) > -1"> <div v-if="showPageList.indexOf(132) > -1 "> <div class="page-header-right"> <span class="header-title">第六章 关节活动度评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -327,7 +327,7 @@ <!-- 第133页 - 奇数页 --> <div class="page-box" page="133"> <div v-if="showPageList.indexOf(133) > -1"> <div v-if="showPageList.indexOf(133) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -371,7 +371,7 @@ <!-- 第134页 - 偶数页 --> <div class="page-box" page="134"> <div v-if="showPageList.indexOf(134) > -1"> <div v-if="showPageList.indexOf(134) > -1 "> <div class="page-header-right"> <span class="header-title">第六章 关节活动度评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -413,7 +413,7 @@ <!-- 第135页 - 奇数页 --> <div class="page-box" page="135"> <div v-if="showPageList.indexOf(135) > -1"> <div v-if="showPageList.indexOf(135) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -461,7 +461,7 @@ <!-- 第136页 - 偶数页 --> <div class="page-box" page="136"> <div v-if="showPageList.indexOf(136) > -1"> <div v-if="showPageList.indexOf(136) > -1 "> <div class="page-header-right"> <span class="header-title">第六章 关节活动度评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -509,7 +509,7 @@ <!-- 第137页 - 奇数页 --> <div class="page-box" page="137"> <div v-if="showPageList.indexOf(137) > -1"> <div v-if="showPageList.indexOf(137) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -554,7 +554,7 @@ <!-- 第138页 - 偶数页 --> <div class="page-box" page="138"> <div v-if="showPageList.indexOf(138) > -1"> <div v-if="showPageList.indexOf(138) > -1 "> <div class="page-header-right"> <span class="header-title">第六章 关节活动度评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -594,7 +594,7 @@ <!-- 第139页 - 奇数页 --> <div class="page-box" page="139"> <div v-if="showPageList.indexOf(139) > -1"> <div v-if="showPageList.indexOf(139) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -635,7 +635,7 @@ <!-- 第140页 - 偶数页 --> <div class="page-box" page="140"> <div v-if="showPageList.indexOf(140) > -1"> <div v-if="showPageList.indexOf(140) > -1 "> <div class="page-header-right"> <span class="header-title">第六章 关节活动度评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -676,7 +676,7 @@ <!-- 第141页 - 奇数页 --> <div class="page-box" page="141"> <div v-if="showPageList.indexOf(141) > -1"> <div v-if="showPageList.indexOf(141) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -715,7 +715,7 @@ <!-- 第142页 - 偶数页 --> <div class="page-box" page="142"> <div v-if="showPageList.indexOf(142) > -1"> <div v-if="showPageList.indexOf(142) > -1 "> <div class="page-header-right"> <span class="header-title">第六章 关节活动度评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -758,7 +758,7 @@ <!-- 第143页 - 奇数页 --> <div class="page-box" page="143"> <div v-if="showPageList.indexOf(143) > -1"> <div v-if="showPageList.indexOf(143) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -794,7 +794,7 @@ <!-- 第144页 - 偶数页 --> <div class="page-box" page="144"> <div v-if="showPageList.indexOf(144) > -1"> <div v-if="showPageList.indexOf(144) > -1 "> <div class="page-header-right"> <span class="header-title">第六章 关节活动度评定</span> <img class="header-img" src="../../asse../../assets/images/pageHeader.png" /> @@ -828,7 +828,7 @@ <!-- 第145页 - 奇数页 --> <div class="page-box" page="145"> <div v-if="showPageList.indexOf(145) > -1"> <div v-if="showPageList.indexOf(145) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 src/books/rehabilitationAssessmentTechniques/view/components/chapter7.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="8"> <!-- 第146页 - 偶数页 --> <div class="page-box" page="146"> <div v-if="showPageList.indexOf(146) > -1"> <div v-if="showPageList.indexOf(146) > -1 "> <div class="page-header-right"> <span class="header-title">第七章 感觉功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -43,7 +43,7 @@ <!-- 第147页 - 奇数页 --> <div class="page-box" page="147"> <div v-if="showPageList.indexOf(147) > -1"> <div v-if="showPageList.indexOf(147) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -79,7 +79,7 @@ <!-- 第148页 - 偶数页 --> <div class="page-box" page="148"> <div v-if="showPageList.indexOf(148) > -1"> <div v-if="showPageList.indexOf(148) > -1 "> <div class="page-header-right"> <span class="header-title">第七章 感觉功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -124,7 +124,7 @@ <!-- 第149页 - 奇数页 --> <div class="page-box" page="149"> <div v-if="showPageList.indexOf(149) > -1"> <div v-if="showPageList.indexOf(149) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -174,7 +174,7 @@ <!-- 第150页 - 偶数页 --> <div class="page-box" page="150"> <div v-if="showPageList.indexOf(150) > -1"> <div v-if="showPageList.indexOf(150) > -1 "> <div class="page-header-right"> <span class="header-title">第七章 感觉功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -213,7 +213,7 @@ <!-- 第151页 - 奇数页 --> <div class="page-box" page="151"> <div v-if="showPageList.indexOf(151) > -1"> <div v-if="showPageList.indexOf(151) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -256,7 +256,7 @@ <!-- 第152页 - 偶数页 --> <div class="page-box" page="152"> <div v-if="showPageList.indexOf(152) > -1"> <div v-if="showPageList.indexOf(152) > -1 "> <div class="page-header-right"> <span class="header-title">第七章 感觉功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -284,7 +284,7 @@ <!-- 第153页 - 奇数页 --> <div class="page-box" page="153"> <div v-if="showPageList.indexOf(153) > -1"> <div v-if="showPageList.indexOf(153) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -312,7 +312,7 @@ <!-- 第154页 - 偶数页 --> <div class="page-box" page="154"> <div v-if="showPageList.indexOf(154) > -1"> <div v-if="showPageList.indexOf(154) > -1 "> <div class="page-header-right"> <span class="header-title">第七章 感觉功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -364,7 +364,7 @@ <!-- 第155页 - 奇数页 --> <div class="page-box" page="155"> <div v-if="showPageList.indexOf(155) > -1"> <div v-if="showPageList.indexOf(155) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -398,7 +398,7 @@ <!-- 第156页 - 偶数页 --> <div class="page-box" page="156"> <div v-if="showPageList.indexOf(156) > -1"> <div v-if="showPageList.indexOf(156) > -1 "> <div class="page-header-right"> <span class="header-title">第七章 感觉功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -427,7 +427,7 @@ <!-- 第157页 - 奇数页 --> <div class="page-box" page="157"> <div v-if="showPageList.indexOf(157) > -1"> <div v-if="showPageList.indexOf(157) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -471,7 +471,7 @@ <!-- 第158页 - 偶数页 --> <div class="page-box" page="158"> <div v-if="showPageList.indexOf(158) > -1"> <div v-if="showPageList.indexOf(158) > -1 "> <div class="page-header-right"> <span class="header-title">第七章 感觉功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -513,7 +513,7 @@ <!-- 第159页 - 奇数页 --> <div class="page-box" page="159"> <div v-if="showPageList.indexOf(159) > -1"> <div v-if="showPageList.indexOf(159) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -541,7 +541,7 @@ <!-- 第160页 - 偶数页 --> <div class="page-box" page="160"> <div v-if="showPageList.indexOf(160) > -1"> <div v-if="showPageList.indexOf(160) > -1 "> <div class="page-header-right"> <span class="header-title">第七章 感觉功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -570,7 +570,7 @@ <!-- 第161页 - 奇数页 --> <div class="page-box" page="161"> <div v-if="showPageList.indexOf(161) > -1"> <div v-if="showPageList.indexOf(161) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 src/books/rehabilitationAssessmentTechniques/view/components/chapter8.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="9"> <!-- 第162页 - 偶数页 --> <div class="page-box" page="162"> <div v-if="showPageList.indexOf(162) > -1"> <div v-if="showPageList.indexOf(162) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -45,7 +45,7 @@ <!-- 第163页 - 奇数页 --> <div class="page-box" page="163"> <div v-if="showPageList.indexOf(163) > -1"> <div v-if="showPageList.indexOf(163) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -89,7 +89,7 @@ <!-- 第164页 - 偶数页 --> <div class="page-box" page="164"> <div v-if="showPageList.indexOf(164) > -1"> <div v-if="showPageList.indexOf(164) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -133,7 +133,7 @@ <!-- 第165页 - 奇数页 --> <div class="page-box" page="165"> <div v-if="showPageList.indexOf(165) > -1"> <div v-if="showPageList.indexOf(165) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -160,7 +160,7 @@ <!-- 第166页 - 偶数页 --> <div class="page-box" page="166"> <div v-if="showPageList.indexOf(166) > -1"> <div v-if="showPageList.indexOf(166) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -179,7 +179,7 @@ <!-- 第167页 - 奇数页 --> <div class="page-box" page="167"> <div v-if="showPageList.indexOf(167) > -1"> <div v-if="showPageList.indexOf(167) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -206,7 +206,7 @@ <!-- 第168页 - 偶数页 --> <div class="page-box" page="168"> <div v-if="showPageList.indexOf(168) > -1"> <div v-if="showPageList.indexOf(168) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -225,7 +225,7 @@ <!-- 第169页 - 奇数页 --> <div class="page-box" page="169"> <div v-if="showPageList.indexOf(169) > -1"> <div v-if="showPageList.indexOf(169) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -261,7 +261,7 @@ <!-- 第170页 - 偶数页 --> <div class="page-box" page="170"> <div v-if="showPageList.indexOf(170) > -1"> <div v-if="showPageList.indexOf(170) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -305,7 +305,7 @@ <!-- 第171页 - 奇数页 --> <div class="page-box" page="171"> <div v-if="showPageList.indexOf(171) > -1"> <div v-if="showPageList.indexOf(171) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -338,7 +338,7 @@ <!-- 第172页 - 偶数页 --> <div class="page-box" page="172"> <div v-if="showPageList.indexOf(172) > -1"> <div v-if="showPageList.indexOf(172) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -375,7 +375,7 @@ <!-- 第173页 - 奇数页 --> <div class="page-box" page="173"> <div v-if="showPageList.indexOf(173) > -1"> <div v-if="showPageList.indexOf(173) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -412,7 +412,7 @@ <!-- 第174页 - 偶数页 --> <div class="page-box" page="174"> <div v-if="showPageList.indexOf(174) > -1"> <div v-if="showPageList.indexOf(174) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -449,7 +449,7 @@ <!-- 第175页 - 奇数页 --> <div class="page-box" page="175"> <div v-if="showPageList.indexOf(175) > -1"> <div v-if="showPageList.indexOf(175) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -493,7 +493,7 @@ <!-- 第176页 - 偶数页 --> <div class="page-box" page="176"> <div v-if="showPageList.indexOf(176) > -1"> <div v-if="showPageList.indexOf(176) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -540,7 +540,7 @@ <!-- 第177页 - 奇数页 --> <div class="page-box" page="177"> <div v-if="showPageList.indexOf(177) > -1"> <div v-if="showPageList.indexOf(177) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -580,7 +580,7 @@ <!-- 第178页 - 偶数页 --> <div class="page-box" page="178"> <div v-if="showPageList.indexOf(178) > -1"> <div v-if="showPageList.indexOf(178) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -622,7 +622,7 @@ <!-- 第179页 - 奇数页 --> <div class="page-box" page="179"> <div v-if="showPageList.indexOf(179) > -1"> <div v-if="showPageList.indexOf(179) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -668,7 +668,7 @@ <!-- 第180页 - 偶数页 --> <div class="page-box" page="180"> <div v-if="showPageList.indexOf(180) > -1"> <div v-if="showPageList.indexOf(180) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -706,7 +706,7 @@ <!-- 第181页 - 奇数页 --> <div class="page-box" page="181"> <div v-if="showPageList.indexOf(181) > -1"> <div v-if="showPageList.indexOf(181) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -753,7 +753,7 @@ <!-- 第182页 - 偶数页 --> <div class="page-box" page="182"> <div v-if="showPageList.indexOf(182) > -1"> <div v-if="showPageList.indexOf(182) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -784,7 +784,7 @@ <!-- 第183页 - 奇数页 --> <div class="page-box" page="183"> <div v-if="showPageList.indexOf(183) > -1"> <div v-if="showPageList.indexOf(183) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -823,7 +823,7 @@ <!-- 第184页 - 偶数页 --> <div class="page-box" page="184"> <div v-if="showPageList.indexOf(184) > -1"> <div v-if="showPageList.indexOf(184) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -868,7 +868,7 @@ <!-- 第185页 - 奇数页 --> <div class="page-box" page="185"> <div v-if="showPageList.indexOf(185) > -1"> <div v-if="showPageList.indexOf(185) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -911,7 +911,7 @@ <!-- 第186页 - 偶数页 --> <div class="page-box" page="186"> <div v-if="showPageList.indexOf(186) > -1"> <div v-if="showPageList.indexOf(186) > -1 "> <div class="page-header-right"> <span class="header-title">第八章 认知功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -951,7 +951,7 @@ <!-- 第187页 - 奇数页 --> <div class="page-box" page="187"> <div v-if="showPageList.indexOf(187) > -1"> <div v-if="showPageList.indexOf(187) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 src/books/rehabilitationAssessmentTechniques/view/components/chapter9.vue
@@ -2,7 +2,7 @@ <div class="chapter" num="10"> <!-- 第188页 - 偶数页 --> <div class="page-box" page="188"> <div v-if="showPageList.indexOf(188) > -1"> <div v-if="showPageList.indexOf(188) > -1 "> <div class="page-header-right"> <span class="header-title">第九章 神经功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -46,7 +46,7 @@ <!-- 第189页 - 奇数页 --> <div class="page-box" page="189"> <div v-if="showPageList.indexOf(189) > -1"> <div v-if="showPageList.indexOf(189) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -83,7 +83,7 @@ <!-- 第190页 - 偶数页 --> <div class="page-box" page="190"> <div v-if="showPageList.indexOf(190) > -1"> <div v-if="showPageList.indexOf(190) > -1 "> <div class="page-header-right"> <span class="header-title">第九章 第九章 神经功能评定</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> @@ -125,7 +125,7 @@ <!-- 第191页 - 奇数页 --> <div class="page-box" page="191"> <div v-if="showPageList.indexOf(191) > -1"> <div v-if="showPageList.indexOf(191) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -172,7 +172,7 @@ <!-- 第192页 - 偶数页 --> <div class="page-box" page="192"> <div v-if="showPageList.indexOf(192) > -1"> <div v-if="showPageList.indexOf(192) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -222,7 +222,7 @@ <!-- 第193页 - 奇数页 --> <div class="page-box" page="193"> <div v-if="showPageList.indexOf(193) > -1"> <div v-if="showPageList.indexOf(193) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -265,7 +265,7 @@ <!-- 第194页 - 偶数页 --> <div class="page-box" page="194"> <div v-if="showPageList.indexOf(194) > -1"> <div v-if="showPageList.indexOf(194) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -307,7 +307,7 @@ <!-- 第195页 - 奇数页 --> <div class="page-box" page="195"> <div v-if="showPageList.indexOf(195) > -1"> <div v-if="showPageList.indexOf(195) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -357,7 +357,7 @@ <!-- 第196页 - 偶数页 --> <div class="page-box" page="196"> <div v-if="showPageList.indexOf(196) > -1"> <div v-if="showPageList.indexOf(196) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -410,7 +410,7 @@ <!-- 第197页 - 奇数页 --> <div class="page-box" page="197"> <div v-if="showPageList.indexOf(197) > -1"> <div v-if="showPageList.indexOf(197) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -458,7 +458,7 @@ <!-- 第198页 - 偶数页 --> <div class="page-box" page="198"> <div v-if="showPageList.indexOf(198) > -1"> <div v-if="showPageList.indexOf(198) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -490,7 +490,7 @@ <!-- 第199页 - 奇数页 --> <div class="page-box" page="199"> <div v-if="showPageList.indexOf(199) > -1"> <div v-if="showPageList.indexOf(199) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -509,7 +509,7 @@ <!-- 第200页 - 偶数页 --> <div class="page-box" page="200"> <div v-if="showPageList.indexOf(200) > -1"> <div v-if="showPageList.indexOf(200) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -551,7 +551,7 @@ <!-- 第201页 - 奇数页 --> <div class="page-box" page="201"> <div v-if="showPageList.indexOf(201) > -1"> <div v-if="showPageList.indexOf(201) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -599,7 +599,7 @@ <!-- 第202页 - 偶数页 --> <div class="page-box" page="202"> <div v-if="showPageList.indexOf(202) > -1"> <div v-if="showPageList.indexOf(202) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -639,7 +639,7 @@ <!-- 第203页 - 奇数页 --> <div class="page-box" page="203"> <div v-if="showPageList.indexOf(203) > -1"> <div v-if="showPageList.indexOf(203) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -688,7 +688,7 @@ <!-- 第204页 - 偶数页 --> <div class="page-box" page="204"> <div v-if="showPageList.indexOf(204) > -1"> <div v-if="showPageList.indexOf(204) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -733,7 +733,7 @@ <!-- 第205页 - 奇数页 --> <div class="page-box" page="205"> <div v-if="showPageList.indexOf(205) > -1"> <div v-if="showPageList.indexOf(205) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -774,7 +774,7 @@ <!-- 第206页 - 偶数页 --> <div class="page-box" page="206"> <div v-if="showPageList.indexOf(206) > -1"> <div v-if="showPageList.indexOf(206) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -813,7 +813,7 @@ <!-- 第207页 - 奇数页 --> <div class="page-box" page="207"> <div v-if="showPageList.indexOf(207) > -1"> <div v-if="showPageList.indexOf(207) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -856,7 +856,7 @@ <!-- 第208页 - 偶数页 --> <div class="page-box" page="208"> <div v-if="showPageList.indexOf(208) > -1"> <div v-if="showPageList.indexOf(208) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -897,7 +897,7 @@ <!-- 第209页 - 奇数页 --> <div class="page-box" page="209"> <div v-if="showPageList.indexOf(209) > -1"> <div v-if="showPageList.indexOf(209) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -938,7 +938,7 @@ <!-- 第210页 - 偶数页 --> <div class="page-box" page="210"> <div v-if="showPageList.indexOf(210) > -1"> <div v-if="showPageList.indexOf(210) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -977,7 +977,7 @@ <!-- 第211页 - 奇数页 --> <div class="page-box" page="211"> <div v-if="showPageList.indexOf(211) > -1"> <div v-if="showPageList.indexOf(211) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1020,7 +1020,7 @@ <!-- 第212页 - 偶数页 --> <div class="page-box" page="212"> <div v-if="showPageList.indexOf(212) > -1"> <div v-if="showPageList.indexOf(212) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -1062,7 +1062,7 @@ <!-- 第213页 - 奇数页 --> <div class="page-box" page="213"> <div v-if="showPageList.indexOf(213) > -1"> <div v-if="showPageList.indexOf(213) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1102,7 +1102,7 @@ <!-- 第214页 - 偶数页 --> <div class="page-box" page="214"> <div v-if="showPageList.indexOf(214) > -1"> <div v-if="showPageList.indexOf(214) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -1142,7 +1142,7 @@ <!-- 第215页 - 奇数页 --> <div class="page-box" page="215"> <div v-if="showPageList.indexOf(215) > -1"> <div v-if="showPageList.indexOf(215) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1183,7 +1183,7 @@ <!-- 第216页 - 偶数页 --> <div class="page-box" page="216"> <div v-if="showPageList.indexOf(216) > -1"> <div v-if="showPageList.indexOf(216) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -1223,7 +1223,7 @@ <!-- 第217页 - 奇数页 --> <div class="page-box" page="217"> <div v-if="showPageList.indexOf(217) > -1"> <div v-if="showPageList.indexOf(217) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1263,7 +1263,7 @@ <!-- 第218页 - 偶数页 --> <div class="page-box" page="218"> <div v-if="showPageList.indexOf(218) > -1"> <div v-if="showPageList.indexOf(218) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -1306,7 +1306,7 @@ <!-- 第219页 - 奇数页 --> <div class="page-box" page="219"> <div v-if="showPageList.indexOf(219) > -1"> <div v-if="showPageList.indexOf(219) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1338,7 +1338,7 @@ <!-- 第220页 - 偶数页 --> <div class="page-box" page="220"> <div v-if="showPageList.indexOf(220) > -1"> <div v-if="showPageList.indexOf(220) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -1367,7 +1367,7 @@ <!-- 第221页 - 奇数页 --> <div class="page-box" page="221"> <div v-if="showPageList.indexOf(221) > -1"> <div v-if="showPageList.indexOf(221) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1386,7 +1386,7 @@ <!-- 第222页 - 偶数页 --> <div class="page-box" page="222"> <div v-if="showPageList.indexOf(222) > -1"> <div v-if="showPageList.indexOf(222) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -1421,7 +1421,7 @@ <!-- 第223页 - 奇数页 --> <div class="page-box" page="223"> <div v-if="showPageList.indexOf(223) > -1"> <div v-if="showPageList.indexOf(223) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1457,7 +1457,7 @@ <!-- 第224页 - 偶数页 --> <div class="page-box" page="224"> <div v-if="showPageList.indexOf(224) > -1"> <div v-if="showPageList.indexOf(224) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -1486,7 +1486,7 @@ <!-- 第225页 - 奇数页 --> <div class="page-box" page="225"> <div v-if="showPageList.indexOf(225) > -1"> <div v-if="showPageList.indexOf(225) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1520,7 +1520,7 @@ <!-- 第226页 - 偶数页 --> <div class="page-box" page="226"> <div v-if="showPageList.indexOf(226) > -1"> <div v-if="showPageList.indexOf(226) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -1554,7 +1554,7 @@ <!-- 第227页 - 奇数页 --> <div class="page-box" page="227"> <div v-if="showPageList.indexOf(227) > -1"> <div v-if="showPageList.indexOf(227) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1581,7 +1581,7 @@ <!-- 第228页 - 偶数页 --> <div class="page-box" page="228"> <div v-if="showPageList.indexOf(228) > -1"> <div v-if="showPageList.indexOf(228) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -1600,7 +1600,7 @@ <!-- 第229页 - 奇数页 --> <div class="page-box" page="229"> <div v-if="showPageList.indexOf(229) > -1"> <div v-if="showPageList.indexOf(229) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1625,7 +1625,7 @@ <!-- 第230页 - 偶数页 --> <div class="page-box" page="230"> <div v-if="showPageList.indexOf(230) > -1"> <div v-if="showPageList.indexOf(230) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> @@ -1654,7 +1654,7 @@ <!-- 第231页 - 奇数页 --> <div class="page-box" page="231"> <div v-if="showPageList.indexOf(231) > -1"> <div v-if="showPageList.indexOf(231) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -1683,7 +1683,7 @@ <!-- 第232页 - 偶数页 --> <div class="page-box" page="232"> <div v-if="showPageList.indexOf(232) > -1"> <div v-if="showPageList.indexOf(232) > -1 "> <div class="page-header-right"> <span class="header-title"> 第九章 神经功能评定</span> src/books/rehabilitationAssessmentTechniques/view/components/header.vue
@@ -2,19 +2,19 @@ <div class="chapter" num="1"> <!-- 1页(封面) --> <div class="page-box" page="1" style="min-height: auto"> <div v-if="showPageList.indexOf(1) > -1"> <div v-if="showPageList.indexOf(1) > -1 "> <img style="width: 100%;" src="../../assets/images/fengmian.jpg" /> </div> </div> <!-- 1页(封面) --> <div class="page-box" page="2" style="min-height: auto"> <div v-if="showPageList.indexOf(2) > -1"> <div v-if="showPageList.indexOf(2) > -1 "> <img style="width: 100%;" src="../../assets/images/feiye.png" /> </div> </div> <!-- 第1页 - 奇数页 --> <div class="page-box" page="3"> <div v-if="showPageList.indexOf(3) > -1"> <div v-if="showPageList.indexOf(3) > -1 "> <div class="bodystyle"> <p class="copyright-text">内容提要</p> <p class="copyright-text"> @@ -50,7 +50,7 @@ <!-- 第2页 - 偶数页 --> <div class="page-box" page="4"> <div v-if="showPageList.indexOf(4) > -1"> <div v-if="showPageList.indexOf(4) > -1 "> <div class="bodystyle"> <h1 class="firstTitle-l">全国高等职业教育康复治疗技术专业新形态规划教材建设指导委员会</h1> <p class="content"><span class="bold">主 任 委 员</span> 殷忠勇(<span class="quotation-s">江苏医药职业学院</span>) @@ -75,7 +75,7 @@ <!-- 第3页 - 奇数页 --> <div class="page-box" page="5"> <div v-if="showPageList.indexOf(5) > -1"> <div v-if="showPageList.indexOf(5) > -1 "> <div class="bodystyle"> <h1 class="firstTitle-l">全国高等职业教育康复治疗技术专业新形态规划教材数字教材建设指导委员会</h1> <p class="content"><span class="bold">主 任 委 员</span> 张光宇(<span @@ -95,7 +95,7 @@ <!-- 第4页 - 偶数页 --> <div class="page-box" page="6"> <div v-if="showPageList.indexOf(6) > -1"> <div v-if="showPageList.indexOf(6) > -1 "> <div class="bodystyle"> <h1 class="firstTitle-l">编者名单</h1> <p class="content"><span class="bold">主 编</span> 耿姣姣 张永静</p> @@ -119,7 +119,7 @@ <!-- 第5页 - 奇数页 --> <div class="page-box" page="7"> <div v-if="showPageList.indexOf(7) > -1"> <div v-if="showPageList.indexOf(7) > -1 "> <div class="bodystyle"> <h1 class="firstTitle-l">数字教材编者名单</h1> <p class="content"><span class="bold">主 编</span> 耿姣姣 张永静</p> @@ -140,7 +140,7 @@ <!-- 第6页 - 偶数页 --> <div class="page-box" page="8"> <div v-if="showPageList.indexOf(8) > -1"> <div v-if="showPageList.indexOf(8) > -1 "> <div class="bodystyle"> <h1 class="firstTitle-l">出版说明</h1> <p class="content"> @@ -162,7 +162,7 @@ <!-- 第7页 - 奇数页 --> <div class="page-box" page="9"> <div v-if="showPageList.indexOf(9) > -1"> <div v-if="showPageList.indexOf(9) > -1 "> <div class="page-header-left"> <div class="header-txt"> 康复评定技术 @@ -204,7 +204,7 @@ <!-- 第8页 - 偶数页 --> <div class="page-box" page="10"> <div v-if="showPageList.indexOf(10) > -1"> <div v-if="showPageList.indexOf(10) > -1 "> <div class="bodystyle"> <h1 class="firstTitle-l">前言</h1> <p class="content"> @@ -228,7 +228,7 @@ <!-- 第9页 - 奇数页 --> <div class="page-box" page="11"> <div v-if="showPageList.indexOf(11) > -1"> <div v-if="showPageList.indexOf(11) > -1 "> <div class="page-header-right"> <span class="header-title">第一章 绪论</span> <img class="header-img" src="../../assets/images/pageHeader.png" /> src/books/rehabilitationAssessmentTechniques/view/components/index.vue
@@ -8,47 +8,47 @@ transform: `scale(${pageZoom})`, transformOrigin: 'center top', }"> <pageHeader v-if="showCatalogList.indexOf(1) > -1" :showPageList="loadPageList"></pageHeader> <chapter1 v-if="showCatalogList.indexOf(2) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <pageHeader v-if="showCatalogList.indexOf(1) > -1 " :showPageList="loadPageList"></pageHeader> <chapter1 v-if="showCatalogList.indexOf(2) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter1> <chapter2 v-if="showCatalogList.indexOf(3) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter2 v-if="showCatalogList.indexOf(3) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter2> <chapter3 v-if="showCatalogList.indexOf(4) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter3 v-if="showCatalogList.indexOf(4) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter3> <chapter4 v-if="showCatalogList.indexOf(5) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter4 v-if="showCatalogList.indexOf(5) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter4> <chapter5 v-if="showCatalogList.indexOf(6) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter5 v-if="showCatalogList.indexOf(6) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter5> <chapter6 v-if="showCatalogList.indexOf(7) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter6 v-if="showCatalogList.indexOf(7) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter6> <chapter7 v-if="showCatalogList.indexOf(8) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter7 v-if="showCatalogList.indexOf(8) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter7> <chapter8 v-if="showCatalogList.indexOf(9) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter8 v-if="showCatalogList.indexOf(9) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter8> <chapter9 v-if="showCatalogList.indexOf(10) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter9 v-if="showCatalogList.indexOf(10) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter9> <chapter10 v-if="showCatalogList.indexOf(11) > -1" :showPageList="loadPageList" <chapter10 v-if="showCatalogList.indexOf(11) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter10> <chapter11 v-if="showCatalogList.indexOf(12) > -1" :showPageList="loadPageList" <chapter11 v-if="showCatalogList.indexOf(12) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter11> <chapter12 v-if="showCatalogList.indexOf(13) > -1" :showPageList="loadPageList" <chapter12 v-if="showCatalogList.indexOf(13) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter12> <chapter13 v-if="showCatalogList.indexOf(14) > -1" :showPageList="loadPageList" <chapter13 v-if="showCatalogList.indexOf(14) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter13> <chapter14 v-if="showCatalogList.indexOf(15) > -1" :showPageList="loadPageList" <chapter14 v-if="showCatalogList.indexOf(15) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter14> <chapter15 v-if="showCatalogList.indexOf(16) > -1" :showPageList="loadPageList" <chapter15 v-if="showCatalogList.indexOf(16) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter15> <chapter16 v-if="showCatalogList.indexOf(17) > -1" :showPageList="loadPageList" <chapter16 v-if="showCatalogList.indexOf(17) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter16> <chapter17 v-if="showCatalogList.indexOf(18) > -1" :showPageList="loadPageList" <chapter17 v-if="showCatalogList.indexOf(18) > -1 " :showPageList="loadPageList" :resourceList="resourceList"> </chapter17> @@ -347,7 +347,7 @@ // 处理标记数据 handelSignData(type, data) { if (this.loadPageList.indexOf(Number(data.page)) > -1) { if (this.loadPageList.indexOf(Number(data.page)) > -1 ) { // 立即渲染 this.renderSign(type, data); } @@ -386,7 +386,7 @@ } for (let i = 0; i < allTextNodes.length; i++) { const textDom = allTextNodes[i]; if (textDom.textContent.indexOf(data.txt) > -1) { if (textDom.textContent.indexOf(data.txt) > -1 ) { let reg = new RegExp(`${data.txt}`, "ig"); switch (type) { case "Highlight": src/books/rehabilitationMedicineIntroduction/assets/main.less
@@ -20,6 +20,8 @@ position: relative; } .page-header-left { padding: 70px 0 20px 0; } @@ -359,7 +361,7 @@ .p-bqy { line-height: 20px; font-size: 12px; font-size: 14px; } @@ -1007,7 +1009,6 @@ /*正文内容居中*/ .center { font-size: 1em; text-indent: 0em; text-align: center; } src/books/rehabilitationMedicineIntroduction/view/components/header.vue
@@ -20,8 +20,9 @@ 本教材是“全国高等职业教育康复治疗技术专业新形态规划教材”之一,系根据本套教材的编写指导思想和原则要求,结合专业培养目标和本课程要求的教学目标编写而成,内容涵盖了残疾学、功能障碍、康复医学的工作方式和流程等。此外,本教材还增加了丰富的数字资源,包括微课、课件、思维导图、岗位对标考试等知识点总结、能力测试等,丰富了教材内容,增强了线上和线下教学的联动性,以提升学生学习的主动性和积极性。 </p> <p class="p-bqy mb-10">本教材主要供康复治疗技术、中医康复技术、运动健康指导、体育保健与康复等专业使用,还可作为康复医学工作者的参考书。</p> <p class="p-bqy bold">图书在版编目(CIP)数据</p> <p class="p-bqy">康复医学导论/阎小芹主编.--北京:中国协和医科大学出版社,2025.7.--(全国高等职业教育康复治疗技术专业新形态规划教材).--ISBN <p><br></p> <p class="p-bqy bold ">图书在版编目(CIP)数据</p> <p class="p-bqy mb-10">康复医学导论/阎小芹主编.--北京:中国协和医科大学出版社,2025.7.--(全国高等职业教育康复治疗技术专业新形态规划教材).--ISBN 978-7-5679-2640-0</p> <p class="p-bqy">Ⅰ.R49</p> <p class="p-bqy">中国国家版本馆CIP数据核字第2025F9C602号</p> src/books/rehabilitationMedicineIntroduction/view/components/index.vue
@@ -9,21 +9,21 @@ transformOrigin: 'center top', }"> <pageHeader v-if="showCatalogList.indexOf(1) > -1" :showPageList="loadPageList"></pageHeader> <chapter1 v-if="showCatalogList.indexOf(2) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter1 v-if="showCatalogList.indexOf(2) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun"> </chapter1> <chapter2 v-if="showCatalogList.indexOf(3) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter2 v-if="showCatalogList.indexOf(3) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun"> </chapter2> <chapter3 v-if="showCatalogList.indexOf(4) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter3 v-if="showCatalogList.indexOf(4) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun"> </chapter3> <chapter4 v-if="showCatalogList.indexOf(5) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter4 v-if="showCatalogList.indexOf(5) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun"> </chapter4> <chapter5 v-if="showCatalogList.indexOf(6) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter5 v-if="showCatalogList.indexOf(6) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun"> </chapter5> <chapter6 v-if="showCatalogList.indexOf(7) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter6 v-if="showCatalogList.indexOf(7) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun"> </chapter6> <chapter7 v-if="showCatalogList.indexOf(8) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter7 v-if="showCatalogList.indexOf(8) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun"> </chapter7> <chapter8 v-if="showCatalogList.indexOf(9) > -1" :showPageList="loadPageList" :resourceList="resourceList"> <chapter8 v-if="showCatalogList.indexOf(9) > -1" :showPageList="loadPageList" :getResourceInfo="resourceListFun"> </chapter8> </div> @@ -41,7 +41,6 @@ import chapter6 from "./chapter6.vue" import chapter7 from "./chapter7.vue" import chapter8 from "./chapter8.vue" import NoteIcon from "@/assets/images/biji.png"; import _ from "lodash"; import Swiper from "swiper/bundle"; @@ -178,7 +177,7 @@ threshold: 0, // 指定交叉比例,这里设为 0.5,表示当目标元素一半或更多显示在视窗中时触发回调函数。 }); // this.getBookResourceList(); this.getBookResourceList(); // 启动页码观察 setTimeout(() => { @@ -188,7 +187,7 @@ // 测试页面跳转 setTimeout(() => { this.gotoPage(2, 28); this.gotoPage(3, 31); }, 500); // const pageDom = (this.container ? this.container : document) @@ -226,7 +225,7 @@ this.resourceList = await this.config.getBookResources( process.env.VUE_APP_RESOURCE_CTX + (process.env.VUE_APP_ENV == "product" ? process.env.VUE_APP_BOOK_ID : "clinicalDiseasesSummary") : "rehabilitationMedicineIntroduction") ); }, // 滚动监听 src/components/dialogExaminations/index.vue
@@ -30,7 +30,7 @@ <!-- 标题 --> <div class="questionTitle"> <div class="titleContent"> <span class="questionNum" :style="{ <span class="questionNum" v-if="item.catalogName != '材料题'" :style="{ marginTop: value.questionType == 'completion' || value.questionType == 'mathField' @@ -38,6 +38,18 @@ : '0', }">{{ index + 1 }}. </span> <span class="questionNum" v-if=" item.catalogName == '材料题' && value.questionType != 'material' " :style="{ marginTop: value.questionType == 'completion' || value.questionType == 'mathField' ? '12px' : '0', }">{{ index }}. </span> <!-- 听力进度条 --> <!-- <answerAudioPlayer :audioUrl="value.src" v-show="item.name == '听力题'" /> --> <!-- 仅文字 --> @@ -74,8 +86,8 @@ typeof itemText != 'string' && value.questionType == 'mathField' " class="mathField" :menuItems="[]" @input=" onChangeInput($event, nindex, index, itemText.num) "> onChangeInput($event, nindex, index, itemText.num) "> {{ value.userAnswer[itemText.num] }} </math-field> </span> @@ -95,9 +107,10 @@ </p> </div> <img :src="value.isCollect ? isHeart : heart" alt="" class="collect-png" @click="setCollect(nindex, index)" v-if="!hideCollect && item.type != 'material'" /> @click="setCollect(nindex, index)" v-if="!hideCollect && value.questionType != 'material'" /> <!-- 收藏 --> </div> <!-- 选项 --> <div class="questionContent"> <!-- 单选 --> <el-radio-group :disabled="value.isComplete" class="option" v-if=" @@ -106,10 +119,10 @@ " v-model="value.userAnswer"> <el-radio v-for="(content, contentIndex) in value.option" :key="contentIndex + 'contentIndex'" :label="content.value" :class="value.optionStyle == 'Image' || value.optionStyle == 'TxtAndImage' || value.optionStyle == 'RichText' ? 'optionImg' : 'optionTxt' value.optionStyle == 'TxtAndImage' || value.optionStyle == 'RichText' ? 'optionImg' : 'optionTxt' "> <p class="optionContent" v-if="value.optionStyle == 'Txt'"> {{ content.value }}、{{ content.txt }} @@ -133,10 +146,10 @@ v-else-if="value.questionType == 'multipleChoice'"> <el-checkbox v-for="(content, contentCindex) in value.option" :key="contentCindex + 'contentCindex'" :label="content.value" :name="content.text" :class="value.optionStyle == 'Image' || value.optionStyle == 'TxtAndImage' || value.optionStyle == 'RichText' ? 'optionImg' : 'optionTxt' value.optionStyle == 'TxtAndImage' || value.optionStyle == 'RichText' ? 'optionImg' : 'optionTxt' "> <p class="optionContent" v-if="value.optionStyle == 'Txt'"> {{ content.value }}、{{ content.txt }} @@ -175,7 +188,7 @@ <el-button @click="checkPares(value)" style="margin-top: 10px">查看解析</el-button> </div> <!-- 提交后解析 --> <div class="analysis" v-if="value.isComplete"> <div class="analysis" v-if="value.isComplete && value.questionType != 'material'"> <el-collapse v-model="value.isUnfold" accordion v-if=" value.questionType != 'shortAnswer' && value.questionType != 'formula' @@ -189,8 +202,8 @@ <span v-html="arrayToString(value.answer)" class="correctBox"></span> </p> <p :class="value.isRight ? 'correct textOverFlow' : 'error textOverFlow' ? 'correct textOverFlow' : 'error textOverFlow' " :title="arrayToString(value.userAnswer)" style="margin-left: 20px"> <span>您的答案:</span> <span class="errorBox" v-if="isHaveAnswer(value.userAnswer)">{{ @@ -219,13 +232,12 @@ fill="#d81e06" p-id="25746"></path> </svg> </span> <div class="headerConent sitgBox"> <p v-if="!value.isUnfold"> <span class="analysisColor">展开解析</span><el-image /> <span class="analysisColor">展开解析</span> </p> <p v-else> <span class="analysisColor">收起解析</span><el-image /> <span class="analysisColor">收起解析</span> </p> </div> </div> @@ -259,10 +271,10 @@ <div class="referBox" v-if="value.analysisCon"> <span>解析:</span> <p v-html="value.analysisCon" :class="[ 'subjectiveBox', 'ti-2', value.isUnfold ? 'yincang' : '', ].join(' ') 'subjectiveBox', 'ti-2', value.isUnfold ? 'yincang' : '', ].join(' ') "></p> </div> </el-collapse-item> @@ -273,18 +285,18 @@ </ul> </div> <div class="bottom-btn" v-if="!loading"> <el-button class="examinations-btn-box" @click="saveAnswer">保存</el-button> <el-button class="examinations-btn-box" @click="saveAnswer(page)">保存</el-button> <el-button @click=" (page) => { () => { handleQuestion(); saveAnswer(page); saveAnswer(this.page); } " class="examinations-btn-box" :style="{ borderColor: primaryColor }">提交</el-button> <el-button @click="redo" class="examinations-btn-box">重做</el-button> <el-button @click=" (page) => { () => { openAnswers(); saveAnswer(page); saveAnswer(this.page); } " class="examinations-btn-box" :style="{ borderColor: primaryColor }">查看答案</el-button> </div> @@ -299,6 +311,7 @@ import { Message } from "element-ui"; import TEditorVue from "../teditor/index.vue"; import config from "@/assets/js/config"; import getQuestionList from "@/assets/methods/examination"; export default { name: "examination-option", components: { TEditorVue }, @@ -333,7 +346,7 @@ type: Array, required: true, default: () => [], } }, }, data() { return { @@ -371,10 +384,8 @@ watch: { cardList: { handler(newVal, ol) { console.log("题目组件newVal", newVal); // this.cardData = this.cardList; if (newVal && newVal.length) { this.loading = false; if (newVal && newVal.length && this.loading) { this.handleCardle(); } }, immediate: true, @@ -386,6 +397,68 @@ this.getErrorList(); }, methods: { async openDialogQuestion() { this.localDialogVisible = true; await this.handleCardle(); }, // 处理逻辑问题 async handleCardle() { this.loading = true; this.cardData = await getQuestionList( this.page, this.questionIDList, this.config.activeBook, this.cardList ); if (this.cardData && this.cardData.length) { // 递归处理所有题目,展开 childList this.cardData = this.flattenCardData(this.cardData); this.loading = false; } }, /** * 递归处理 cardData,将 material 类型题目的 childList 展开 * 并为每个子题添加 parentIndex,方便后续定位 */ flattenCardData(cardData) { const processedData = []; cardData.forEach((section, sectionIndex) => { // 为每个大类(如单选题、材料题)创建一个新的对象 const processedSection = { ...section, infoList: [], // 重置 infoList 用于存放处理后的题目 }; section.infoList.forEach((item, itemIndex) => { if ( item.questionType == "material" && item.childList && item.childList.length > 0 ) { // 如果是材料题且有子题 // 1. 保留材料题本身(如果需要显示题干) processedSection.infoList.push(item); item.childList.forEach((child, childIndex) => { // 将子题添加到渲染列表 processedSection.infoList.push(child); }); } else { // 如果不是材料题,或者没有子题,直接添加 processedSection.infoList.push(item); } }); // 将处理好的 section 添加到最终结果中 // 只有当处理后的 infoList 有内容时才添加该 section if (processedSection.infoList.length > 0) { processedData.push(processedSection); } }); return processedData; }, hadleOpenDialog() { }, // 获取不受保护的图片 getPublicImage(md5, width, height) { @@ -473,15 +546,12 @@ }, // 批改题目 (练习,我的做题,我的收藏模式下) handleQuestion() { debugger let errorId = []; const list = this.cardData; for (let index = 0; index < list.length; index++) { const item = list[index]; for (let cindex = 0; cindex < item.infoList.length; cindex++) { const citem = item.infoList[cindex]; citem.isComplete = true; // 修改题目状态为完成 citem.isComplete = true; // 批改题目 @@ -564,9 +634,9 @@ } }, // 保存按钮 saveAnswer(e) { if (e) { const pageNum = e saveAnswer(page) { if (page) { const pageNum = page; const oldAnswerData = localStorage.getItem( this.config.activeBook.name + "oldAnswerData" ); @@ -579,6 +649,8 @@ asnwerList.push({ id: citem.id, userAnswer: citem.userAnswer, isComplete: citem.isComplete, isRight: citem.isRight, }); } } @@ -597,14 +669,6 @@ ); Message.success("保存成功"); } // if(oldData[this.chapter]) { // oldData[this.chapter][this.page] = asnwerList // } else { // oldData[this.chapter] = {} // oldData[this.chapter][this.page] = asnwerList // } // console.log(oldData); }, handleCollect(infoNum, num) { this.cardData[infoNum].infoList[num].isCollect = @@ -619,7 +683,6 @@ item = this.cardData[num]; } item.isCollect = !item.isCollect; console.log(111, item); if (this.cardData.length == 0) { this.collectList.push(item.id); } else { @@ -637,7 +700,6 @@ const item = this.allCollect[index]; if (item.type == this.sourceType) item.collectList = this.collectList; } console.log("点击收藏按钮", this.allCollect); this.MG.identity .setUserKey({ setKeyRequests: [ @@ -654,8 +716,7 @@ }, // 获取收藏id列表 getCollectIdList() { console.log(this.cardList, "cardList") const token = localStorage.getItem("token"); const token = localStorage.getItem(this.config.tokenKey); if (!token) return false; this.MG.identity .getUserKey({ @@ -665,7 +726,6 @@ .then((res) => { try { const collect = JSON.parse(res[0].value); console.log("全部收藏id", collect); if (collect.length) { this.collectList = collect.find( (citem) => citem.type == this.sourceType @@ -687,7 +747,7 @@ }, // 获取错题id列表 getErrorList() { const token = localStorage.getItem("token"); const token = localStorage.getItem(this.config.tokenKey); if (!token) return false; this.MG.identity .getUserKey({ @@ -717,17 +777,6 @@ }, closeDialog() { this.localDialogVisible = false; }, openDialogQuestion() { this.localDialogVisible = true; console.log(this.cardList, "this.cardList组件"); console.log(this.page, "this.page组件"); console.log(this.questionIDList, "this.questionIDList组件"); console.log(this.config.activeBook,"this.config.activeBook组件"); }, }, }; @@ -1116,7 +1165,6 @@ } /deep/ .el-collapse-item__content { width: 100%; padding: 0 20px; background-color: #f4f4f4; font-size: 16px; @@ -1439,7 +1487,7 @@ color: #fff; font-weight: 900; font-size: 16px; font-family: 'FZLTXIHJW'; font-family: "FZLTXIHJW"; span:nth-child(2):hover { cursor: pointer; @@ -1451,7 +1499,7 @@ color: #fff; font-weight: 900; font-size: 16px; font-family: 'FZLTXIHJW'; font-family: "FZLTXIHJW"; } } @@ -1473,8 +1521,6 @@ } } } .notBox { position: absolute; src/components/svgIcon/index.vue
@@ -3,12 +3,12 @@ <i v-if="iconFileName.indexOf('el-icon-') === 0" :class="iconFileName" /> <!-- 如果是 SVG 图标,进行改造 --> <svg v-else class="svg-icon" aria-hidden="true" v-on="$listeners" > <svg v-else class="svg-icon" aria-hidden="true" v-on="$listeners"> <!-- :xlink:href 动态绑定图标ID 注意:这里假设你的图标ID是 "icon-" + iconFileName --> <use :xlink:href="`#icon-${iconFileName}`" /> <use class="useBox" :xlink:href="`#icon-${iconFileName}`" /> </svg> </template> @@ -26,18 +26,10 @@ <style scoped> .svg-icon { /* 1. width 和 height 使用 em 单位,使其与 font-size 关联。 2. overflow: hidden 防止图标在某些情况下溢出。 3. vertical-align: 调整图标与文字的对齐基线。 4. fill: currentColor; 告诉SVG内部所有没有指定fill的元素, 统一使用当前元素的 'color' 值作为填充色。 */ width: 1em; height: 1em; overflow: hidden; vertical-align: -0.15em; fill: currentColor; } </style> yarn.lock
@@ -24,13 +24,14 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.24" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1", "@babel/code-frame@^7.24.2": version "7.24.2" resolved "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.24.2.tgz" integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.24.2", "@babel/code-frame@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: "@babel/highlight" "^7.24.2" picocolors "^1.0.0" "@babel/helper-validator-identifier" "^7.27.1" js-tokens "^4.0.0" picocolors "^1.1.1" "@babel/code-frame@7.12.11": version "7.12.11" @@ -39,10 +40,10 @@ dependencies: "@babel/highlight" "^7.10.4" "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.23.5", "@babel/compat-data@^7.24.4": version "7.24.4" resolved "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.24.4.tgz" integrity sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ== "@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.0": version "7.28.0" resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz" integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== "@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.11.0", "@babel/core@^7.12.0", "@babel/core@^7.12.16", "@babel/core@^7.13.0", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0": version "7.24.4" @@ -74,213 +75,169 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" "@babel/generator@^7.24.1", "@babel/generator@^7.24.4": version "7.24.4" resolved "https://registry.npmmirror.com/@babel/generator/-/generator-7.24.4.tgz" integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== "@babel/generator@^7.24.4", "@babel/generator@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz" integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== dependencies: "@babel/types" "^7.24.0" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" "@babel/parser" "^7.28.3" "@babel/types" "^7.28.2" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" jsesc "^3.0.2" "@babel/helper-annotate-as-pure@^7.22.5": version "7.22.5" resolved "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== "@babel/helper-annotate-as-pure@^7.27.1", "@babel/helper-annotate-as-pure@^7.27.3": version "7.27.3" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz" integrity sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== dependencies: "@babel/types" "^7.22.5" "@babel/types" "^7.27.3" "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": version "7.22.15" resolved "https://registry.npmmirror.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz" integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== "@babel/helper-compilation-targets@^7.12.16", "@babel/helper-compilation-targets@^7.23.6", "@babel/helper-compilation-targets@^7.27.1", "@babel/helper-compilation-targets@^7.27.2": version "7.27.2" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: "@babel/types" "^7.22.15" "@babel/helper-compilation-targets@^7.12.16", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.23.6": version "7.23.6" resolved "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz" integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ== dependencies: "@babel/compat-data" "^7.23.5" "@babel/helper-validator-option" "^7.23.5" browserslist "^4.22.2" "@babel/compat-data" "^7.27.2" "@babel/helper-validator-option" "^7.27.1" browserslist "^4.24.0" lru-cache "^5.1.1" semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.1", "@babel/helper-create-class-features-plugin@^7.24.4": version "7.24.4" resolved "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz" integrity sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ== "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.27.1", "@babel/helper-create-class-features-plugin@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz" integrity sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-annotate-as-pure" "^7.27.3" "@babel/helper-member-expression-to-functions" "^7.27.1" "@babel/helper-optimise-call-expression" "^7.27.1" "@babel/helper-replace-supers" "^7.27.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/traverse" "^7.28.3" semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": version "7.22.15" resolved "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz" integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz" integrity sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" regexpu-core "^5.3.1" "@babel/helper-annotate-as-pure" "^7.27.1" regexpu-core "^6.2.0" semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.6.1": version "0.6.1" resolved "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz" integrity sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA== "@babel/helper-define-polyfill-provider@^0.6.5": version "0.6.5" resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz" integrity sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg== dependencies: "@babel/helper-compilation-targets" "^7.22.6" "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-plugin-utils" "^7.27.1" debug "^4.4.1" lodash.debounce "^4.0.8" resolve "^1.14.2" resolve "^1.22.10" "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" resolved "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz" integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== "@babel/helper-globals@^7.28.0": version "7.28.0" resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== "@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": version "7.23.0" resolved "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz" integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== "@babel/helper-member-expression-to-functions@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz" integrity sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== dependencies: "@babel/template" "^7.22.15" "@babel/types" "^7.23.0" "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" "@babel/helper-hoist-variables@^7.22.5": version "7.22.5" resolved "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== dependencies: "@babel/types" "^7.22.5" "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" "@babel/helper-member-expression-to-functions@^7.23.0": version "7.23.0" resolved "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz" integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== "@babel/helper-module-transforms@^7.23.3", "@babel/helper-module-transforms@^7.27.1": version "7.28.3" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz" integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== dependencies: "@babel/types" "^7.23.0" "@babel/helper-module-imports" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" "@babel/traverse" "^7.28.3" "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.24.1", "@babel/helper-module-imports@^7.24.3": version "7.24.3" resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz" integrity sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg== "@babel/helper-optimise-call-expression@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz" integrity sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== dependencies: "@babel/types" "^7.24.0" "@babel/types" "^7.27.1" "@babel/helper-module-imports@~7.22.15": version "7.22.15" resolved "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.27.1", "@babel/helper-plugin-utils@^7.8.0": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz" integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== "@babel/helper-remap-async-to-generator@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz" integrity sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== dependencies: "@babel/types" "^7.22.15" "@babel/helper-annotate-as-pure" "^7.27.1" "@babel/helper-wrap-function" "^7.27.1" "@babel/traverse" "^7.27.1" "@babel/helper-module-transforms@^7.23.3": version "7.23.3" resolved "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz" integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== "@babel/helper-replace-supers@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz" integrity sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-module-imports" "^7.22.15" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-member-expression-to-functions" "^7.27.1" "@babel/helper-optimise-call-expression" "^7.27.1" "@babel/traverse" "^7.27.1" "@babel/helper-optimise-call-expression@^7.22.5": version "7.22.5" resolved "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== "@babel/helper-skip-transparent-expression-wrappers@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz" integrity sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== dependencies: "@babel/types" "^7.22.5" "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.24.0" resolved "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz" integrity sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w== "@babel/helper-string-parser@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz" integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== "@babel/helper-remap-async-to-generator@^7.22.20": version "7.22.20" resolved "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz" integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== "@babel/helper-validator-identifier@^7.22.20", "@babel/helper-validator-identifier@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz" integrity sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== "@babel/helper-validator-option@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz" integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== "@babel/helper-wrap-function@^7.27.1": version "7.28.3" resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz" integrity sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-wrap-function" "^7.22.20" "@babel/helper-replace-supers@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz" integrity sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-member-expression-to-functions" "^7.23.0" "@babel/helper-optimise-call-expression" "^7.22.5" "@babel/helper-simple-access@^7.22.5": version "7.22.5" resolved "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: "@babel/types" "^7.22.5" "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": version "7.22.5" resolved "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== dependencies: "@babel/types" "^7.22.5" "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" resolved "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== dependencies: "@babel/types" "^7.22.5" "@babel/helper-string-parser@^7.23.4": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz" integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== "@babel/helper-validator-option@^7.23.5": version "7.23.5" resolved "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== "@babel/helper-wrap-function@^7.22.20": version "7.22.20" resolved "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz" integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== dependencies: "@babel/helper-function-name" "^7.22.5" "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" "@babel/template" "^7.27.2" "@babel/traverse" "^7.28.3" "@babel/types" "^7.28.2" "@babel/helpers@^7.24.4": version "7.24.4" resolved "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.24.4.tgz" integrity sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw== version "7.28.3" resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz" integrity sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw== dependencies: "@babel/template" "^7.24.0" "@babel/traverse" "^7.24.1" "@babel/types" "^7.24.0" "@babel/template" "^7.27.2" "@babel/types" "^7.28.2" "@babel/highlight@^7.10.4", "@babel/highlight@^7.24.2": "@babel/highlight@^7.10.4": version "7.24.2" resolved "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.24.2.tgz" integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== @@ -290,746 +247,645 @@ js-tokens "^4.0.0" picocolors "^1.0.0" "@babel/parser@^7.23.5", "@babel/parser@^7.23.9", "@babel/parser@^7.24.0", "@babel/parser@^7.24.1", "@babel/parser@^7.24.4": version "7.24.4" resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.4.tgz" integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.4": version "7.24.4" resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz" integrity sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA== "@babel/parser@^7.23.5", "@babel/parser@^7.24.4", "@babel/parser@^7.27.2", "@babel/parser@^7.28.0", "@babel/parser@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz" integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.24.0" "@babel/types" "^7.28.2" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz" integrity sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg== "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz" integrity sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/traverse" "^7.27.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz" integrity sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ== "@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz" integrity sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-transform-optional-chaining" "^7.24.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz" integrity sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz" integrity sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz" integrity sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-transform-optional-chaining" "^7.27.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz" integrity sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/traverse" "^7.28.3" "@babel/plugin-proposal-class-properties@^7.12.13": version "7.18.6" resolved "https://registry.npmmirror.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== dependencies: "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-proposal-decorators@^7.12.13": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.1.tgz" integrity sha512-zPEvzFijn+hRvJuX2Vu3KbEBN39LN3f7tW3MQO2LsIs57B26KU+kUc82BdAktS1VCM6libzh45eKGI65lg0cpA== version "7.28.0" resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.28.0.tgz" integrity sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg== dependencies: "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-decorators" "^7.24.1" "@babel/helper-create-class-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-syntax-decorators" "^7.27.1" "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": version "7.21.0-placeholder-for-preset-env.2" resolved "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== "@babel/plugin-syntax-decorators@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.27.1.tgz" integrity sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-class-properties@^7.12.13": version "7.12.13" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== dependencies: "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-class-static-block@^7.14.5": version "7.14.5" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-decorators@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.1.tgz" integrity sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-syntax-dynamic-import@^7.8.3": version "7.8.3" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== "@babel/plugin-syntax-import-assertions@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz" integrity sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-syntax-import-assertions@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz" integrity sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ== "@babel/plugin-syntax-import-attributes@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz" integrity sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-syntax-import-attributes@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz" integrity sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA== "@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz" integrity sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-import-meta@^7.10.4": version "7.10.4" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-json-strings@^7.8.3": version "7.8.3" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.23.3": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz" integrity sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": version "7.10.4" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-numeric-separator@^7.10.4": version "7.10.4" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== dependencies: "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-object-rest-spread@^7.8.3": version "7.8.3" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding@^7.8.3": version "7.8.3" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-optional-chaining@^7.8.3": version "7.8.3" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== dependencies: "@babel/helper-plugin-utils" "^7.8.0" "@babel/plugin-syntax-private-property-in-object@^7.14.5": version "7.14.5" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/plugin-syntax-top-level-await@^7.14.5": version "7.14.5" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" resolved "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-arrow-functions@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz" integrity sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw== "@babel/plugin-transform-arrow-functions@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz" integrity sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-async-generator-functions@^7.24.3": version "7.24.3" resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz" integrity sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg== "@babel/plugin-transform-async-generator-functions@^7.28.0": version "7.28.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz" integrity sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-remap-async-to-generator" "^7.27.1" "@babel/traverse" "^7.28.0" "@babel/plugin-transform-async-to-generator@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz" integrity sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw== "@babel/plugin-transform-async-to-generator@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz" integrity sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA== dependencies: "@babel/helper-module-imports" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/helper-module-imports" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-remap-async-to-generator" "^7.27.1" "@babel/plugin-transform-block-scoped-functions@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz" integrity sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg== "@babel/plugin-transform-block-scoped-functions@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz" integrity sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-block-scoping@^7.24.4": version "7.24.4" resolved "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz" integrity sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g== "@babel/plugin-transform-block-scoping@^7.28.0": version "7.28.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz" integrity sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-class-properties@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz" integrity sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g== "@babel/plugin-transform-class-properties@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz" integrity sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA== dependencies: "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-create-class-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-class-static-block@^7.24.4": version "7.24.4" resolved "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz" integrity sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg== "@babel/plugin-transform-class-static-block@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz" integrity sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg== dependencies: "@babel/helper-create-class-features-plugin" "^7.24.4" "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/helper-create-class-features-plugin" "^7.28.3" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-classes@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz" integrity sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q== "@babel/plugin-transform-classes@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz" integrity sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" "@babel/helper-annotate-as-pure" "^7.27.3" "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-globals" "^7.28.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-replace-supers" "^7.27.1" "@babel/traverse" "^7.28.3" "@babel/plugin-transform-computed-properties@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz" integrity sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw== "@babel/plugin-transform-computed-properties@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz" integrity sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/template" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/template" "^7.27.1" "@babel/plugin-transform-destructuring@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz" integrity sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw== "@babel/plugin-transform-destructuring@^7.28.0": version "7.28.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz" integrity sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/traverse" "^7.28.0" "@babel/plugin-transform-dotall-regex@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz" integrity sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw== "@babel/plugin-transform-dotall-regex@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz" integrity sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-create-regexp-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-duplicate-keys@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz" integrity sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA== "@babel/plugin-transform-duplicate-keys@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz" integrity sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-dynamic-import@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz" integrity sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA== "@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz" integrity sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/helper-create-regexp-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-exponentiation-operator@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz" integrity sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw== "@babel/plugin-transform-dynamic-import@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz" integrity sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== dependencies: "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-export-namespace-from@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz" integrity sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ== "@babel/plugin-transform-explicit-resource-management@^7.28.0": version "7.28.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz" integrity sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-destructuring" "^7.28.0" "@babel/plugin-transform-for-of@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz" integrity sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg== "@babel/plugin-transform-exponentiation-operator@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz" integrity sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-function-name@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz" integrity sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA== "@babel/plugin-transform-export-namespace-from@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz" integrity sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== dependencies: "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-function-name" "^7.23.0" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-json-strings@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz" integrity sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ== "@babel/plugin-transform-for-of@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz" integrity sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-transform-literals@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz" integrity sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g== "@babel/plugin-transform-function-name@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz" integrity sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-compilation-targets" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/traverse" "^7.27.1" "@babel/plugin-transform-logical-assignment-operators@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz" integrity sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w== "@babel/plugin-transform-json-strings@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz" integrity sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-member-expression-literals@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz" integrity sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg== "@babel/plugin-transform-literals@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz" integrity sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-modules-amd@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz" integrity sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ== "@babel/plugin-transform-logical-assignment-operators@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz" integrity sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw== dependencies: "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-modules-commonjs@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz" integrity sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw== "@babel/plugin-transform-member-expression-literals@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz" integrity sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== dependencies: "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-simple-access" "^7.22.5" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-modules-systemjs@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz" integrity sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA== "@babel/plugin-transform-modules-amd@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz" integrity sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== dependencies: "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-validator-identifier" "^7.22.20" "@babel/helper-module-transforms" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-modules-umd@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz" integrity sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg== "@babel/plugin-transform-modules-commonjs@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz" integrity sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw== dependencies: "@babel/helper-module-transforms" "^7.23.3" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-module-transforms" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": version "7.22.5" resolved "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== "@babel/plugin-transform-modules-systemjs@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz" integrity sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.5" "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-module-transforms" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" "@babel/traverse" "^7.27.1" "@babel/plugin-transform-new-target@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz" integrity sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug== "@babel/plugin-transform-modules-umd@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz" integrity sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-module-transforms" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-nullish-coalescing-operator@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz" integrity sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw== "@babel/plugin-transform-named-capturing-groups-regex@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz" integrity sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/helper-create-regexp-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-numeric-separator@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz" integrity sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw== "@babel/plugin-transform-new-target@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz" integrity sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-object-rest-spread@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz" integrity sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA== "@babel/plugin-transform-nullish-coalescing-operator@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz" integrity sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA== dependencies: "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-transform-parameters" "^7.24.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-object-super@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz" integrity sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ== "@babel/plugin-transform-numeric-separator@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz" integrity sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-replace-supers" "^7.24.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-optional-catch-binding@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz" integrity sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA== "@babel/plugin-transform-object-rest-spread@^7.28.0": version "7.28.0" resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz" integrity sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-destructuring" "^7.28.0" "@babel/plugin-transform-parameters" "^7.27.7" "@babel/traverse" "^7.28.0" "@babel/plugin-transform-optional-chaining@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz" integrity sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg== "@babel/plugin-transform-object-super@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz" integrity sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-replace-supers" "^7.27.1" "@babel/plugin-transform-parameters@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz" integrity sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg== "@babel/plugin-transform-optional-catch-binding@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz" integrity sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-private-methods@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz" integrity sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw== "@babel/plugin-transform-optional-chaining@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz" integrity sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg== dependencies: "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-transform-private-property-in-object@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz" integrity sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg== "@babel/plugin-transform-parameters@^7.27.7": version "7.27.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz" integrity sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-create-class-features-plugin" "^7.24.1" "@babel/helper-plugin-utils" "^7.24.0" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-property-literals@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz" integrity sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA== "@babel/plugin-transform-private-methods@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz" integrity sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-create-class-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-regenerator@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz" integrity sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw== "@babel/plugin-transform-private-property-in-object@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz" integrity sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" regenerator-transform "^0.15.2" "@babel/helper-annotate-as-pure" "^7.27.1" "@babel/helper-create-class-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-reserved-words@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz" integrity sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg== "@babel/plugin-transform-property-literals@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz" integrity sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-regenerator@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz" integrity sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-regexp-modifiers@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz" integrity sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-reserved-words@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz" integrity sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== dependencies: "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-runtime@^7.12.15": version "7.24.3" resolved "https://registry.npmmirror.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz" integrity sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ== version "7.28.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.28.3.tgz" integrity sha512-Y6ab1kGqZ0u42Zv/4a7l0l72n9DKP/MKoKWaUSBylrhNZO2prYuqFOLbn5aW5SIFXwSH93yfjbgllL8lxuGKLg== dependencies: "@babel/helper-module-imports" "^7.24.3" "@babel/helper-plugin-utils" "^7.24.0" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.1" babel-plugin-polyfill-regenerator "^0.6.1" "@babel/helper-module-imports" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" babel-plugin-polyfill-corejs2 "^0.4.14" babel-plugin-polyfill-corejs3 "^0.13.0" babel-plugin-polyfill-regenerator "^0.6.5" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz" integrity sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA== "@babel/plugin-transform-shorthand-properties@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz" integrity sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-spread@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz" integrity sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g== "@babel/plugin-transform-spread@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz" integrity sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-transform-sticky-regex@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz" integrity sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw== "@babel/plugin-transform-sticky-regex@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz" integrity sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-template-literals@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz" integrity sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g== "@babel/plugin-transform-template-literals@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz" integrity sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-typeof-symbol@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz" integrity sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA== "@babel/plugin-transform-typeof-symbol@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz" integrity sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-unicode-escapes@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz" integrity sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw== "@babel/plugin-transform-unicode-escapes@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz" integrity sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== dependencies: "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-unicode-property-regex@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz" integrity sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng== "@babel/plugin-transform-unicode-property-regex@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz" integrity sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-create-regexp-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-unicode-regex@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz" integrity sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g== "@babel/plugin-transform-unicode-regex@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz" integrity sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-create-regexp-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-unicode-sets-regex@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz" integrity sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA== "@babel/plugin-transform-unicode-sets-regex@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz" integrity sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw== dependencies: "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-create-regexp-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/preset-env@^7.12.16": version "7.24.4" resolved "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.24.4.tgz" integrity sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A== version "7.28.3" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz" integrity sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg== dependencies: "@babel/compat-data" "^7.24.4" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-plugin-utils" "^7.24.0" "@babel/helper-validator-option" "^7.23.5" "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.4" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.1" "@babel/compat-data" "^7.28.0" "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-validator-option" "^7.27.1" "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.27.1" "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.28.3" "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-import-assertions" "^7.24.1" "@babel/plugin-syntax-import-attributes" "^7.24.1" "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-import-assertions" "^7.27.1" "@babel/plugin-syntax-import-attributes" "^7.27.1" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.24.1" "@babel/plugin-transform-async-generator-functions" "^7.24.3" "@babel/plugin-transform-async-to-generator" "^7.24.1" "@babel/plugin-transform-block-scoped-functions" "^7.24.1" "@babel/plugin-transform-block-scoping" "^7.24.4" "@babel/plugin-transform-class-properties" "^7.24.1" "@babel/plugin-transform-class-static-block" "^7.24.4" "@babel/plugin-transform-classes" "^7.24.1" "@babel/plugin-transform-computed-properties" "^7.24.1" "@babel/plugin-transform-destructuring" "^7.24.1" "@babel/plugin-transform-dotall-regex" "^7.24.1" "@babel/plugin-transform-duplicate-keys" "^7.24.1" "@babel/plugin-transform-dynamic-import" "^7.24.1" "@babel/plugin-transform-exponentiation-operator" "^7.24.1" "@babel/plugin-transform-export-namespace-from" "^7.24.1" "@babel/plugin-transform-for-of" "^7.24.1" "@babel/plugin-transform-function-name" "^7.24.1" "@babel/plugin-transform-json-strings" "^7.24.1" "@babel/plugin-transform-literals" "^7.24.1" "@babel/plugin-transform-logical-assignment-operators" "^7.24.1" "@babel/plugin-transform-member-expression-literals" "^7.24.1" "@babel/plugin-transform-modules-amd" "^7.24.1" "@babel/plugin-transform-modules-commonjs" "^7.24.1" "@babel/plugin-transform-modules-systemjs" "^7.24.1" "@babel/plugin-transform-modules-umd" "^7.24.1" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" "@babel/plugin-transform-new-target" "^7.24.1" "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.1" "@babel/plugin-transform-numeric-separator" "^7.24.1" "@babel/plugin-transform-object-rest-spread" "^7.24.1" "@babel/plugin-transform-object-super" "^7.24.1" "@babel/plugin-transform-optional-catch-binding" "^7.24.1" "@babel/plugin-transform-optional-chaining" "^7.24.1" "@babel/plugin-transform-parameters" "^7.24.1" "@babel/plugin-transform-private-methods" "^7.24.1" "@babel/plugin-transform-private-property-in-object" "^7.24.1" "@babel/plugin-transform-property-literals" "^7.24.1" "@babel/plugin-transform-regenerator" "^7.24.1" "@babel/plugin-transform-reserved-words" "^7.24.1" "@babel/plugin-transform-shorthand-properties" "^7.24.1" "@babel/plugin-transform-spread" "^7.24.1" "@babel/plugin-transform-sticky-regex" "^7.24.1" "@babel/plugin-transform-template-literals" "^7.24.1" "@babel/plugin-transform-typeof-symbol" "^7.24.1" "@babel/plugin-transform-unicode-escapes" "^7.24.1" "@babel/plugin-transform-unicode-property-regex" "^7.24.1" "@babel/plugin-transform-unicode-regex" "^7.24.1" "@babel/plugin-transform-unicode-sets-regex" "^7.24.1" "@babel/plugin-transform-arrow-functions" "^7.27.1" "@babel/plugin-transform-async-generator-functions" "^7.28.0" "@babel/plugin-transform-async-to-generator" "^7.27.1" "@babel/plugin-transform-block-scoped-functions" "^7.27.1" "@babel/plugin-transform-block-scoping" "^7.28.0" "@babel/plugin-transform-class-properties" "^7.27.1" "@babel/plugin-transform-class-static-block" "^7.28.3" "@babel/plugin-transform-classes" "^7.28.3" "@babel/plugin-transform-computed-properties" "^7.27.1" "@babel/plugin-transform-destructuring" "^7.28.0" "@babel/plugin-transform-dotall-regex" "^7.27.1" "@babel/plugin-transform-duplicate-keys" "^7.27.1" "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" "@babel/plugin-transform-dynamic-import" "^7.27.1" "@babel/plugin-transform-explicit-resource-management" "^7.28.0" "@babel/plugin-transform-exponentiation-operator" "^7.27.1" "@babel/plugin-transform-export-namespace-from" "^7.27.1" "@babel/plugin-transform-for-of" "^7.27.1" "@babel/plugin-transform-function-name" "^7.27.1" "@babel/plugin-transform-json-strings" "^7.27.1" "@babel/plugin-transform-literals" "^7.27.1" "@babel/plugin-transform-logical-assignment-operators" "^7.27.1" "@babel/plugin-transform-member-expression-literals" "^7.27.1" "@babel/plugin-transform-modules-amd" "^7.27.1" "@babel/plugin-transform-modules-commonjs" "^7.27.1" "@babel/plugin-transform-modules-systemjs" "^7.27.1" "@babel/plugin-transform-modules-umd" "^7.27.1" "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" "@babel/plugin-transform-new-target" "^7.27.1" "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" "@babel/plugin-transform-numeric-separator" "^7.27.1" "@babel/plugin-transform-object-rest-spread" "^7.28.0" "@babel/plugin-transform-object-super" "^7.27.1" "@babel/plugin-transform-optional-catch-binding" "^7.27.1" "@babel/plugin-transform-optional-chaining" "^7.27.1" "@babel/plugin-transform-parameters" "^7.27.7" "@babel/plugin-transform-private-methods" "^7.27.1" "@babel/plugin-transform-private-property-in-object" "^7.27.1" "@babel/plugin-transform-property-literals" "^7.27.1" "@babel/plugin-transform-regenerator" "^7.28.3" "@babel/plugin-transform-regexp-modifiers" "^7.27.1" "@babel/plugin-transform-reserved-words" "^7.27.1" "@babel/plugin-transform-shorthand-properties" "^7.27.1" "@babel/plugin-transform-spread" "^7.27.1" "@babel/plugin-transform-sticky-regex" "^7.27.1" "@babel/plugin-transform-template-literals" "^7.27.1" "@babel/plugin-transform-typeof-symbol" "^7.27.1" "@babel/plugin-transform-unicode-escapes" "^7.27.1" "@babel/plugin-transform-unicode-property-regex" "^7.27.1" "@babel/plugin-transform-unicode-regex" "^7.27.1" "@babel/plugin-transform-unicode-sets-regex" "^7.27.1" "@babel/preset-modules" "0.1.6-no-external-plugins" babel-plugin-polyfill-corejs2 "^0.4.10" babel-plugin-polyfill-corejs3 "^0.10.4" babel-plugin-polyfill-regenerator "^0.6.1" core-js-compat "^3.31.0" babel-plugin-polyfill-corejs2 "^0.4.14" babel-plugin-polyfill-corejs3 "^0.13.0" babel-plugin-polyfill-regenerator "^0.6.5" core-js-compat "^3.43.0" semver "^6.3.1" "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" resolved "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/types" "^7.4.4" esutils "^2.0.2" "@babel/regjsgen@^0.8.0": version "0.8.0" resolved "https://registry.npmmirror.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.13", "@babel/runtime@^7.7.2": version "7.28.3" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz" integrity sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA== "@babel/runtime@^7.10.5", "@babel/runtime@^7.12.13", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4": version "7.24.4" resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.24.4.tgz" integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== "@babel/template@^7.24.0", "@babel/template@^7.27.1", "@babel/template@^7.27.2": version "7.27.2" resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== dependencies: regenerator-runtime "^0.14.0" "@babel/code-frame" "^7.27.1" "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" "@babel/template@^7.22.15", "@babel/template@^7.23.9", "@babel/template@^7.24.0": version "7.24.0" resolved "https://registry.npmmirror.com/@babel/template/-/template-7.24.0.tgz" integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== "@babel/traverse@^7.24.1", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz" integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ== dependencies: "@babel/code-frame" "^7.23.5" "@babel/parser" "^7.24.0" "@babel/types" "^7.24.0" "@babel/traverse@^7.23.9", "@babel/traverse@^7.24.1": version "7.24.1" resolved "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.24.1.tgz" integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== dependencies: "@babel/code-frame" "^7.24.1" "@babel/generator" "^7.24.1" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" "@babel/parser" "^7.24.1" "@babel/types" "^7.24.0" "@babel/code-frame" "^7.27.1" "@babel/generator" "^7.28.3" "@babel/helper-globals" "^7.28.0" "@babel/parser" "^7.28.3" "@babel/template" "^7.27.2" "@babel/types" "^7.28.2" debug "^4.3.1" globals "^11.1.0" "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.9", "@babel/types@^7.24.0", "@babel/types@^7.4.4": version "7.24.0" resolved "https://registry.npmmirror.com/@babel/types/-/types-7.24.0.tgz" integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== "@babel/types@^7.24.0", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.4.4": version "7.28.2" resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz" integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" "@cortex-js/compute-engine@0.24.1": version "0.24.1" @@ -1085,24 +941,18 @@ resolved "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@jridgewell/gen-mapping@^0.3.5": version "0.3.5" resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": version "0.3.13" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz" integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== dependencies: "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/sourcemap-codec" "^1.5.0" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.2.1": version "1.2.1" resolved "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.2.1.tgz" integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/source-map@^0.3.3": version "0.3.6" @@ -1112,15 +962,15 @@ "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": version "1.5.5" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz" integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": version "0.3.25" resolved "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.28": version "0.3.30" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz" integrity sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -1257,7 +1107,7 @@ dependencies: "@types/node" "*" "@types/eslint-scope@^3.7.3": "@types/eslint-scope@^3.7.7": version "3.7.7" resolved "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz" integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== @@ -1273,10 +1123,10 @@ "@types/estree" "*" "@types/json-schema" "*" "@types/estree@*", "@types/estree@^1.0.5": version "1.0.5" resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== "@types/estree@*", "@types/estree@^1.0.8": version "1.0.8" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz" integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== "@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": version "4.19.0" @@ -1315,7 +1165,7 @@ dependencies: "@types/node" "*" "@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": "@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -1414,45 +1264,43 @@ "@vue/babel-helper-vue-jsx-merge-props@^1.4.0": version "1.4.0" resolved "https://registry.npmmirror.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz" resolved "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.4.0.tgz" integrity sha512-JkqXfCkUDp4PIlFdDQ0TdXoIejMtTHP67/pvxlgeY+u5k3LEdKuWZ3LK6xkxo52uDoABIVyRwqVkfLQJhk7VBA== "@vue/babel-helper-vue-transform-on@1.2.2": version "1.2.2" resolved "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.2.tgz" integrity sha512-nOttamHUR3YzdEqdM/XXDyCSdxMA9VizUKoroLX6yTyRtggzQMHXcmwh8a7ZErcJttIBIc9s68a1B8GZ+Dmvsw== "@vue/babel-helper-vue-transform-on@1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz" integrity sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA== "@vue/babel-plugin-jsx@^1.0.3": version "1.2.2" resolved "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.2.tgz" integrity sha512-nYTkZUVTu4nhP199UoORePsql0l+wj7v/oyQjtThUVhJl1U+6qHuoVhIvR3bf7eVKjbCK+Cs2AWd7mi9Mpz9rA== version "1.5.0" resolved "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz" integrity sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw== dependencies: "@babel/helper-module-imports" "~7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-jsx" "^7.23.3" "@babel/template" "^7.23.9" "@babel/traverse" "^7.23.9" "@babel/types" "^7.23.9" "@vue/babel-helper-vue-transform-on" "1.2.2" "@vue/babel-plugin-resolve-type" "1.2.2" camelcase "^6.3.0" html-tags "^3.3.1" svg-tags "^1.0.0" "@babel/helper-module-imports" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-syntax-jsx" "^7.27.1" "@babel/template" "^7.27.2" "@babel/traverse" "^7.28.0" "@babel/types" "^7.28.2" "@vue/babel-helper-vue-transform-on" "1.5.0" "@vue/babel-plugin-resolve-type" "1.5.0" "@vue/shared" "^3.5.18" "@vue/babel-plugin-resolve-type@1.2.2": version "1.2.2" resolved "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.2.tgz" integrity sha512-EntyroPwNg5IPVdUJupqs0CFzuf6lUrVvCspmv2J1FITLeGnUCuoGNNk78dgCusxEiYj6RMkTJflGSxk5aIC4A== "@vue/babel-plugin-resolve-type@1.5.0": version "1.5.0" resolved "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz" integrity sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w== dependencies: "@babel/code-frame" "^7.23.5" "@babel/helper-module-imports" "~7.22.15" "@babel/helper-plugin-utils" "^7.22.5" "@babel/parser" "^7.23.9" "@vue/compiler-sfc" "^3.4.15" "@babel/code-frame" "^7.27.1" "@babel/helper-module-imports" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" "@babel/parser" "^7.28.0" "@vue/compiler-sfc" "^3.5.18" "@vue/babel-plugin-transform-vue-jsx@^1.4.0": version "1.4.0" resolved "https://registry.npmmirror.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz" resolved "https://registry.npmjs.org/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.4.0.tgz" integrity sha512-Fmastxw4MMx0vlgLS4XBX0XiBbUFzoMGeVXuMV08wyOfXdikAFqBTuYPR0tlk+XskL19EzHc39SgjrPGY23JnA== dependencies: "@babel/helper-module-imports" "^7.0.0" @@ -1462,10 +1310,10 @@ lodash.kebabcase "^4.1.1" svg-tags "^1.0.0" "@vue/babel-preset-app@^5.0.8": version "5.0.8" resolved "https://registry.npmmirror.com/@vue/babel-preset-app/-/babel-preset-app-5.0.8.tgz" integrity sha512-yl+5qhpjd8e1G4cMXfORkkBlvtPCIgmRf3IYCWYDKIQ7m+PPa5iTm4feiNmCMD6yGqQWMhhK/7M3oWGL9boKwg== "@vue/babel-preset-app@^5.0.9": version "5.0.9" resolved "https://registry.npmjs.org/@vue/babel-preset-app/-/babel-preset-app-5.0.9.tgz" integrity sha512-0rKOF4s/AhaRMJLybxOCgXfwtYhO3pwDSL/q/W8wRs1LzmHAc77FyTXWlun6VyKiSKwSdtH7CvOiWqq+DfofdA== dependencies: "@babel/core" "^7.12.16" "@babel/helper-compilation-targets" "^7.12.16" @@ -1486,7 +1334,7 @@ "@vue/babel-preset-jsx@^1.1.2": version "1.4.0" resolved "https://registry.npmmirror.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz" resolved "https://registry.npmjs.org/@vue/babel-preset-jsx/-/babel-preset-jsx-1.4.0.tgz" integrity sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA== dependencies: "@vue/babel-helper-vue-jsx-merge-props" "^1.4.0" @@ -1500,35 +1348,35 @@ "@vue/babel-sugar-composition-api-inject-h@^1.4.0": version "1.4.0" resolved "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz" resolved "https://registry.npmjs.org/@vue/babel-sugar-composition-api-inject-h/-/babel-sugar-composition-api-inject-h-1.4.0.tgz" integrity sha512-VQq6zEddJHctnG4w3TfmlVp5FzDavUSut/DwR0xVoe/mJKXyMcsIibL42wPntozITEoY90aBV0/1d2KjxHU52g== dependencies: "@babel/plugin-syntax-jsx" "^7.2.0" "@vue/babel-sugar-composition-api-render-instance@^1.4.0": version "1.4.0" resolved "https://registry.npmmirror.com/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz" resolved "https://registry.npmjs.org/@vue/babel-sugar-composition-api-render-instance/-/babel-sugar-composition-api-render-instance-1.4.0.tgz" integrity sha512-6ZDAzcxvy7VcnCjNdHJ59mwK02ZFuP5CnucloidqlZwVQv5CQLijc3lGpR7MD3TWFi78J7+a8J56YxbCtHgT9Q== dependencies: "@babel/plugin-syntax-jsx" "^7.2.0" "@vue/babel-sugar-functional-vue@^1.4.0": version "1.4.0" resolved "https://registry.npmmirror.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz" resolved "https://registry.npmjs.org/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.4.0.tgz" integrity sha512-lTEB4WUFNzYt2In6JsoF9sAYVTo84wC4e+PoZWSgM6FUtqRJz7wMylaEhSRgG71YF+wfLD6cc9nqVeXN2rwBvw== dependencies: "@babel/plugin-syntax-jsx" "^7.2.0" "@vue/babel-sugar-inject-h@^1.4.0": version "1.4.0" resolved "https://registry.npmmirror.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz" resolved "https://registry.npmjs.org/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.4.0.tgz" integrity sha512-muwWrPKli77uO2fFM7eA3G1lAGnERuSz2NgAxuOLzrsTlQl8W4G+wwbM4nB6iewlKbwKRae3nL03UaF5ffAPMA== dependencies: "@babel/plugin-syntax-jsx" "^7.2.0" "@vue/babel-sugar-v-model@^1.4.0": version "1.4.0" resolved "https://registry.npmmirror.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz" resolved "https://registry.npmjs.org/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.4.0.tgz" integrity sha512-0t4HGgXb7WHYLBciZzN5s0Hzqan4Ue+p/3FdQdcaHAb7s5D9WZFGoSxEZHrR1TFVZlAPu1bejTKGeAzaaG3NCQ== dependencies: "@babel/plugin-syntax-jsx" "^7.2.0" @@ -1540,66 +1388,66 @@ "@vue/babel-sugar-v-on@^1.4.0": version "1.4.0" resolved "https://registry.npmmirror.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz" resolved "https://registry.npmjs.org/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.4.0.tgz" integrity sha512-m+zud4wKLzSKgQrWwhqRObWzmTuyzl6vOP7024lrpeJM4x2UhQtRDLgYjXAw9xBXjCwS0pP9kXjg91F9ZNo9JA== dependencies: "@babel/plugin-syntax-jsx" "^7.2.0" "@vue/babel-plugin-transform-vue-jsx" "^1.4.0" camelcase "^5.0.0" "@vue/cli-overlay@^5.0.8": version "5.0.8" resolved "https://registry.npmmirror.com/@vue/cli-overlay/-/cli-overlay-5.0.8.tgz" integrity sha512-KmtievE/B4kcXp6SuM2gzsnSd8WebkQpg3XaB6GmFh1BJGRqa1UiW9up7L/Q67uOdTigHxr5Ar2lZms4RcDjwQ== "@vue/cli-overlay@^5.0.9": version "5.0.9" resolved "https://registry.npmjs.org/@vue/cli-overlay/-/cli-overlay-5.0.9.tgz" integrity sha512-aBdZWrYKxLuFz1FDsk/muFD7GycrsW73Gi11yRc7R2W7Bm8mDRc9HKAI790gdg4NV+chkDFmfkegjg5iMDEpAA== "@vue/cli-plugin-babel@~5.0.0": version "5.0.8" resolved "https://registry.npmmirror.com/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.8.tgz" integrity sha512-a4qqkml3FAJ3auqB2kN2EMPocb/iu0ykeELwed+9B1c1nQ1HKgslKMHMPavYx3Cd/QAx2mBD4hwKBqZXEI/CsQ== version "5.0.9" resolved "https://registry.npmjs.org/@vue/cli-plugin-babel/-/cli-plugin-babel-5.0.9.tgz" integrity sha512-oDZt1Kfe4KGNtig3/3zFo2pIeDJij2uS0M6S+tAqQno4Zpla2D8Hk/AR5PrstUd/HmhHZYJoGyF78MOfj3SbWg== dependencies: "@babel/core" "^7.12.16" "@vue/babel-preset-app" "^5.0.8" "@vue/cli-shared-utils" "^5.0.8" "@vue/babel-preset-app" "^5.0.9" "@vue/cli-shared-utils" "^5.0.9" babel-loader "^8.2.2" thread-loader "^3.0.0" webpack "^5.54.0" "@vue/cli-plugin-eslint@~5.0.0": version "5.0.8" resolved "https://registry.npmmirror.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.8.tgz" integrity sha512-d11+I5ONYaAPW1KyZj9GlrV/E6HZePq5L5eAF5GgoVdu6sxr6bDgEoxzhcS1Pk2eh8rn1MxG/FyyR+eCBj/CNg== version "5.0.9" resolved "https://registry.npmjs.org/@vue/cli-plugin-eslint/-/cli-plugin-eslint-5.0.9.tgz" integrity sha512-OfAa85qhP0dKSprI8+9qjbXW8BzOlOvEtXwdrTrAKlD6aN8oa/u6k4vbfJGdYbpsbpkj8FXYdCRkTgNG8KZbxg== dependencies: "@vue/cli-shared-utils" "^5.0.8" "@vue/cli-shared-utils" "^5.0.9" eslint-webpack-plugin "^3.1.0" globby "^11.0.2" webpack "^5.54.0" yorkie "^2.0.0" "@vue/cli-plugin-router@^5.0.8": version "5.0.8" resolved "https://registry.npmmirror.com/@vue/cli-plugin-router/-/cli-plugin-router-5.0.8.tgz" integrity sha512-Gmv4dsGdAsWPqVijz3Ux2OS2HkMrWi1ENj2cYL75nUeL+Xj5HEstSqdtfZ0b1q9NCce+BFB6QnHfTBXc/fCvMg== "@vue/cli-plugin-router@^5.0.9": version "5.0.9" resolved "https://registry.npmjs.org/@vue/cli-plugin-router/-/cli-plugin-router-5.0.9.tgz" integrity sha512-kopbO/8kIl5CAffwgptXEwV509i+M0FfwW4sSkgQ2RzpxOYBjQZvp+096mjZfFcWKSmryNP/ri/Mnu78vmhlhw== dependencies: "@vue/cli-shared-utils" "^5.0.8" "@vue/cli-shared-utils" "^5.0.9" "@vue/cli-plugin-vuex@^5.0.8": version "5.0.8" resolved "https://registry.npmmirror.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.8.tgz" integrity sha512-HSYWPqrunRE5ZZs8kVwiY6oWcn95qf/OQabwLfprhdpFWAGtLStShjsGED2aDpSSeGAskQETrtR/5h7VqgIlBA== "@vue/cli-plugin-vuex@^5.0.9": version "5.0.9" resolved "https://registry.npmjs.org/@vue/cli-plugin-vuex/-/cli-plugin-vuex-5.0.9.tgz" integrity sha512-AQhgGNFVd4Pu2crvS0a+hRckgrJv07gzOASdbLd3I72wkT43dd01MLRp8IBRRsu92t3MXenW86AZUCbQBz3//A== "@vue/cli-service@^3.0.0 || ^4.0.0 || ^5.0.0-0", "@vue/cli-service@~5.0.0": version "5.0.8" resolved "https://registry.npmmirror.com/@vue/cli-service/-/cli-service-5.0.8.tgz" integrity sha512-nV7tYQLe7YsTtzFrfOMIHc5N2hp5lHG2rpYr0aNja9rNljdgcPZLyQRb2YRivTHqTv7lI962UXFURcpStHgyFw== "@vue/cli-service@^3.0.0 || ^4.0.0 || ^5.0.0-0", "@vue/cli-service@^5.0.9": version "5.0.9" resolved "https://registry.npmjs.org/@vue/cli-service/-/cli-service-5.0.9.tgz" integrity sha512-yTX7GVyM19tEbd+y5/gA6MkVKA6K61nVYHYAivD61Hx6odVFmQsaC3/R3cWAHM1P5oVKCevBbumPljbT+tFG2w== dependencies: "@babel/helper-compilation-targets" "^7.12.16" "@soda/friendly-errors-webpack-plugin" "^1.8.0" "@soda/get-current-script" "^1.0.2" "@types/minimist" "^1.2.0" "@vue/cli-overlay" "^5.0.8" "@vue/cli-plugin-router" "^5.0.8" "@vue/cli-plugin-vuex" "^5.0.8" "@vue/cli-shared-utils" "^5.0.8" "@vue/cli-overlay" "^5.0.9" "@vue/cli-plugin-router" "^5.0.9" "@vue/cli-plugin-vuex" "^5.0.9" "@vue/cli-shared-utils" "^5.0.9" "@vue/component-compiler-utils" "^3.3.0" "@vue/vue-loader-v15" "npm:vue-loader@^15.9.7" "@vue/web-component-wrapper" "^1.3.0" @@ -1648,10 +1496,10 @@ webpack-virtual-modules "^0.4.2" whatwg-fetch "^3.6.2" "@vue/cli-shared-utils@^5.0.8": version "5.0.8" resolved "https://registry.npmmirror.com/@vue/cli-shared-utils/-/cli-shared-utils-5.0.8.tgz" integrity sha512-uK2YB7bBVuQhjOJF+O52P9yFMXeJVj7ozqJkwYE9PlMHL1LMHjtCYm4cSdOebuPzyP+/9p0BimM/OqxsevIopQ== "@vue/cli-shared-utils@^5.0.9": version "5.0.9" resolved "https://registry.npmjs.org/@vue/cli-shared-utils/-/cli-shared-utils-5.0.9.tgz" integrity sha512-lf4KykiG8j9KwvNVi7fKtASmHuLsxCcCsflVU2b2CHMRuR4weOIV3zuuCrjWKjk0APn/MHJhgCjJGzHMbTtd5w== dependencies: "@achrinza/node-ipc" "^9.2.5" chalk "^4.1.2" @@ -1666,39 +1514,39 @@ semver "^7.3.4" strip-ansi "^6.0.0" "@vue/compiler-core@3.4.23": version "3.4.23" resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.23.tgz" integrity sha512-HAFmuVEwNqNdmk+w4VCQ2pkLk1Vw4XYiiyxEp3z/xvl14aLTUBw2OfVH3vBcx+FtGsynQLkkhK410Nah1N2yyQ== "@vue/compiler-core@3.5.20": version "3.5.20" resolved "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.20.tgz" integrity sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg== dependencies: "@babel/parser" "^7.24.1" "@vue/shared" "3.4.23" "@babel/parser" "^7.28.3" "@vue/shared" "3.5.20" entities "^4.5.0" estree-walker "^2.0.2" source-map-js "^1.2.0" source-map-js "^1.2.1" "@vue/compiler-dom@3.4.23": version "3.4.23" resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.23.tgz" integrity sha512-t0b9WSTnCRrzsBGrDd1LNR5HGzYTr7LX3z6nNBG+KGvZLqrT0mY6NsMzOqlVMBKKXKVuusbbB5aOOFgTY+senw== "@vue/compiler-dom@3.5.20": version "3.5.20" resolved "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.20.tgz" integrity sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ== dependencies: "@vue/compiler-core" "3.4.23" "@vue/shared" "3.4.23" "@vue/compiler-core" "3.5.20" "@vue/shared" "3.5.20" "@vue/compiler-sfc@^3.4.15": version "3.4.23" resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.23.tgz" integrity sha512-fSDTKTfzaRX1kNAUiaj8JB4AokikzStWgHooMhaxyjZerw624L+IAP/fvI4ZwMpwIh8f08PVzEnu4rg8/Npssw== "@vue/compiler-sfc@^3.5.18": version "3.5.20" resolved "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.20.tgz" integrity sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw== dependencies: "@babel/parser" "^7.24.1" "@vue/compiler-core" "3.4.23" "@vue/compiler-dom" "3.4.23" "@vue/compiler-ssr" "3.4.23" "@vue/shared" "3.4.23" "@babel/parser" "^7.28.3" "@vue/compiler-core" "3.5.20" "@vue/compiler-dom" "3.5.20" "@vue/compiler-ssr" "3.5.20" "@vue/shared" "3.5.20" estree-walker "^2.0.2" magic-string "^0.30.8" postcss "^8.4.38" source-map-js "^1.2.0" magic-string "^0.30.17" postcss "^8.5.6" source-map-js "^1.2.1" "@vue/compiler-sfc@2.7.16": version "2.7.16" @@ -1711,13 +1559,13 @@ optionalDependencies: prettier "^1.18.2 || ^2.0.0" "@vue/compiler-ssr@3.4.23": version "3.4.23" resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.23.tgz" integrity sha512-hb6Uj2cYs+tfqz71Wj6h3E5t6OKvb4MVcM2Nl5i/z1nv1gjEhw+zYaNOV+Xwn+SSN/VZM0DgANw5TuJfxfezPg== "@vue/compiler-ssr@3.5.20": version "3.5.20" resolved "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.20.tgz" integrity sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA== dependencies: "@vue/compiler-dom" "3.4.23" "@vue/shared" "3.4.23" "@vue/compiler-dom" "3.5.20" "@vue/shared" "3.5.20" "@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.3.0": version "3.3.0" @@ -1735,10 +1583,10 @@ optionalDependencies: prettier "^1.18.2 || ^2.0.0" "@vue/shared@3.4.23": version "3.4.23" resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.23.tgz" integrity sha512-wBQ0gvf+SMwsCQOyusNw/GoXPV47WGd1xB5A1Pgzy0sQ3Bi5r5xm3n+92y3gCnB3MWqnRDdvfkRGxhKtbBRNgg== "@vue/shared@^3.5.18", "@vue/shared@3.5.20": version "3.5.20" resolved "https://registry.npmjs.org/@vue/shared/-/shared-3.5.20.tgz" integrity sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA== "@vue/vue-loader-v15@npm:vue-loader@^15.9.7": version "15.11.1" @@ -1756,135 +1604,135 @@ resolved "https://registry.npmmirror.com/@vue/web-component-wrapper/-/web-component-wrapper-1.3.0.tgz" integrity sha512-Iu8Tbg3f+emIIMmI2ycSI8QcEuAUgPTgHwesDU1eKMLE4YC/c/sFbGc70QgMq31ijRftV0R7vCm9co6rldCeOA== "@webassemblyjs/ast@^1.12.1", "@webassemblyjs/ast@1.12.1": version "1.12.1" resolved "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.12.1.tgz" integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== "@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== dependencies: "@webassemblyjs/helper-numbers" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/helper-numbers" "1.13.2" "@webassemblyjs/helper-wasm-bytecode" "1.13.2" "@webassemblyjs/floating-point-hex-parser@1.11.6": version "1.11.6" resolved "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== "@webassemblyjs/floating-point-hex-parser@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz" integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== "@webassemblyjs/helper-api-error@1.11.6": version "1.11.6" resolved "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== "@webassemblyjs/helper-api-error@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz" integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== "@webassemblyjs/helper-buffer@1.12.1": version "1.12.1" resolved "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz" integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== "@webassemblyjs/helper-buffer@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz" integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== "@webassemblyjs/helper-numbers@1.11.6": version "1.11.6" resolved "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== "@webassemblyjs/helper-numbers@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz" integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== dependencies: "@webassemblyjs/floating-point-hex-parser" "1.11.6" "@webassemblyjs/helper-api-error" "1.11.6" "@webassemblyjs/floating-point-hex-parser" "1.13.2" "@webassemblyjs/helper-api-error" "1.13.2" "@xtuc/long" "4.2.2" "@webassemblyjs/helper-wasm-bytecode@1.11.6": version "1.11.6" resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== "@webassemblyjs/helper-wasm-bytecode@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz" integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== "@webassemblyjs/helper-wasm-section@1.12.1": version "1.12.1" resolved "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz" integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== "@webassemblyjs/helper-wasm-section@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz" integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== dependencies: "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/ast" "1.14.1" "@webassemblyjs/helper-buffer" "1.14.1" "@webassemblyjs/helper-wasm-bytecode" "1.13.2" "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/ieee754@1.11.6": version "1.11.6" resolved "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== "@webassemblyjs/ieee754@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz" integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== dependencies: "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/leb128@1.11.6": version "1.11.6" resolved "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== "@webassemblyjs/leb128@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz" integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== dependencies: "@xtuc/long" "4.2.2" "@webassemblyjs/utf8@1.11.6": version "1.11.6" resolved "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== "@webassemblyjs/utf8@1.13.2": version "1.13.2" resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz" integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== "@webassemblyjs/wasm-edit@^1.12.1": version "1.12.1" resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz" integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== "@webassemblyjs/wasm-edit@^1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz" integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== dependencies: "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/helper-wasm-section" "1.12.1" "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/wasm-opt" "1.12.1" "@webassemblyjs/wasm-parser" "1.12.1" "@webassemblyjs/wast-printer" "1.12.1" "@webassemblyjs/ast" "1.14.1" "@webassemblyjs/helper-buffer" "1.14.1" "@webassemblyjs/helper-wasm-bytecode" "1.13.2" "@webassemblyjs/helper-wasm-section" "1.14.1" "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-opt" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" "@webassemblyjs/wast-printer" "1.14.1" "@webassemblyjs/wasm-gen@1.12.1": version "1.12.1" resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz" integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== "@webassemblyjs/wasm-gen@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz" integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== dependencies: "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" "@webassemblyjs/ast" "1.14.1" "@webassemblyjs/helper-wasm-bytecode" "1.13.2" "@webassemblyjs/ieee754" "1.13.2" "@webassemblyjs/leb128" "1.13.2" "@webassemblyjs/utf8" "1.13.2" "@webassemblyjs/wasm-opt@1.12.1": version "1.12.1" resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz" integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== "@webassemblyjs/wasm-opt@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz" integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== dependencies: "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-buffer" "1.12.1" "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/wasm-parser" "1.12.1" "@webassemblyjs/ast" "1.14.1" "@webassemblyjs/helper-buffer" "1.14.1" "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" "@webassemblyjs/wasm-parser@^1.12.1", "@webassemblyjs/wasm-parser@1.12.1": version "1.12.1" resolved "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz" integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== "@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== dependencies: "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/helper-api-error" "1.11.6" "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ieee754" "1.11.6" "@webassemblyjs/leb128" "1.11.6" "@webassemblyjs/utf8" "1.11.6" "@webassemblyjs/ast" "1.14.1" "@webassemblyjs/helper-api-error" "1.13.2" "@webassemblyjs/helper-wasm-bytecode" "1.13.2" "@webassemblyjs/ieee754" "1.13.2" "@webassemblyjs/leb128" "1.13.2" "@webassemblyjs/utf8" "1.13.2" "@webassemblyjs/wast-printer@1.12.1": version "1.12.1" resolved "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz" integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== "@webassemblyjs/wast-printer@1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz" integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== dependencies: "@webassemblyjs/ast" "1.12.1" "@webassemblyjs/ast" "1.14.1" "@xtuc/long" "4.2.2" "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz" resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.2": version "4.2.2" resolved "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz" resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== abab@^2.0.5, abab@^2.0.6: @@ -1897,7 +1745,7 @@ resolved "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: accepts@~1.3.4, accepts@~1.3.8: version "1.3.8" resolved "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz" integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== @@ -1913,10 +1761,10 @@ acorn "^7.1.1" acorn-walk "^7.1.1" acorn-import-attributes@^1.9.5: version "1.9.5" resolved "https://registry.npmmirror.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz" integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ== acorn-import-phases@^1.0.3: version "1.0.4" resolved "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz" integrity sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" @@ -1933,10 +1781,10 @@ resolved "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-8.3.2.tgz" integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== "acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.0.4, acorn@^8.0.5, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: version "8.11.3" resolved "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz" integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== "acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.0.4, acorn@^8.0.5, acorn@^8.14.0, acorn@^8.15.0, acorn@^8.5.0, acorn@^8.9.0: version "8.15.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== acorn@^7.1.1: version "7.4.1" @@ -2228,12 +2076,12 @@ possible-typed-array-names "^1.0.0" axios@^1.6.8: version "1.6.8" resolved "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz" integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== version "1.11.0" resolved "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz" integrity sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" form-data "^4.0.4" proxy-from-env "^1.1.0" babel-helper-vue-jsx-merge-props@^2.0.0: @@ -2253,34 +2101,34 @@ babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" resolved "https://registry.npmmirror.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" babel-plugin-polyfill-corejs2@^0.4.10: version "0.4.10" resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz" integrity sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ== babel-plugin-polyfill-corejs2@^0.4.14: version "0.4.14" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz" integrity sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg== dependencies: "@babel/compat-data" "^7.22.6" "@babel/helper-define-polyfill-provider" "^0.6.1" "@babel/compat-data" "^7.27.7" "@babel/helper-define-polyfill-provider" "^0.6.5" semver "^6.3.1" babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4: version "0.10.4" resolved "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz" integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg== babel-plugin-polyfill-corejs3@^0.13.0: version "0.13.0" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz" integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== dependencies: "@babel/helper-define-polyfill-provider" "^0.6.1" core-js-compat "^3.36.1" "@babel/helper-define-polyfill-provider" "^0.6.5" core-js-compat "^3.43.0" babel-plugin-polyfill-regenerator@^0.6.1: version "0.6.1" resolved "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz" integrity sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g== babel-plugin-polyfill-regenerator@^0.6.5: version "0.6.5" resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz" integrity sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg== dependencies: "@babel/helper-define-polyfill-provider" "^0.6.1" "@babel/helper-define-polyfill-provider" "^0.6.5" babel-runtime@6.x: version "6.26.0" @@ -2342,10 +2190,10 @@ resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== body-parser@1.20.2: version "1.20.2" resolved "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.2.tgz" integrity sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA== body-parser@1.20.3: version "1.20.3" resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz" integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: bytes "3.1.2" content-type "~1.0.5" @@ -2355,7 +2203,7 @@ http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" qs "6.11.0" qs "6.13.0" raw-body "2.5.2" type-is "~1.6.18" unpipe "1.0.0" @@ -2374,9 +2222,9 @@ integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== version "1.1.12" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" integrity sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -2397,27 +2245,27 @@ split-string "^3.0.2" to-regex "^3.0.1" braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== braces@^3.0.3, braces@~3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== dependencies: fill-range "^7.0.1" fill-range "^7.1.1" browser-process-hrtime@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browserslist@^4.0.0, browserslist@^4.16.3, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.22.2, browserslist@^4.23.0, "browserslist@>= 4.21.0": version "4.23.0" resolved "https://registry.npmmirror.com/browserslist/-/browserslist-4.23.0.tgz" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== browserslist@^4.0.0, browserslist@^4.16.3, browserslist@^4.21.4, browserslist@^4.23.0, browserslist@^4.24.0, browserslist@^4.25.3, "browserslist@>= 4.21.0": version "4.25.4" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.4.tgz" integrity sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg== dependencies: caniuse-lite "^1.0.30001587" electron-to-chromium "^1.4.668" node-releases "^2.0.14" update-browserslist-db "^1.0.13" caniuse-lite "^1.0.30001737" electron-to-chromium "^1.5.211" node-releases "^2.0.19" update-browserslist-db "^1.1.3" buffer-from@^1.0.0: version "1.1.2" @@ -2432,14 +2280,9 @@ base64-js "^1.3.1" ieee754 "^1.1.13" bytes@3.0.0: version "3.0.0" resolved "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== bytes@3.1.2: version "3.1.2" resolved "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz" resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cache-base@^1.0.1: @@ -2498,13 +2341,8 @@ camelcase@^5.0.0: version "5.3.1" resolved "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz" resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.3.0: version "6.3.0" resolved "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-api@^3.0.0: version "3.0.0" @@ -2516,10 +2354,10 @@ lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001599: version "1.0.30001610" resolved "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001610.tgz" integrity sha512-QFutAY4NgaelojVMjY63o6XlZyORPaLfyMnsl3HgnWdJUcX6K0oaJymHjH8PT5Gk7sTm8rvC/c5COUQKXqmOMA== caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001599, caniuse-lite@^1.0.30001737: version "1.0.30001739" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz" integrity sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA== canvas@^2.5.0, canvas@^2.8.0: version "2.11.2" @@ -2786,7 +2624,7 @@ resolved "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.1.tgz" integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== compressible@~2.0.16: compressible@~2.0.18: version "2.0.18" resolved "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz" integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== @@ -2794,16 +2632,16 @@ mime-db ">= 1.43.0 < 2" compression@^1.7.4: version "1.7.4" resolved "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz" integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== version "1.8.1" resolved "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz" integrity sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w== dependencies: accepts "~1.3.5" bytes "3.0.0" compressible "~2.0.16" bytes "3.1.2" compressible "~2.0.18" debug "2.6.9" on-headers "~1.0.2" safe-buffer "5.1.2" negotiator "~0.6.4" on-headers "~1.1.0" safe-buffer "5.2.1" vary "~1.1.2" concat-map@0.0.1: @@ -2837,7 +2675,7 @@ content-type@~1.0.4, content-type@~1.0.5: version "1.0.5" resolved "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz" resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== convert-source-map@^2.0.0: @@ -2850,10 +2688,10 @@ resolved "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz" integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== cookie@0.6.0: version "0.6.0" resolved "https://registry.npmmirror.com/cookie/-/cookie-0.6.0.tgz" integrity sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw== cookie@0.7.1: version "0.7.1" resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz" integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== copy-anything@^2.0.1: version "2.0.6" @@ -2879,12 +2717,12 @@ schema-utils "^3.1.1" serialize-javascript "^6.0.0" core-js-compat@^3.31.0, core-js-compat@^3.36.1, core-js-compat@^3.8.3: version "3.37.0" resolved "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.37.0.tgz" integrity sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA== core-js-compat@^3.43.0, core-js-compat@^3.8.3: version "3.45.1" resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz" integrity sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA== dependencies: browserslist "^4.23.0" browserslist "^4.25.3" core-js@^2.4.0: version "2.6.12" @@ -2922,9 +2760,9 @@ which "^1.2.9" cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-6.0.5.tgz" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== version "6.0.6" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz" integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw== dependencies: nice-try "^1.0.4" path-key "^2.0.1" @@ -2933,9 +2771,9 @@ which "^1.2.9" cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== version "7.0.6" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -3146,12 +2984,12 @@ dependencies: ms "^2.1.1" debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@4: version "4.3.4" resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.4.1, debug@4: version "4.4.1" resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz" integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== dependencies: ms "2.1.2" ms "^2.1.3" debug@2.6.9: version "2.6.9" @@ -3268,12 +3106,12 @@ depd@2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== destroy@1.2.0: version "1.2.0" resolved "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== detect-libc@^2.0.0: @@ -3435,13 +3273,13 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz" resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.668: version "1.4.739" resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.739.tgz" integrity sha512-koRkawXOuN9w/ymhTNxGfB8ta4MRKVW0nzifU17G1UwTWlBg0vv7xnz4nxDnRFSBe9nXMGRgICcAzqXc0PmLeA== electron-to-chromium@^1.5.211: version "1.5.211" resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.211.tgz" integrity sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw== element-ui@^2.15.14: version "2.15.14" @@ -3467,8 +3305,13 @@ encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz" resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== encodeurl@~2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== end-of-stream@^1.1.0: version "1.4.4" @@ -3477,10 +3320,10 @@ dependencies: once "^1.4.0" enhanced-resolve@^5.17.0: version "5.17.0" resolved "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz" integrity sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== enhanced-resolve@^5.17.3: version "5.18.3" resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz" integrity sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -3505,7 +3348,7 @@ entities@^4.5.0: version "4.5.0" resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== errno@^0.1.1: @@ -3630,10 +3473,10 @@ is-date-object "^1.0.5" is-symbol "^1.0.4" escalade@^3.1.1: version "3.1.2" resolved "https://registry.npmmirror.com/escalade/-/escalade-3.1.2.tgz" integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== escape-html@~1.0.3: version "1.0.3" @@ -3834,7 +3677,7 @@ estree-walker@^2.0.2: version "2.0.2" resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz" resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== esutils@^2.0.2: @@ -3844,7 +3687,7 @@ etag@~1.8.1: version "1.8.1" resolved "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz" resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== event-pubsub@4.3.0: @@ -3917,36 +3760,36 @@ to-regex "^3.0.1" express@^4.17.3: version "4.19.2" resolved "https://registry.npmmirror.com/express/-/express-4.19.2.tgz" integrity sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q== version "4.21.2" resolved "https://registry.npmjs.org/express/-/express-4.21.2.tgz" integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" body-parser "1.20.2" body-parser "1.20.3" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.6.0" cookie "0.7.1" cookie-signature "1.0.6" debug "2.6.9" depd "2.0.0" encodeurl "~1.0.2" encodeurl "~2.0.0" escape-html "~1.0.3" etag "~1.8.1" finalhandler "1.2.0" finalhandler "1.3.1" fresh "0.5.2" http-errors "2.0.0" merge-descriptors "1.0.1" merge-descriptors "1.0.3" methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" path-to-regexp "0.1.12" proxy-addr "~2.0.7" qs "6.11.0" qs "6.13.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.18.0" serve-static "1.15.0" send "0.19.0" serve-static "1.16.2" setprototypeof "1.2.0" statuses "2.0.1" type-is "~1.6.18" @@ -4024,6 +3867,11 @@ resolved "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fast-uri@^3.0.1: version "3.1.0" resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz" integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA== fastq@^1.6.0: version "1.17.1" resolved "https://registry.npmmirror.com/fastq/-/fastq-1.17.1.tgz" @@ -4062,20 +3910,20 @@ repeat-string "^1.6.1" to-regex-range "^2.1.0" fill-range@^7.0.1: version "7.0.1" resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== fill-range@^7.1.1: version "7.1.1" resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== dependencies: to-regex-range "^5.0.1" finalhandler@1.2.0: version "1.2.0" resolved "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.2.0.tgz" integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== finalhandler@1.3.1: version "1.3.1" resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz" integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" encodeurl "~1.0.2" encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" parseurl "~1.3.3" @@ -4135,13 +3983,15 @@ resolved "https://registry.npmmirror.com/for-in/-/for-in-1.0.2.tgz" integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== form-data@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== form-data@^4.0.0, form-data@^4.0.4: version "4.0.4" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz" integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== dependencies: asynckit "^0.4.0" combined-stream "^1.0.8" es-set-tostringtag "^2.1.0" hasown "^2.0.2" mime-types "^2.1.12" forwarded@0.2.0: @@ -4163,7 +4013,7 @@ fresh@0.5.2: version "0.5.2" resolved "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz" resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== fs-extra@^9.1.0: @@ -4337,11 +4187,6 @@ minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" globals@^11.1.0: version "11.12.0" resolved "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0: version "13.24.0" @@ -4562,13 +4407,8 @@ html-tags@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/html-tags/-/html-tags-2.0.0.tgz" resolved "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz" integrity sha512-+Il6N8cCo2wB/Vd3gqy/8TZhTD3QvcVeQLCnZiGkGCH3JP28IgGAY41giccp2W4R3jfyJPAP318FQTa1yU7K7g== html-tags@^3.3.1: version "3.3.1" resolved "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz" integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== html-webpack-plugin@^5.1.0: version "5.6.0" @@ -4620,7 +4460,7 @@ http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: depd "2.0.0" @@ -4644,9 +4484,9 @@ debug "4" http-proxy-middleware@^2.0.3: version "2.0.6" resolved "https://registry.npmmirror.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== version "2.0.9" resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz" integrity sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q== dependencies: "@types/http-proxy" "^1.17.8" http-proxy "^1.18.1" @@ -4685,7 +4525,7 @@ iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" @@ -4850,12 +4690,12 @@ dependencies: ci-info "^1.5.0" is-core-module@^2.13.0: version "2.13.1" resolved "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.1.tgz" integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== is-core-module@^2.16.0: version "2.16.1" resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz" integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== dependencies: hasown "^2.0.0" hasown "^2.0.2" is-data-descriptor@^1.0.1: version "1.0.1" @@ -4992,7 +4832,7 @@ is-number@^7.0.0: version "7.0.0" resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz" resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-plain-obj@^1.1: @@ -5239,15 +5079,15 @@ ws "^8.2.3" xml-name-validator "^4.0.0" jsesc@^2.5.1: version "2.5.2" resolved "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== jsesc@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== jsesc@~0.5.0: version "0.5.0" resolved "https://registry.npmmirror.com/jsesc/-/jsesc-0.5.0.tgz" integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== jsesc@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== json-buffer@3.0.1: version "3.0.1" @@ -5437,7 +5277,7 @@ lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz" resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== lodash.defaultsdeep@^4.6.1: @@ -5447,7 +5287,7 @@ lodash.kebabcase@^4.1.1: version "4.1.1" resolved "https://registry.npmmirror.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz" resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz" integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== lodash.mapvalues@^4.6.0: @@ -5534,12 +5374,12 @@ dependencies: yallist "^4.0.0" magic-string@^0.30.8: version "0.30.10" resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.10.tgz" integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ== magic-string@^0.30.17: version "0.30.18" resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.18.tgz" integrity sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" "@jridgewell/sourcemap-codec" "^1.5.5" make-dir@^2.1.0: version "2.1.0" @@ -5574,9 +5414,9 @@ integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== mathlive@^0.101.0: version "0.101.0" resolved "https://registry.npmmirror.com/mathlive/-/mathlive-0.101.0.tgz" integrity sha512-/4pXiqttFhThEQ2oxEZjTFyMuVLc0cEe3GjczncaH/bP9ZYhkmlFIWNzyU9zYXzS8YugczAL7trENdCXukXBgA== version "0.101.2" resolved "https://registry.npmjs.org/mathlive/-/mathlive-0.101.2.tgz" integrity sha512-PJiJogNcaVgyk34YgJ+jQ460lkBWIQ7u1WSQb/NchZ98NBPxQRwjM6xt7mYVK5n+9O5L/mq3cNXtfcG6hP4VNg== dependencies: "@cortex-js/compute-engine" "0.24.1" @@ -5587,7 +5427,7 @@ media-typer@0.3.0: version "0.3.0" resolved "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz" resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== memfs@^3.4.3: @@ -5597,10 +5437,10 @@ dependencies: fs-monkey "^1.0.4" merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== merge-descriptors@1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz" integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ== merge-options@1.0.1: version "1.0.1" @@ -5632,11 +5472,11 @@ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== version "4.0.8" resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== dependencies: braces "^3.0.2" braces "^3.0.3" picomatch "^2.3.1" micromatch@3.1.0: @@ -5775,20 +5615,15 @@ resolved "https://registry.npmmirror.com/mrmime/-/mrmime-2.0.0.tgz" integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== ms@^2.1.1, ms@2.1.2: version "2.1.2" resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== ms@^2.1.1, ms@^2.1.3, ms@2.1.3: version "2.1.3" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== ms@2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.3: version "2.1.3" resolved "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== multicast-dns@^7.2.5: version "7.2.5" @@ -5812,10 +5647,10 @@ resolved "https://registry.npmmirror.com/nan/-/nan-2.20.0.tgz" integrity sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw== nanoid@^3.3.7: version "3.3.7" resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz" integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== nanoid@^3.3.11: version "3.3.11" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz" integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== nanomatch@^1.2.1: version "1.2.13" @@ -5846,6 +5681,11 @@ dependencies: iconv-lite "^0.6.3" sax "^1.2.4" negotiator@~0.6.4: version "0.6.4" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== negotiator@0.6.3: version "0.6.3" @@ -5882,10 +5722,10 @@ resolved "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== node-releases@^2.0.14: version "2.0.14" resolved "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz" integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== node-releases@^2.0.19: version "2.0.19" resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== nopt@^5.0.0: version "5.0.0" @@ -6022,15 +5862,15 @@ on-finished@2.4.1: version "2.4.1" resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz" resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== dependencies: ee-first "1.1.1" on-headers@~1.0.2: version "1.0.2" resolved "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== on-headers@~1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz" integrity sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" @@ -6235,10 +6075,10 @@ resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== path-to-regexp@0.1.12: version "0.1.12" resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz" integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path-type@^4.0.0: version "4.0.0" @@ -6250,10 +6090,10 @@ resolved "https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz" integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== picocolors@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picocolors@^1.0.0, picocolors@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" @@ -6553,14 +6393,14 @@ source-map "^0.5.6" supports-color "^3.2.3" "postcss@^7.0.0 || ^8.0.1", postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.2.6, postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.33, postcss@^8.4.38, "postcss@>4 <9": version "8.4.38" resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.38.tgz" integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A== "postcss@^7.0.0 || ^8.0.1", postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.2.6, postcss@^8.3.5, postcss@^8.4.14, postcss@^8.4.33, postcss@^8.5.6, "postcss@>4 <9": version "8.5.6" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" source-map-js "^1.2.0" nanoid "^3.3.11" picocolors "^1.1.1" source-map-js "^1.2.1" postcss@^7.0.36: version "7.0.39" @@ -6696,12 +6536,12 @@ lodash "^4.17.11" single-spa "^5.9.2" qs@6.11.0: version "6.11.0" resolved "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== qs@6.13.0: version "6.13.0" resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== dependencies: side-channel "^1.0.4" side-channel "^1.0.6" query-string@^4.3.2: version "4.3.4" @@ -6735,7 +6575,7 @@ raw-body@2.5.2: version "2.5.2" resolved "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz" resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz" integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" @@ -6805,34 +6645,22 @@ get-proto "^1.0.1" which-builtin-type "^1.2.1" regenerate-unicode-properties@^10.1.0: version "10.1.1" resolved "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz" integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== regenerate-unicode-properties@^10.2.0: version "10.2.0" resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz" integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== dependencies: regenerate "^1.4.2" regenerate@^1.4.2: version "1.4.2" resolved "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz" resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regenerator-runtime@^0.14.0: version "0.14.1" resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== regenerator-transform@^0.15.2: version "0.15.2" resolved "https://registry.npmmirror.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz" integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" @@ -6859,24 +6687,29 @@ resolved "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== regexpu-core@^5.3.1: version "5.3.2" resolved "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-5.3.2.tgz" integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== regexpu-core@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz" integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== dependencies: "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" regjsparser "^0.9.1" regenerate-unicode-properties "^10.2.0" regjsgen "^0.8.0" regjsparser "^0.12.0" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.9.1.tgz" integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== regjsgen@^0.8.0: version "0.8.0" resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== regjsparser@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz" integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== dependencies: jsesc "~0.5.0" jsesc "~3.0.2" relateurl@^0.2.7: version "0.2.7" @@ -6934,12 +6767,12 @@ resolved "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz" integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== resolve@^1.10.0, resolve@^1.14.2: version "1.22.8" resolved "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz" integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== resolve@^1.10.0, resolve@^1.22.10: version "1.22.10" resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz" integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: is-core-module "^2.13.0" is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -7005,11 +6838,6 @@ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-buffer@5.1.2: version "5.1.2" resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -7082,19 +6910,30 @@ ajv "^6.12.5" ajv-keywords "^3.5.2" schema-utils@^3.2.0: version "3.3.0" resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz" integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" schema-utils@^4.0.0: version "4.2.0" resolved "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.2.0.tgz" integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" ajv-formats "^2.1.1" ajv-keywords "^5.1.0" schema-utils@^4.3.0: version "4.3.2" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz" integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" ajv-formats "^2.1.1" ajv-keywords "^5.1.0" schema-utils@^4.3.2: version "4.3.2" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz" integrity sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== dependencies: "@types/json-schema" "^7.0.9" ajv "^8.9.0" @@ -7137,11 +6976,9 @@ lru-cache "^6.0.0" semver@^7.3.4: version "7.6.0" resolved "https://registry.npmmirror.com/semver/-/semver-7.6.0.tgz" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== dependencies: lru-cache "^6.0.0" version "7.7.2" resolved "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz" integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== semver@^7.3.5: version "7.6.3" @@ -7160,10 +6997,10 @@ resolved "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== send@0.18.0: version "0.18.0" resolved "https://registry.npmmirror.com/send/-/send-0.18.0.tgz" integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== send@0.19.0: version "0.19.0" resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: debug "2.6.9" depd "2.0.0" @@ -7179,7 +7016,7 @@ range-parser "~1.2.1" statuses "2.0.1" serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: serialize-javascript@^6.0.0, serialize-javascript@^6.0.2: version "6.0.2" resolved "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz" integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== @@ -7199,15 +7036,15 @@ mime-types "~2.1.17" parseurl "~1.3.2" serve-static@1.15.0: version "1.15.0" resolved "https://registry.npmmirror.com/serve-static/-/serve-static-1.15.0.tgz" integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== serve-static@1.16.2: version "1.16.2" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: encodeurl "~1.0.2" encodeurl "~2.0.0" escape-html "~1.0.3" parseurl "~1.3.3" send "0.18.0" send "0.19.0" set-blocking@^2.0.0: version "2.0.0" @@ -7262,7 +7099,7 @@ setprototypeof@1.2.0: version "1.2.0" resolved "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz" resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== shallow-clone@^3.0.0: @@ -7330,7 +7167,7 @@ object-inspect "^1.13.3" side-channel-map "^1.0.1" side-channel@^1.0.4, side-channel@^1.1.0: side-channel@^1.0.6, side-channel@^1.1.0: version "1.1.0" resolved "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz" integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== @@ -7427,10 +7264,10 @@ uuid "^8.3.2" websocket-driver "^0.7.4" source-map-js@^1.2.0: version "1.2.0" resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz" integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== source-map-js@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-resolve@^0.5.0: version "0.5.3" @@ -7569,7 +7406,7 @@ statuses@2.0.1: version "2.0.1" resolved "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== stop-iteration-iterator@^1.1.0: @@ -7779,7 +7616,7 @@ svg-tags@^1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz" resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz" integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== svgo@^2.7.0: @@ -7836,24 +7673,24 @@ mkdirp "^1.0.3" yallist "^4.0.0" terser-webpack-plugin@^5.1.1, terser-webpack-plugin@^5.3.10: version "5.3.10" resolved "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz" integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== terser-webpack-plugin@^5.1.1, terser-webpack-plugin@^5.3.11: version "5.3.14" resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz" integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== dependencies: "@jridgewell/trace-mapping" "^0.3.20" "@jridgewell/trace-mapping" "^0.3.25" jest-worker "^27.4.5" schema-utils "^3.1.1" serialize-javascript "^6.0.1" terser "^5.26.0" schema-utils "^4.3.0" serialize-javascript "^6.0.2" terser "^5.31.1" terser@^5.10.0, terser@^5.26.0: version "5.30.3" resolved "https://registry.npmmirror.com/terser/-/terser-5.30.3.tgz" integrity sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA== terser@^5.10.0, terser@^5.31.1: version "5.43.1" resolved "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz" integrity sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" acorn "^8.14.0" commander "^2.20.0" source-map-support "~0.5.20" @@ -7898,14 +7735,9 @@ integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== tinymce@^5.4.1: version "5.4.1" resolved "https://registry.npmmirror.com/tinymce/-/tinymce-5.4.1.tgz" integrity sha512-eUjwDVCTSHSnFfpzX5TjTHXsGj5gvPQwzo3RFDF374gfK5voHqcRGojvQnu4NtNW1BAb012/KW1tkXBbUrEveg== to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== version "5.10.9" resolved "https://registry.npmjs.org/tinymce/-/tinymce-5.10.9.tgz" integrity sha512-5bkrors87X9LhYX2xq8GgPHrIgJYHl87YNs+kBcjQ5I3CiUgzo/vFcGvT3MZQ9QHsEeYMhYO6a5CLGGffR8hMg== to-object-path@^0.3.0: version "0.3.0" @@ -7924,7 +7756,7 @@ to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" @@ -7941,7 +7773,7 @@ toidentifier@1.0.1: version "1.0.1" resolved "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz" resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== totalist@^3.0.0: @@ -8009,7 +7841,7 @@ type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: media-typer "0.3.0" @@ -8090,26 +7922,26 @@ integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== version "2.0.1" resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz" integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== unicode-match-property-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== dependencies: unicode-canonical-property-names-ecmascript "^2.0.0" unicode-property-aliases-ecmascript "^2.0.0" unicode-match-property-value-ecmascript@^2.1.0: version "2.1.0" resolved "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== version "2.2.0" resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz" integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== unicode-property-aliases-ecmascript@^2.0.0: version "2.1.0" resolved "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== unidecode@0.1.8: @@ -8139,7 +7971,7 @@ unpipe@~1.0.0, unpipe@1.0.0: version "1.0.0" resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unset-value@^1.0.0: @@ -8150,13 +7982,13 @@ has-value "^0.3.1" isobject "^3.0.0" update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz" integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== update-browserslist-db@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== dependencies: escalade "^3.1.1" picocolors "^1.0.0" escalade "^3.2.0" picocolors "^1.1.1" uri-js@^4.2.2: version "4.4.1" @@ -8430,10 +8262,10 @@ flat "^5.0.2" wildcard "^2.0.0" webpack-sources@*, webpack-sources@^3.2.3: version "3.2.3" resolved "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== webpack-sources@*, webpack-sources@^3.3.3: version "3.3.3" resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz" integrity sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== webpack-virtual-modules@^0.4.2: version "0.4.6" @@ -8441,20 +8273,21 @@ integrity sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA== "webpack@^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "webpack@^3.0.0 || ^4.1.0 || ^5.0.0-0", "webpack@^4.0.0 || ^5.0.0", "webpack@^4.1.0 || ^5.0.0-0", "webpack@^4.27.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.54.0, webpack@^5.92.0, webpack@>=2: version "5.93.0" resolved "https://registry.npmmirror.com/webpack/-/webpack-5.93.0.tgz" integrity sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA== version "5.101.3" resolved "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz" integrity sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^1.0.5" "@webassemblyjs/ast" "^1.12.1" "@webassemblyjs/wasm-edit" "^1.12.1" "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" acorn-import-attributes "^1.9.5" browserslist "^4.21.10" "@types/eslint-scope" "^3.7.7" "@types/estree" "^1.0.8" "@types/json-schema" "^7.0.15" "@webassemblyjs/ast" "^1.14.1" "@webassemblyjs/wasm-edit" "^1.14.1" "@webassemblyjs/wasm-parser" "^1.14.1" acorn "^8.15.0" acorn-import-phases "^1.0.3" browserslist "^4.24.0" chrome-trace-event "^1.0.2" enhanced-resolve "^5.17.0" enhanced-resolve "^5.17.3" es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" @@ -8464,11 +8297,11 @@ loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^3.2.0" schema-utils "^4.3.2" tapable "^2.1.1" terser-webpack-plugin "^5.3.10" terser-webpack-plugin "^5.3.11" watchpack "^2.4.1" webpack-sources "^3.2.3" webpack-sources "^3.3.3" websocket-driver@^0.7.4, websocket-driver@>=0.5.1: version "0.7.4" @@ -8627,14 +8460,14 @@ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== ws@^7.3.1: version "7.5.9" resolved "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== version "7.5.10" resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== ws@^8.13.0: version "8.16.0" resolved "https://registry.npmmirror.com/ws/-/ws-8.16.0.tgz" integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== version "8.18.3" resolved "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz" integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== ws@^8.2.3: version "8.18.0" @@ -8694,6 +8527,11 @@ y18n "^5.0.5" yargs-parser "^20.2.2" yarn@^1.22.22: version "1.22.22" resolved "https://registry.npmjs.org/yarn/-/yarn-1.22.22.tgz" integrity sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg== yorkie@^2.0.0: version "2.0.0" resolved "https://registry.npmmirror.com/yorkie/-/yorkie-2.0.0.tgz"