@palerock/exam-qa 1.0.6 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.DS_Store +0 -0
- package/dist/a.txt +797 -0
- package/dist/index.html +1 -1
- package/dist/static/css/app.8f8b2d7c84b52eeb2db45d369b9b0d52.css +2 -0
- package/dist/static/css/app.8f8b2d7c84b52eeb2db45d369b9b0d52.css.map +1 -0
- package/dist/static/js/app.251858b58c3037a0330d.js +2 -0
- package/dist/static/js/app.251858b58c3037a0330d.js.map +1 -0
- package/dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map +1 -1
- package/dist/static/js/{vendor.ac467c0d394fa8945db3.js → vendor.ec183ed3d3ceeca56279.js} +5 -5
- package/dist/static/js/vendor.ec183ed3d3ceeca56279.js.map +1 -0
- package/lib-json/Agentforce Specialist (1).json +1223 -0
- package/lib-json/Agentforce Specialist (2).json +596 -0
- package/lib-json/Agentforce Specialist (3).json +558 -0
- package/lib-json/Agentforce Specialist (4).json +463 -0
- package/lib-json/Agentforce Specialist (5).json +1147 -0
- package/lib-json/Agentforce Specialist (6).json +1147 -0
- package/lib-json/Agentforce Specialist.json +1033 -0
- package/lib-json/Dev1/345/237/272/347/241/200/351/242/230.json +1407 -0
- package/lib-json/Dev1/346/250/241/346/213/237/345/215/267A.json +1538 -0
- package/lib-json/Dev1/346/250/241/346/213/237/345/215/267B.json +1534 -0
- package/lib-json/Dev1/346/265/201/347/250/213/350/207/252/345/212/250/345/214/226/344/270/216/351/200/273/350/276/2211.json +1587 -0
- package/lib-json/Dev1/346/265/201/347/250/213/350/207/252/345/212/250/345/214/226/344/270/216/351/200/273/350/276/2212.json +1042 -0
- package/lib-json/Dev1/346/265/213/350/257/225_/350/260/203/350/257/225_/351/203/250/347/275/262.json +928 -0
- package/lib-json/Dev1/347/224/250/346/210/267/347/225/214/351/235/242.json +1243 -0
- package/lib-json/MULESOFT-DEV1.json +6346 -0
- package/lib-json/Salesforce-Maps-AP.json +1667 -0
- package/lib-json/[DEV2]Salesforce/345/237/272/347/241/200.json +375 -0
- package/lib-json/[DEV2]/346/200/247/350/203/275.json +728 -0
- package/lib-json/[DEV2]/346/250/241/346/213/237/345/215/267A.json +1403 -0
- package/lib-json/[DEV2]/346/250/241/346/213/237/345/215/267B.json +1387 -0
- package/lib-json/[DEV2]/346/265/213/350/257/225/344/270/216/351/203/250/347/275/262.json +828 -0
- package/lib-json/[DEV2]/347/224/250/346/210/267/347/225/214/351/235/2421.json +977 -0
- package/lib-json/[DEV2]/347/224/250/346/210/267/347/225/214/351/235/2422.json +667 -0
- package/lib-json/[DEV2]/351/200/273/350/276/221/343/200/201/346/265/201/347/250/213/350/207/252/345/212/250/345/214/226/345/222/214/351/233/206/346/210/2201.json +1387 -0
- package/lib-json/[DEV2]/351/200/273/350/276/221/343/200/201/346/265/201/347/250/213/350/207/252/345/212/250/345/214/226/345/222/214/351/233/206/346/210/2202.json +260 -0
- package/lib-json/[JS]/347/254/254/344/270/200/347/253/240 /345/217/230/351/207/217-/347/261/273/345/236/213-/351/233/206/345/220/210.json" +1048 -0
- package/lib-json/[JS]/347/254/254/344/270/203/347/253/240 /346/265/213/350/257/225.json" +356 -0
- package/lib-json/[JS]/347/254/254/344/270/211/347/253/240 /346/265/217/350/247/210/345/231/250/345/222/214/344/272/213/344/273/266.json" +851 -0
- package/lib-json/[JS]/347/254/254/344/272/214/347/253/240 /345/257/271/350/261/241-/345/207/275/346/225/260-/347/261/273.json" +1787 -0
- package/lib-json/[JS]/347/254/254/344/272/224/347/253/240 /345/274/202/346/255/245/347/274/226/347/250/213.json" +547 -0
- package/lib-json/[JS]/347/254/254/345/205/255/347/253/240 /346/234/215/345/212/241/345/231/250/347/253/257JavaScript.json" +613 -0
- package/lib-json/[JS]/347/254/254/345/233/233/347/253/240 /350/260/203/350/257/225/345/222/214/351/224/231/350/257/257/345/244/204/347/220/206.json" +525 -0
- package/lib-json/[/345/222/270/351/261/274]AppBuilder-1.json +977 -0
- package/lib-json/[/345/222/270/351/261/274]AppBuilder-2.json +941 -0
- package/lib-json/[/345/222/270/351/261/274]AppBuilder-3.json +973 -0
- package/lib-json/[/345/222/270/351/261/274]AppBuilder-4.json +981 -0
- package/lib-json/[/345/222/270/351/261/274]AppBuilder-5.json +771 -0
- package/lib-json/map.json +37 -33
- package/package.json +4 -2
- package/dist/static/css/app.d3e969a579969be885a3462a1e12e37f.css +0 -2
- package/dist/static/css/app.d3e969a579969be885a3462a1e12e37f.css.map +0 -1
- package/dist/static/js/app.7dfb69d47070d11f33f7.js +0 -2
- package/dist/static/js/app.7dfb69d47070d11f33f7.js.map +0 -1
- package/dist/static/js/vendor.ac467c0d394fa8945db3.js.map +0 -1
- package/lib-json/Salesforce-Admin(302)-[Set-10].json +0 -321
- package/lib-json/Salesforce-Admin(302)-[Set-1].json +0 -301
- package/lib-json/Salesforce-Admin(302)-[Set-2].json +0 -325
- package/lib-json/Salesforce-Admin(302)-[Set-3].json +0 -305
- package/lib-json/Salesforce-Admin(302)-[Set-4].json +0 -325
- package/lib-json/Salesforce-Admin(302)-[Set-5].json +0 -329
- package/lib-json/Salesforce-Admin(302)-[Set-6].json +0 -322
- package/lib-json/Salesforce-Admin(302)-[Set-7].json +0 -321
- package/lib-json/Salesforce-Admin(302)-[Set-8].json +0 -321
- package/lib-json/Salesforce-Admin(302)-[Set-9].json +0 -325
- package/lib-json/Salesforce-Certified-Platform-Developer-1-[Set-1].json +0 -318
- package/lib-json/Salesforce-Certified-Platform-Developer-1-[Set-2].json +0 -325
- package/lib-json/Salesforce-Certified-Platform-Developer-1-[Set-3].json +0 -321
- package/lib-json/Salesforce-Certified-Platform-Developer-1-[Set-4].json +0 -337
- package/lib-json/Salesforce-Certified-Platform-Developer-1-[Set-5].json +0 -329
- package/lib-json/Salesforce-Certified-Platform-Developer-1-[Set-6].json +0 -325
- package/lib-json/Salesforce-Certified-Platform-Developer-1-[Set-7].json +0 -480
- package/lib-json/Salesforce-Sales-Cloud-Certification(81)-[Set-1].json +0 -305
- package/lib-json/Salesforce-Sales-Cloud-Certification(81)-[Set-2].json +0 -297
- package/lib-json/Salesforce-Sales-Cloud-Certification(81)-[Set-3].json +0 -269
- package/lib-json/Salesforce-Sales-Cloud-Certification(81)-[Set-4].json +0 -309
- package/lib-json/Salesforce-Sales-Cloud-Certification(81)-[Set-5].json +0 -515
- package/lib-json/app-builder-01.json +0 -1
- package/lib-json/app-builder-02.json +0 -1
- package/lib-json/app-builder-03.json +0 -1
- package/lib-json/app-builder-04.json +0 -1
- package/lib-json/app-builder-05.json +0 -1
- package/lib-json/app-builder-06.json +0 -1
- package/lib-json/app-builder-07.json +0 -1
- package/lib-json/app-builder-08.json +0 -1
- package/lib-json/app-builder-09.json +0 -1
- package/lib-json/app-builder-10.json +0 -1
- package/lib-json/app-builder-11.json +0 -311
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"sources":["webpack:///src/App.vue","webpack:///./src/App.vue?37e4","webpack:///./src/App.vue","webpack:///./src/utils/index.js","webpack:///./src/db/index.js","webpack:///./src/dao/index.js","webpack:///./src/config/index.js","webpack:///src/components/home-pages/HomeIndex.vue","webpack:///./src/components/home-pages/HomeIndex.vue?bbb0","webpack:///./src/components/home-pages/HomeIndex.vue","webpack:///src/components/HelloWorld.vue","webpack:///./src/components/HelloWorld.vue?3534","webpack:///./src/components/HelloWorld.vue","webpack:///src/components/HomePage.vue","webpack:///./src/components/HomePage.vue?b17a","webpack:///./src/components/HomePage.vue","webpack:///src/components/exam/DoExamPage.vue","webpack:///./src/components/exam/DoExamPage.vue?f5fb","webpack:///./src/components/exam/DoExamPage.vue","webpack:///src/components/CategoryPage.vue","webpack:///./src/components/CategoryPage.vue?69b8","webpack:///./src/components/CategoryPage.vue","webpack:///./src/router/index.js","webpack:///./src/plugins/index.js","webpack:///./src/main.js"],"names":["App","name","data","direction","lastBackPressTime","backPressInterval","immersed","navHeight","isImmersed","mounted","this","initPlusReady","initGlobalBackManager","beforeDestroy","removeBackButtonListener","cleanupImmersiveStyles","cleanupGlobalBackManager","methods","_this","window","GlobalBackManager","interceptors","addInterceptor","interceptor","addBackInterceptor","removeInterceptor","removeBackInterceptor","goBack","handleGlobalBack","$root","globalBack","console","log","push","index","indexOf","splice","_handleGlobalBack","asyncToGenerator_default","regenerator_default","a","mark","_callee","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","_step","wrap","_context","prev","next","toConsumableArray_default","reverse","undefined","get_iterator_default","done","value","sent","abrupt","t0","error","t1","return","finish","executeDefaultBack","stop","apply","arguments","$route","path","hasOpenDialog","closeTopDialog","$router","back","handleHomePageBack","_this2","plusReady","setupImmersiveStatusBar","addBackButtonListener","plus","document","addEventListener","detectImmersiveMode","ms","exec","navigator","userAgent","length","parse_float_default","app","applyImmersiveStyles","statusBarHeight","getStatusBarHeight","warn","injectImmersiveStyles","existingStyle","getElementById","remove","styleEle","createElement","id","innerHTML","head","appendChild","body","classList","add","documentElement","style","removeProperty","key","onBackButton","removeEventListener","currentTime","Date","getTime","runtime","quit","showExitTip","$toast","$Toast","nativeUI","toast","alert","dialogs","querySelectorAll","from_default","some","dialog","getComputedStyle","display","visibility","i","closeBtn","querySelector","click","contains","watch","to","from","getPageLevel","startsWith","toLevel","fromLevel","selectortype_template_index_0_src_App","render","_h","$createElement","_c","_self","attrs","staticClass","staticRenderFns","src_App","__webpack_require__","normalizeComponent","ssrContext","utils","getHashCode","obj","getStrHashCode","getMessage","concat","getPropertyNames","join","deep","includes","typeof_default","flat","entries_default","map","_ref","_ref2","slicedToArray_default","filter","r","toString","keys_default","str","len","hash","charCodeAt","arr","Infinity","ret","dirty","forEach","item","is_array_default","fromEntries","result","Array","storage","getItem","itemStr","localStorage","JSON","parse","e","setItem","stringify_default","removeItem","groupArray","groupedBy","_this3","array","hashCode","checkedMap","checkItem","Object","groupBy","_objectSpread","checkedHashCode","hashArr","find","values_default","duplicateRemoval","g","randomSort","sort","Math","random","dexieDB","Dexie","version","stores","config","question","bank","historyRecord","configDB","questionDB","bankDB","historyRecordDB","BaseDao","db","defaultEntry","classCallCheck_default","hook","primKey","createDate","now_default","modifyDate","changed","origin","dao__objectSpread","records","bulkPut","put","field","where","query","equals","first","keys","bulkDelete","delete","ConfigDao","possibleConstructorReturn_default","getPrototypeOf_default","call","QuestionDao","describe","type","BankDao","title","questions","HistoryRecordDao","rightTimes","errorTimes","maxTime","minTime","totalTime","hashCodeList","anyOf","toArray","questionDao","bankDao","historyRecordDao","vue_esm","use","loading","cell","cell_group","es_button","popup","grid","grid_item","es_checkbox","checkbox_group","tag","icon","existsMap","HomeIndex","isShowImporter","isFromOnline","onlineLibs","onlineSelects","questionLib","categories","loadingOnlineLibs","loadingProgress","totalLibsCount","loadedLibsCount","loadingError","computed","selectedLibs","res","lib","HomeIndex__objectSpread","goToCategory","category","params","selectLib","s","showImporter","importFromExist","_importFromExist","loadOnlineLibs","_loadOnlineLibs","_callee2","_context2","fetchOnlineLib","retryLoadOnlineLibs","_fetchOnlineLib","_callee3","maps","promises","libs","validLibs","_context3","$http","get","then","catch","promise_default","all","importLib","_importLib","_callee5","importCount","results","_context5","_callee4","l","_context4","importSingleLib","_x","success","fail","initCategories","_importSingleLib","_callee6","_context6","q","upsert","dao_bankDao","_x2","_initCategories","_callee7","_this4","_context7","notEqual","banks","b","reduce","ac","home_pages_HomeIndex","_vm","_m","_v","mode","column-num","gutter","clickable","on","slot","_l","animation-delay","$event","_s","round","click-overlay","model","callback","$$v","expression","width","_e","size","color","oi","label","placeholder","rows","block","components_home_pages_HomeIndex","HomeIndex_normalizeComponent","components_HelloWorld","HelloWorld_normalizeComponent","msg","nav_bar","tabbar","tabbar_item","HomePage","activeTabIndex","pages","api","activePage","components_HomePage","fixed","src_components_HomePage","HomePage_normalizeComponent","row","col","radio_group","es_radio","defaultQuestionInfo","required","score","usingScore","answerOptions","isRight","defaultExamInfo","panel","DoExamPage","answers","questionNum","isShowResult","letterIndex","examInfo","hasSubmit","examHashCode","historyExams","showAcButtons","backInterceptor","transitionName","previousQuestionNum","panStartScrollTop","showImagePreview","previewImageSrc","previewImageAlt","zoomLevel","translateX","translateY","initialDistance","initialZoom","lastTouchX","lastTouchY","isDragging","isZooming","imageNaturalWidth","imageNaturalHeight","containerWidth","containerHeight","totalNum","isReviewError","historyErrorHashCodes","neverDo","doneHashCodes","DoExamPage__objectSpread","active","questionsInfo","single","multi","apis","answer","orderNum","isMulti","opt","exam","imageStyle","transform","transformOrigin","transition","cursor","userSelect","WebkitUserSelect","MozUserSelect","msUserSelect","handleBack","originalHandleBack","shouldConfirmExit","confirm","message","confirmButtonText","cancelButtonText","confirmButtonColor","className","closeOnClickOverlay","isQuestionAnswered","getQuestionNavClass","classes","isChecked","isPractice","isPass","isMistake","registerBackInterceptor","_this5","closeImagePreview","unregisterBackInterceptor","getQuestionTitle","split","getQuestionDesc","errorExam","totalTimes","toFixed","setAnswer","ai","toggleAnswer","checkResult","_this6","rightAnswers","option","isAnswered","turnTo","root","$refs","scrollTop","confirmSubmit","_this7","answeredNum","progressRate","messageContent","submit","_this8","requireAllDone","unfinishedContent","rightNum","rightRate","queryByHashCode","codeInfo","relatedQuestion","isNaN","dialogClass","resultContent","adaptExamConfig","examConfig","checkNoAnswer","resultAnswers","checks","invalid","loadHistoryExamInfo","getOptionColor","_this9","queryMany","onTouchStart","evt","swipe","currentScrollTop","handleImageClick","event","target","tagName","toLowerCase","stopPropagation","src","alt","vibrate","handleKeyDown","resetImageTransform","onImageLoad","previewImage","naturalWidth","naturalHeight","imageContainer","clientWidth","clientHeight","zoomIn","min","constrainImagePosition","zoomOut","max","resetZoom","handleWheel","preventDefault","zoomFactor","deltaY","newZoom","rect","getBoundingClientRect","centerX","clientX","left","centerY","clientY","top","height","zoomChange","handleTouchStart","touches","touch1","touch2","getDistance","handleTouchMove","deltaX","scaleChange","handleTouchEnd","dx","dy","sqrt","img","container","containerRect","scaledWidth","offsetWidth","scaledHeight","offsetHeight","maxTranslateX","maxTranslateY","props","default","Boolean","isNew","device","setWakelock","destroyed","exam_DoExamPage","directives","rawName","arg","ref","touchstart","left-arrow","right-text","click-left","click-right","span","class","t","domProps","$set","option-selected","option-correct","option-incorrect","checked-color","analysis","touchmove","touchend","wheel","load","dragstart","components_exam_DoExamPage","DoExamPage_normalizeComponent","CategoryPage","examList","isShowOption","optionInfo","currentExam","historyRecords","categoryName","categoryTitle","loadCategoryExams","_loadCategoryExams","filteredBanks","sortBy","errorMap","record","CategoryPage__objectSpread","times","hasHistoryError","showOption","_showOption","doExam","getTotalCounts","getErrorCounts","getUndoneCounts","doneQuestions","toArray_default","slice","clearHistory","_mounted","$route.params.category","handler","immediate","components_CategoryPage","position","disabled","src_components_CategoryPage","CategoryPage_normalizeComponent","Vue","Router","router","routes","component","AlloyFingerPlugin","AlloyFinger","prototype","axios","jsonp","Utils","define_property_default","enumerable","productionTip","el","components","template"],"mappings":"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","file":"static/js/app.251858b58c3037a0330d.js","sourcesContent":["<template>\n <div id=\"app\">\n <transition :name=\"direction\">\n <router-view class=\"appView\"/>\n </transition>\n </div>\n</template>\n\n<script>\n export default {\n name: 'App',\n data: () => ({\n direction: \"slide-right\",\n lastBackPressTime: 0, // 上次按返回键的时间\n backPressInterval: 2000, // 双击返回键的时间间隔(毫秒)\n immersed: 20, // 沉浸式状态栏高度,默认值\n navHeight: 46, // 导航栏高度\n isImmersed: false // 是否为沉浸式状态栏\n }),\n mounted() {\n // H5 plus事件处理\n this.initPlusReady();\n // 初始化全局返回管理\n this.initGlobalBackManager();\n },\n beforeDestroy() {\n // 移除返回键监听\n this.removeBackButtonListener();\n // 清理动态注入的样式\n this.cleanupImmersiveStyles();\n // 清理全局返回管理器\n this.cleanupGlobalBackManager();\n },\n methods: {\n // 初始化全局返回管理器\n initGlobalBackManager() {\n // 创建全局返回管理器\n window.GlobalBackManager = {\n // 返回拦截器列表\n interceptors: [],\n \n // 添加返回拦截器\n addInterceptor: (interceptor) => {\n this.addBackInterceptor(interceptor);\n },\n \n // 移除返回拦截器\n removeInterceptor: (interceptor) => {\n this.removeBackInterceptor(interceptor);\n },\n \n // 执行返回操作\n goBack: () => {\n this.handleGlobalBack();\n }\n };\n \n // 在Vue原型上添加全局返回方法,方便组件调用\n this.$root.globalBack = () => {\n this.handleGlobalBack();\n };\n \n console.log('全局返回管理器初始化完成');\n },\n \n // 添加返回拦截器\n addBackInterceptor(interceptor) {\n if (typeof interceptor === 'function') {\n window.GlobalBackManager.interceptors.push(interceptor);\n }\n },\n \n // 移除返回拦截器\n removeBackInterceptor(interceptor) {\n const index = window.GlobalBackManager.interceptors.indexOf(interceptor);\n if (index > -1) {\n window.GlobalBackManager.interceptors.splice(index, 1);\n }\n },\n \n // 处理全局返回逻辑\n async handleGlobalBack() {\n // 按照后进先出的顺序执行拦截器\n const interceptors = [...window.GlobalBackManager.interceptors].reverse();\n \n for (let interceptor of interceptors) {\n try {\n // 拦截器返回 true 表示拦截返回操作,false 表示继续\n const shouldIntercept = await interceptor();\n if (shouldIntercept) {\n console.log('返回操作被拦截');\n return; // 被拦截,停止执行\n }\n } catch (error) {\n console.error('返回拦截器执行错误:', error);\n }\n }\n \n // 没有被拦截,执行默认返回逻辑\n this.executeDefaultBack();\n },\n \n // 执行默认返回逻辑\n executeDefaultBack() {\n const currentPath = this.$route.path;\n \n // 如果当前在首页,实现双击退出功能\n if (currentPath === '/') {\n this.handleHomePageBack();\n return;\n }\n \n // 检查是否有弹窗需要关闭\n if (this.hasOpenDialog()) {\n this.closeTopDialog();\n return;\n }\n \n // 否则返回上一页\n this.$router.back();\n },\n initPlusReady() {\n // H5 plus事件处理\n const plusReady = () => {\n // plus准备完成后初始化功能\n this.setupImmersiveStatusBar();\n this.addBackButtonListener();\n };\n \n if (window.plus) {\n plusReady();\n } else {\n document.addEventListener('plusready', plusReady, false);\n }\n \n // 在非plus环境下也尝试检测沉浸式状态栏\n this.detectImmersiveMode();\n },\n detectImmersiveMode() {\n // 获取状态栏高度,参考你提供的代码\n this.immersed = 20; // 默认高度\n var ms = (/Html5Plus\\/.+\\s\\(.*(Immersed\\/(\\d+\\.?\\d*).*)\\)/gi).exec(navigator.userAgent);\n if (ms && ms.length >= 3) { \n // 当前环境为沉浸式状态栏模式\n this.immersed = parseFloat(ms[2]); // 获取状态栏的高度\n this.isImmersed = true;\n console.log('检测到沉浸式状态栏,高度:', this.immersed);\n } else {\n this.isImmersed = false;\n this.immersed = 0; // 非沉浸式模式不需要额外高度\n console.log('非沉浸式状态栏模式');\n }\n // this.isImmersed = true;\n // this.immersed = 46;\n \n // 设置全局变量供其他地方使用\n window.app = window.app || {};\n window.app.immersed = this.immersed;\n window.app.navHeight = this.navHeight;\n window.app.isImmersed = this.isImmersed;\n \n // 应用沉浸式样式\n this.applyImmersiveStyles();\n },\n setupImmersiveStatusBar() {\n // 如果在 plus 环境中,可以进行更精确的设置\n if (typeof plus !== 'undefined') {\n try {\n // 获取更精确的状态栏高度\n const statusBarHeight = plus.navigator.getStatusBarHeight();\n if (statusBarHeight > 0) {\n this.immersed = statusBarHeight;\n this.isImmersed = true;\n \n // 更新全局变量\n window.app = window.app || {};\n window.app.immersed = this.immersed;\n window.app.navHeight = this.navHeight;\n window.app.isImmersed = this.isImmersed;\n }\n \n // 重新应用样式\n this.applyImmersiveStyles();\n \n console.log('沉浸式状态栏设置完成,高度:', this.immersed);\n } catch (error) {\n console.warn('设置沉浸式状态栏失败:', error);\n }\n }\n },\n applyImmersiveStyles() {\n // 只有在沉浸式模式下才注入样式\n if (this.isImmersed && this.immersed > 0) {\n this.injectImmersiveStyles();\n }\n },\n injectImmersiveStyles() {\n // 移除已存在的沉浸式样式\n const existingStyle = document.getElementById('immersive-style');\n if (existingStyle) {\n existingStyle.remove();\n }\n \n // 注册沉浸状态栏style,参考你提供的代码结构\n var styleEle = document.createElement('style');\n styleEle.id = 'immersive-style';\n styleEle.innerHTML = \n // 适配 Vant 导航栏组件 - 增加padding使导航栏延伸到状态栏\n '.van-nav-bar { padding-top: ' + this.immersed + 'px !important; height: ' + (this.navHeight + this.immersed) + 'px !important; }' +\n \n // 确保导航栏背景渐变完全覆盖状态栏区域\n '.van-nav-bar::before { content: \"\"; position: absolute; top: 0; left: 0; right: 0; height: ' + this.immersed + 'px; background: var(--primary-gradient); z-index: -1; }' +\n \n // 调整导航栏标题和按钮位置,确保在状态栏下方正确显示\n '.van-nav-bar__title { margin-top: 0 !important; }' +\n '.van-nav-bar__left, .van-nav-bar__right { margin-top: 0 !important; }' +\n \n // 调整应用主体容器,重置之前的padding然后只设置必要的top值\n '#app { padding-top: ' + (this.navHeight + this.immersed) + 'px !important; }' +\n \n // 调整页面视图容器的最小高度\n '.appView { min-height: calc(100vh - ' + (this.navHeight + this.immersed) + 'px) !important; }' +\n \n // 适配各页面容器的padding,确保内容不被状态栏遮挡\n '.question-container { padding-top: ' + (this.immersed + 60) + 'px !important; }' +\n '.page-container { padding-top: ' + (this.immersed + 60) + 'px !important; }' +\n '.category-container { padding-top: ' + (this.immersed + 60) + 'px !important; }' +\n \n // 为固定定位的导航栏确保正确定位\n '.van-nav-bar[class*=\"fixed\"] { position: fixed !important; top: 0 !important; z-index: 1000 !important; }' +\n \n // 添加一个辅助类来标识沉浸式模式\n 'body { --immersed-height: ' + this.immersed + 'px; --nav-total-height: ' + (this.navHeight + this.immersed) + 'px; }' +\n 'body.immersive-mode #app { /* 为沉浸式模式提供额外样式钩子 */ }';\n \n document.head.appendChild(styleEle);\n \n // 添加沉浸式模式标识类到body\n document.body.classList.add('immersive-mode');\n \n console.log('沉浸式样式已注入');\n },\n cleanupImmersiveStyles() {\n // 移除动态注入的样式\n const existingStyle = document.getElementById('immersive-style');\n if (existingStyle) {\n existingStyle.remove();\n }\n \n // 移除沉浸式模式标识类\n document.body.classList.remove('immersive-mode');\n \n // 清理CSS变量\n document.documentElement.style.removeProperty('--immersed-height');\n document.documentElement.style.removeProperty('--nav-total-height');\n \n // 清理全局变量\n if (window.app) {\n delete window.app.immersed;\n delete window.app.navHeight;\n delete window.app.isImmersed;\n }\n },\n \n // 清理全局返回管理器\n cleanupGlobalBackManager() {\n if (window.GlobalBackManager) {\n // 清空拦截器\n window.GlobalBackManager.interceptors = [];\n // 删除全局对象\n delete window.GlobalBackManager;\n }\n \n // 清理Vue原型上的方法\n if (this.$root.globalBack) {\n delete this.$root.globalBack;\n }\n \n console.log('全局返回管理器已清理');\n },\n addBackButtonListener() {\n // 检查是否在uniapp环境中\n if (typeof plus !== 'undefined') {\n plus.key.addEventListener(\"backbutton\", this.onBackButton, false);\n }\n },\n removeBackButtonListener() {\n if (typeof plus !== 'undefined') {\n plus.key.removeEventListener(\"backbutton\", this.onBackButton);\n }\n },\n onBackButton() {\n // 使用全局返回管理器处理返回逻辑\n this.handleGlobalBack();\n },\n handleHomePageBack() {\n const currentTime = new Date().getTime();\n \n // 如果距离上次按返回键的时间小于设定间隔,则退出应用\n if (currentTime - this.lastBackPressTime < this.backPressInterval) {\n plus.runtime.quit();\n return;\n }\n \n // 记录本次按键时间\n this.lastBackPressTime = currentTime;\n \n // 显示提示信息\n this.showExitTip();\n },\n showExitTip() {\n // 优先使用 Vant 的 Toast 组件\n if (this.$toast) {\n this.$toast('再按一次退出应用');\n } else if (typeof this.$Toast !== 'undefined') {\n this.$Toast('再按一次退出应用');\n } else {\n // 如果没有 Toast 组件,使用 HTML5+ 原生提示\n if (typeof plus !== 'undefined' && plus.nativeUI) {\n plus.nativeUI.toast('再按一次退出应用');\n } else {\n // 最后的备选方案,使用 alert\n alert('再按一次退出应用');\n }\n }\n },\n hasOpenDialog() {\n // 检查是否有 Vant 的弹窗组件打开\n const dialogs = document.querySelectorAll('.van-overlay, .van-popup, .van-dialog, .van-action-sheet, .van-picker');\n return Array.from(dialogs).some(dialog => {\n const style = window.getComputedStyle(dialog);\n return style.display !== 'none' && style.visibility !== 'hidden';\n });\n },\n closeTopDialog() {\n // 尝试关闭最顶层的弹窗\n const dialogs = document.querySelectorAll('.van-overlay, .van-popup .van-popup--center, .van-dialog, .van-action-sheet, .van-picker');\n \n // 查找最后一个可见的弹窗并关闭\n for (let i = dialogs.length - 1; i >= 0; i--) {\n const dialog = dialogs[i];\n const style = window.getComputedStyle(dialog);\n if (style.display !== 'none' && style.visibility !== 'hidden') {\n // 尝试触发关闭按钮点击\n const closeBtn = dialog.querySelector('.van-popup__close-icon, .van-dialog__confirm, .van-picker__cancel');\n if (closeBtn) {\n closeBtn.click();\n return;\n }\n \n // 如果没有找到关闭按钮,尝试点击遮罩层关闭\n if (dialog.classList.contains('van-overlay')) {\n dialog.click();\n return;\n }\n \n // 最后尝试手动隐藏\n dialog.style.display = 'none';\n return;\n }\n }\n }\n },\n watch: {\n $route(to, from) {\n // 定义页面层级:数字越大表示层级越深\n const getPageLevel = (path) => {\n if (path === '/') return 1; // 主页:第1层\n if (path.startsWith('/category/')) return 2; // 分类页:第2层\n if (path === '/exam') return 3; // 答题页:第3层\n return 1; // 默认层级\n };\n \n const toLevel = getPageLevel(to.path);\n const fromLevel = getPageLevel(from.path);\n \n // 向下钻取(层级增加):从右往左滑动\n // 向上返回(层级减少):从左往右滑动\n if (toLevel > fromLevel) {\n this.direction = \"slide-left\"; // 进入下级页面\n } else if (toLevel < fromLevel) {\n this.direction = \"slide-right\"; // 返回上级页面\n } else {\n // 同级之间的切换,保持从右往左\n this.direction = \"slide-left\";\n }\n }\n }\n }\n</script>\n\n<style>\n #app {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n color: var(--text-primary);\n padding-top: 46px;\n background: var(--bg-primary);\n min-height: 100vh;\n }\n\n * {\n box-sizing: border-box;\n }\n\n .appView {\n position: absolute;\n width: 100%;\n left: 0;\n top: 0;\n background: var(--bg-primary);\n min-height: calc(100vh - 60px);\n overflow-x: hidden;\n will-change: left, opacity;\n backface-visibility: hidden;\n -webkit-backface-visibility: hidden;\n padding-top: 0;\n }\n\n /* 向左滑动动画 - 进入下级页面 */\n .slide-left-enter-active {\n transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n z-index: 10;\n }\n\n .slide-left-leave-active {\n transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n z-index: 5;\n }\n\n .slide-left-enter {\n left: 100%;\n opacity: 0;\n }\n\n .slide-left-enter-to {\n left: 0;\n opacity: 1;\n }\n\n .slide-left-leave {\n left: 0;\n opacity: 1;\n }\n\n .slide-left-leave-to {\n left: -25%;\n opacity: 0.4;\n }\n\n /* 向右滑动动画 - 返回上级页面 */\n .slide-right-enter-active {\n transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n z-index: 5;\n }\n\n .slide-right-leave-active {\n transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);\n z-index: 10;\n }\n\n .slide-right-enter {\n left: -25%;\n opacity: 0.4;\n }\n\n .slide-right-enter-to {\n left: 0;\n opacity: 1;\n }\n\n .slide-right-leave {\n left: 0;\n opacity: 1;\n }\n\n .slide-right-leave-to {\n left: 100%;\n opacity: 0;\n }\n\n /* 防止动画过程中的闪烁 */\n .slide-left-enter-active .appView,\n .slide-left-leave-active .appView,\n .slide-right-enter-active .appView,\n .slide-right-leave-active .appView {\n pointer-events: none;\n }\n\n\n p {\n margin: 0;\n color: var(--text-secondary);\n }\n\n /* 沉浸式模式基础样式 */\n .immersive-mode {\n position: relative; /* 为沉浸式模式提供定位上下文 */\n }\n\n /* 美化导航栏 */\n .van-nav-bar {\n background: var(--primary-gradient) !important;\n box-shadow: var(--shadow-md);\n }\n\n .van-nav-bar__title {\n color: var(--text-white) !important;\n font-weight: 600;\n }\n\n .van-nav-bar__arrow,\n .van-nav-bar__text {\n color: var(--text-white) !important;\n }\n\n /* 美化标签栏 */\n .van-tabbar {\n background: var(--bg-card) !important;\n box-shadow: 0 -2px 12px rgba(0, 196, 167, 0.1);\n border-top: 1px solid var(--border-light);\n }\n\n .van-tabbar-item--active {\n color: var(--primary-color) !important;\n }\n\n .van-tabbar-item--active .van-icon {\n color: var(--primary-color) !important;\n }\n</style>\n\n\n\n// WEBPACK FOOTER //\n// src/App.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"app\"}},[_c('transition',{attrs:{\"name\":_vm.direction}},[_c('router-view',{staticClass:\"appView\"})],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-a0e2784e\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/App.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-a0e2784e\\\",\\\"scoped\\\":false,\\\"hasInlineConfig\\\":false}!../node_modules/vue-loader/lib/selector?type=styles&index=0!./App.vue\")\n}\nvar normalizeComponent = require(\"!../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\nimport __vue_script__ from \"!!babel-loader!../node_modules/vue-loader/lib/selector?type=script&index=0!./App.vue\"\n/* template */\nimport __vue_template__ from \"!!../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-a0e2784e\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../node_modules/vue-loader/lib/selector?type=template&index=0!./App.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/App.vue\n// module id = null\n// module chunks = ","export default {\n getHashCode(obj) {\n return this.getStrHashCode(this.getMessage(obj).concat(this.getPropertyNames(obj)).join(''));\n },\n getPropertyNames(_self, deep = 10) {\n if (deep <= 0) {\n return '';\n }\n if (!_self || ['string', 'number', 'boolean', 'function'].includes(typeof _self) || _self instanceof Date) {\n return '';\n }\n return this.flat(\n Object.entries(_self).map(([key, value]) => [key, this.getPropertyNames(value, deep--)])\n ).filter(r => r != null && r !== '')\n },\n getMessage(_self, deep) {\n deep == null && (deep = 10);\n if (deep <= 0) {\n return '';\n }\n if (!_self || ['string', 'number', 'boolean', 'function'].includes(typeof _self) || _self instanceof Date) {\n return [_self != null ? _self.toString() : ''];\n }\n return this.flat(\n Object.keys(_self).map(key => {\n return this.getMessage(_self[key], deep--);\n })\n ).filter(r => r != null && r !== '');\n },\n getStrHashCode(str) {\n let hash = 0, i, chr, len;\n if (str.length === 0) return hash;\n for (i = 0, len = str.length; i < len; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash + '';\n },\n flat(arr, deep = Infinity) {\n let ret = [];\n let dirty = false;\n arr.forEach(item => {\n if (Array.isArray(item)) {\n dirty = true;\n ret.push(...item)\n } else {\n ret.push(item)\n }\n });\n return dirty && deep > 0 ? this.flat(ret, deep--) : ret\n },\n fromEntries(arr) {\n let result = {};\n arr.forEach(a => {\n if (a instanceof Array) {\n result[a[0]] = a[1];\n }\n });\n return result;\n },\n storage: {\n getItem(key) {\n let itemStr = localStorage.getItem('__exam_s0_' + key);\n let result = null;\n try {\n result = JSON.parse(itemStr);\n } catch (e) {\n console.log(`No valid item for key [${key}] to get in storage.`);\n }\n return result;\n },\n setItem(key, value) {\n let result = null;\n try {\n result = JSON.stringify(value);\n localStorage.setItem('__exam_s0_' + key, result);\n } catch (e) {\n console.log(`Not valid item for key [${key}] to set.`);\n }\n },\n removeItem(key) {\n localStorage.removeItem('__exam_s0_' + key);\n },\n },\n groupArray(arr, groupedBy) {\n let array = arr.map(a => ({hashCode: this.getHashCode(a), item: a}));\n if (!(groupedBy instanceof Array)) {\n groupedBy = [groupedBy];\n }\n let checkedArr = array.map(a => ({\n hashCode: a.hashCode,\n checkItem: Object.fromEntries(\n groupedBy.map(groupBy => [groupBy, (a.item || {})[groupBy]])\n )\n })).map(a => ({...a, checkedHashCode: this.getHashCode(a.checkItem)}));\n let checkedMap = {};\n checkedArr.forEach(a => {\n let hashArr = checkedMap[a.checkedHashCode];\n if (!hashArr) {\n hashArr = [];\n }\n hashArr.push(array.find(arr => arr.hashCode === a.hashCode).item);\n checkedMap[a.checkedHashCode] = hashArr;\n });\n return Object.values(checkedMap);\n },\n duplicateRemoval(arr) {\n let array = arr.map(a => ({item: a}));\n let grouped = this.groupArray(array, 'item');\n return grouped.map(g => g[0].item);\n },\n randomSort(arr) {\n return arr.sort(() => {\n return Math.random() - 0.5;\n })\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/utils/index.js","import Dexie from \"dexie\";\n\nconst dexieDB = new Dexie('_qa_db');\ndexieDB.version(1).stores({\n config: 'key, value, createDate, modifyDate',\n question: 'hashCode, describe, type, createDate, modifyDate',\n bank: 'hashCode, title, *questions, createDate, modifyDate',\n historyRecord: 'relatedQuestion, rightTimes, errorTimes, maxTime, minTime, totalTime, createDate, modifyDate'\n});\ndexieDB.version(2).stores({\n bank: 'hashCode, title, *questions, category, createDate, modifyDate',\n});\ndexieDB.version(3).stores({\n question: 'hashCode, describe, type, createDate, modifyDate, analysis',\n});\nconst configDB = dexieDB['config'];\nconst questionDB = dexieDB['question'];\nconst bankDB = dexieDB['bank'];\nconst historyRecordDB = dexieDB['historyRecord'];\n\nexport {dexieDB, configDB, questionDB, bankDB, historyRecordDB};\n\n\n// WEBPACK FOOTER //\n// ./src/db/index.js","import {dexieDB, configDB, questionDB, bankDB, historyRecordDB} from '../db';\n\nclass BaseDao {\n constructor(db, defaultEntry) {\n this.db = db;\n this.defaultEntry = defaultEntry || {};\n this.db.hook('creating', (primKey, obj) => {\n obj.createDate = Date.now();\n obj.modifyDate = Date.now();\n });\n this.db.hook('updating', (changed, key, origin) => {\n changed['modifiedDate'] = Date.now();\n if (!origin['createdDate']) {\n changed['createdDate'] = Date.now();\n }\n console.log({...changed});\n return changed;\n })\n }\n\n async upsert(records) {\n if (records instanceof Array) {\n return this.db.bulkPut(records.map(r => ({...this.defaultEntry, ...r})));\n }\n return this.db.put({...this.defaultEntry, ...records});\n }\n\n query(field) {\n return this.db.where(field);\n }\n\n queryByHashCode(hashCode) {\n return this.query('hashCode').equals(hashCode).first();\n }\n\n async delete(keys) {\n if (keys instanceof Array) {\n return this.db.bulkDelete(keys);\n }\n return this.db.delete(keys);\n }\n}\n\n\nclass ConfigDao extends BaseDao {\n constructor() {\n super(configDB, {value: null});\n }\n}\n\nclass QuestionDao extends BaseDao {\n constructor() {\n super(questionDB, {\n describe: '',\n type: 'option'\n });\n }\n}\n\nclass BankDao extends BaseDao {\n constructor() {\n super(bankDB, {\n title: '',\n questions: []\n });\n }\n}\n\nclass HistoryRecordDao extends BaseDao {\n constructor() {\n super(historyRecordDB, {\n rightTimes: 0, errorTimes: 0, maxTime: 0, minTime: 0, totalTime: 0\n });\n }\n\n queryByHashCode(hashCode) {\n return this.query('relatedQuestion').equals(hashCode).first();\n }\n\n queryMany(hashCodeList) {\n return this.query('relatedQuestion').anyOf(hashCodeList).toArray();\n }\n}\n\nconst configDao = new ConfigDao();\nconst questionDao = new QuestionDao();\nconst bankDao = new BankDao();\nconst historyRecordDao = new HistoryRecordDao();\n\nexport {configDao, questionDao, bankDao, historyRecordDao}\n\n\n// WEBPACK FOOTER //\n// ./src/dao/index.js","export default {\n version: '1.1.4',\n domain:'//palerock.cn',\n // domain:'//localhost'\n}\n\n\n// WEBPACK FOOTER //\n// ./src/config/index.js","<template>\n <div class=\"home-index\">\n <div class=\"welcome-section\">\n <div class=\"welcome-card theme-card\">\n <div class=\"welcome-content\">\n <h2 class=\"gradient-text welcome-title\">欢迎使用答题神器</h2>\n <p>智能题库管理,轻松备考复习</p>\n </div>\n </div>\n </div>\n\n <transition name=\"slide-up\" mode=\"out-in\">\n <van-grid :column-num=\"2\" :gutter=\"16\" class=\"category-grid\">\n <van-grid-item\n icon=\"plus\"\n clickable\n @click=\"showImporter\"\n class=\"grid-item-enhanced import-item\">\n <div slot=\"text\" class=\"grid-text\">\n <span class=\"grid-title\">开始答题</span>\n <span class=\"grid-subtitle\">导入题库</span>\n </div>\n </van-grid-item>\n <van-grid-item\n v-for=\"(category, index) in categories\"\n :key=\"category\"\n icon=\"notes-o\"\n clickable\n @click=\"goToCategory(category)\"\n class=\"grid-item-enhanced category-item\"\n :style=\"{ 'animation-delay': (index * 0.1) + 's' }\">\n <div slot=\"text\" class=\"grid-text\">\n <span class=\"grid-title\">{{ category }}</span>\n <span class=\"grid-subtitle\">题库分类</span>\n </div>\n </van-grid-item>\n </van-grid>\n\n </transition>\n <van-popup v-model=\"isShowImporter\" class=\"import-popup\" round @click-overlay=\"isShowImporter = false\">\n <div class=\"exam-import-box theme-card\">\n <div class=\"popup-header\">\n <h3>导入题库</h3>\n <van-icon name=\"cross\" @click=\"isShowImporter = false\" class=\"close-icon\" />\n </div>\n \n <div v-if=\"isFromOnline\" class=\"online-libs-container\">\n <div v-if=\"loadingOnlineLibs\" class=\"loading-container\">\n <div class=\"loading-spinner\"></div>\n <p>{{ loadingProgress }}</p>\n <div v-if=\"totalLibsCount > 0\" class=\"progress-bar\">\n <div class=\"progress-fill\" :style=\"{ width: `${(loadedLibsCount / totalLibsCount) * 100}%` }\"></div>\n </div>\n </div>\n <div v-else-if=\"loadingError\" class=\"loading-container error-state\">\n <van-icon name=\"warning-o\" size=\"32\" color=\"var(--error-color)\" />\n <p class=\"error-message\">{{ loadingError }}</p>\n <van-button type=\"primary\" size=\"small\" round @click=\"retryLoadOnlineLibs\">\n 重试加载\n </van-button>\n </div>\n <div v-else-if=\"!onlineLibs || onlineLibs.length === 0\" class=\"loading-container\">\n <div class=\"loading-spinner\"></div>\n <p>准备加载题库...</p>\n </div>\n <van-checkbox-group v-model=\"onlineSelects\" v-else>\n <van-cell-group class=\"lib-cell-group\">\n <van-cell v-for=\"(lib, oi) in onlineLibs\"\n clickable\n @click=\"selectLib(lib)\"\n :key=\"oi\"\n class=\"lib-cell\">\n <template slot=\"title\">\n <div class=\"lib-info\">\n <span class=\"lib-title\">{{ lib.title }}</span>\n <span class=\"lib-category\">{{ lib.category || 'default' }}</span>\n </div>\n </template>\n <van-checkbox slot=\"right-icon\" :name=\"lib.hashCode\"></van-checkbox>\n </van-cell>\n </van-cell-group>\n </van-checkbox-group>\n </div>\n \n <div v-if=\"!isFromOnline\" class=\"manual-import\">\n <van-cell-group class=\"import-field-group\">\n <van-field\n v-model=\"questionLib\"\n label=\"题库内容\"\n type=\"textarea\"\n placeholder=\"请输入JSON格式的题库数据\"\n rows=\"8\"\n class=\"import-field\"></van-field>\n </van-cell-group>\n </div>\n \n <div class=\"popup-actions\">\n <van-button \n type=\"info\" \n size=\"large\" \n block \n round\n @click=\"importLib\"\n class=\"theme-button action-button\">\n <van-icon name=\"plus\" />\n 导入题库\n </van-button>\n <van-button \n type=\"primary\" \n size=\"large\" \n block \n round\n @click=\"importFromExist\"\n class=\"theme-button action-button\">\n <van-icon name=\"cloud-o\" />\n 获取在线题库\n </van-button>\n </div>\n </div>\n </van-popup>\n </div>\n</template>\n\n<script>\nimport Vue from 'vue';\nimport {Grid, GridItem} from 'vant';\nimport {Popup} from 'vant';\nimport {Button} from 'vant';\nimport {Field} from 'vant';\nimport {Cell, CellGroup} from 'vant';\nimport utils from '../../utils';\nimport {questionDao, historyRecordDao, bankDao, configDao} from '../../dao';\nimport {Dialog} from 'vant';\nimport config from \"@/config\";\nimport {Checkbox, CheckboxGroup} from 'vant';\nimport { Loading } from 'vant';\nimport { Tag } from 'vant';\nimport { Icon } from 'vant';\n\nVue.use(Loading);\nVue.use(Dialog);\nVue.use(Field).use(Cell).use(CellGroup);\nVue.use(Button);\nVue.use(Popup);\nVue.use(Grid).use(GridItem);\nVue.use(Checkbox).use(CheckboxGroup);\nVue.use(Tag);\nVue.use(Icon);\n\nconst existsMap = 'https://unpkg.com/@palerock/exam-qa@latest/lib-json';\nexport default {\n name: \"HomeIndex\",\n data() {\n return {\n isShowImporter: false,\n isFromOnline: false,\n onlineLibs: [],\n onlineSelects: [],\n questionLib: '',\n categories: [],\n loadingOnlineLibs: false,\n loadingProgress: '准备加载题库...',\n totalLibsCount: 0,\n loadedLibsCount: 0,\n loadingError: null\n }\n },\n computed: {\n selectedLibs() {\n let res = this.onlineLibs.filter(lib => this.onlineSelects.includes(lib.hashCode)).map(lib => ({...lib}));\n res.forEach(r => {\n delete r.hashCode;\n });\n return res;\n }\n },\n methods: {\n goToCategory(category) {\n this.$router.push({\n name: 'CategoryPage',\n params: { category }\n });\n },\n selectLib(lib) {\n this.onlineSelects.includes(lib.hashCode) ? (this.onlineSelects = this.onlineSelects.filter(s => s !== lib.hashCode)) : (this.onlineSelects = [...this.onlineSelects, lib.hashCode])\n this.questionLib = JSON.stringify(this.selectedLibs);\n },\n showImporter() {\n this.isShowImporter = true;\n this.isFromOnline = false;\n },\n async importFromExist() {\n this.isFromOnline = true;\n this.loadingError = null;\n await this.loadOnlineLibs();\n },\n \n async loadOnlineLibs() {\n this.loadingOnlineLibs = true;\n this.loadingProgress = '正在获取题库列表...';\n this.totalLibsCount = 0;\n this.loadedLibsCount = 0;\n \n try {\n const res = await this.fetchOnlineLib();\n this.onlineLibs = res.filter(r => r && r.data).map(r => ({\n ...r.data, hashCode: r.data.hashCode || utils.getHashCode(r.data.title + r.data.category)\n }));\n this.loadingProgress = `成功加载 ${this.onlineLibs.length} 个题库`;\n this.loadingError = null;\n } catch (e) {\n console.error('获取在线题库失败:', e);\n this.loadingError = '加载失败,请检查网络连接后重试';\n this.loadingProgress = '';\n } finally {\n this.loadingOnlineLibs = false;\n }\n },\n \n retryLoadOnlineLibs() {\n this.loadOnlineLibs();\n },\n async fetchOnlineLib() {\n try {\n // 获取题库映射文件\n this.loadingProgress = '正在获取题库列表...';\n const maps = (await this.$http.get(existsMap + \"/map.json\")).data || []\n \n if (maps.length === 0) {\n this.loadingProgress = '未找到可用题库';\n return [];\n }\n \n this.totalLibsCount = maps.length;\n this.loadedLibsCount = 0;\n this.loadingProgress = `准备并发加载 ${maps.length} 个题库...`;\n \n // 使用Promise.all并发加载所有题库文件,大幅提升加载速度\n const promises = maps.map((map, index) => {\n return this.$http.get(existsMap + \"/\" + map)\n .then(result => {\n this.loadedLibsCount++;\n this.loadingProgress = `正在并发加载题库 (${this.loadedLibsCount}/${this.totalLibsCount})`;\n return result;\n })\n .catch(error => {\n this.loadedLibsCount++;\n console.warn(`加载题库 ${map} 失败:`, error);\n this.loadingProgress = `正在并发加载题库 (${this.loadedLibsCount}/${this.totalLibsCount}) - 部分失败`;\n return null; // 某个题库加载失败时不影响其他题库\n });\n });\n \n const libs = await Promise.all(promises);\n \n // 过滤掉加载失败的题库\n const validLibs = libs.filter(lib => lib !== null);\n this.loadingProgress = `加载完成! 成功: ${validLibs.length}, 失败: ${maps.length - validLibs.length}`;\n \n return validLibs;\n } catch (error) {\n console.error('获取在线题库列表失败:', error);\n this.loadingProgress = '加载失败,请重试';\n throw error;\n }\n },\n async importLib() {\n try {\n let lib = JSON.parse(this.questionLib);\n let importCount = 0;\n \n if (lib instanceof Array) {\n const results = await Promise.all(lib.map(async l => {\n return await this.importSingleLib(l);\n }));\n importCount = results.filter(r => r).length;\n } else {\n const result = await this.importSingleLib(lib);\n importCount = result ? 1 : 0;\n }\n \n // 显示导入成功提示\n if (importCount > 0) {\n this.$toast.success(`成功导入 ${importCount} 个题库!`);\n } else {\n this.$toast.fail('未找到有效的题库数据');\n }\n \n } catch (e) {\n console.error('导入题库失败:', e);\n this.$toast.fail(`题库格式错误:${utils.getMessage(e)}`);\n }\n \n await this.initCategories(); // 刷新分类列表\n this.isShowImporter = false;\n this.questionLib = '';\n },\n async importSingleLib(lib) {\n if (!lib.questions || lib.questions.length === 0) {\n return false;\n }\n lib.questions.forEach(q=>{\n q.hashCode = q.hashCode || utils.getHashCode(q)\n })\n const bank = {\n ...lib,\n questions: lib.questions.map(q=>q.hashCode)\n }\n bank.hashCode = lib.hashCode || utils.getHashCode(bank)\n await questionDao.upsert(lib.questions)\n .then(()=>{\n return bankDao.upsert([bank]);\n })\n return true;\n },\n async initCategories() {\n await bankDao.query('hashCode').notEqual('').toArray().then(banks => {\n banks = banks.map(b => {\n b.category = b.category || 'default'\n return b\n })\n this.categories = banks.reduce((ac, item) => {\n if (!ac.includes(item.category)) {\n ac.push(item.category)\n }\n return ac\n }, [])\n })\n },\n },\n mounted() {\n this.initCategories();\n // configDao.query('key').equals('hasSync').first()\n // .then(hasSync => {\n // hasSync = !!hasSync;\n // if (!hasSync) {\n // this.syncDataToIndexDB();\n // }\n // });\n }\n}\n</script>\n\n<style scoped>\n.home-index {\n padding: 0;\n animation: fadeIn 0.6s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* 欢迎区域 */\n.welcome-section {\n margin-bottom: 24px;\n}\n\n.welcome-card {\n padding: 36px 28px;\n text-align: center;\n background: linear-gradient(135deg, #00c4a7 0%, #26a69a 50%, #4dd0e1 100%);\n color: var(--text-white);\n border: none;\n border-radius: var(--border-radius-lg);\n box-shadow: \n 0 12px 32px rgba(0, 196, 167, 0.2),\n 0 4px 16px rgba(0, 196, 167, 0.1),\n inset 0 1px 0 rgba(255, 255, 255, 0.1);\n position: relative;\n overflow: hidden;\n}\n\n.welcome-card::before {\n content: '';\n position: absolute;\n top: 0;\n left: -100%;\n width: 100%;\n height: 100%;\n background: linear-gradient(90deg, \n transparent 0%, \n rgba(255, 255, 255, 0.1) 50%, \n transparent 100%);\n animation: cardShimmer 3s ease-in-out infinite;\n z-index: 1;\n}\n\n.welcome-content {\n position: relative;\n z-index: 2;\n}\n\n@keyframes cardShimmer {\n 0% {\n left: -100%;\n }\n 50% {\n left: 100%;\n }\n 100% {\n left: 100%;\n }\n}\n\n/* 基础h2样式被.welcome-title覆盖 */\n\n.welcome-title {\n font-size: 32px !important;\n font-weight: 800 !important;\n letter-spacing: 0.8px;\n color: #ffffff !important;\n animation: titleBounceIn 0.8s cubic-bezier(0.68, -0.55, 0.265, 1.55) both;\n margin: 0 0 12px 0 !important;\n line-height: 1.2;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n\n.welcome-content p {\n margin: 0;\n font-size: 16px;\n font-weight: 500;\n color: rgba(248, 255, 254, 0.85);\n letter-spacing: 0.3px;\n animation: fadeInUp 0.8s ease-out 0.3s both;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n@keyframes fadeInUp {\n 0% {\n opacity: 0;\n transform: translateY(20px);\n }\n 100% {\n opacity: 0.95;\n transform: translateY(0);\n }\n}\n\n@keyframes titleBounceIn {\n 0% {\n opacity: 0;\n transform: scale(0.3) translateY(-50px);\n }\n 40% {\n opacity: 0.8;\n transform: scale(1.1) translateY(-10px);\n }\n 70% {\n opacity: 1;\n transform: scale(0.95) translateY(5px);\n }\n 100% {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n/* 网格样式 */\n.category-grid {\n animation: slideUp 0.6s ease-out;\n}\n\n@keyframes slideUp {\n from {\n opacity: 0;\n transform: translateY(30px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.grid-item-enhanced {\n transition: all var(--transition-normal);\n animation: gridItemAppear 0.6s ease-out both;\n}\n\n@keyframes gridItemAppear {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.9);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n.grid-item-enhanced:active {\n transform: scale(0.95);\n}\n\n.import-item .van-grid-item__content {\n background: var(--primary-gradient) !important;\n color: var(--text-white) !important;\n border-radius: var(--border-radius-md);\n box-shadow: var(--shadow-md);\n}\n\n.import-item .van-icon {\n color: var(--text-white) !important;\n}\n\n.category-item .van-grid-item__content {\n background: var(--bg-card) !important;\n border: 1px solid var(--border-light);\n border-radius: var(--border-radius-md);\n box-shadow: var(--shadow-sm);\n transition: all var(--transition-normal);\n}\n\n.category-item .van-grid-item__content:hover {\n box-shadow: var(--shadow-md);\n transform: translateY(-2px);\n}\n\n.grid-text {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n}\n\n.grid-title {\n font-weight: 600;\n font-size: 14px;\n text-align: center;;\n}\n\n.grid-subtitle {\n font-size: 12px;\n opacity: 0.7;\n}\n\n\n/* 弹窗样式 */\n.import-popup .van-popup {\n background: transparent;\n}\n\n.exam-import-box {\n width: 90vw;\n max-width: 400px;\n margin: 20px auto;\n padding: 24px;\n border-radius: var(--border-radius-lg);\n border: none;\n box-shadow: none;\n}\n\n.popup-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n padding-bottom: 16px;\n border-bottom: 1px solid var(--border-light);\n}\n\n.popup-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary);\n}\n\n.close-icon {\n font-size: 18px;\n color: var(--text-light);\n cursor: pointer;\n padding: 4px;\n border-radius: var(--border-radius-sm);\n transition: all var(--transition-fast);\n}\n\n.close-icon:active {\n background: var(--bg-secondary);\n color: var(--text-secondary);\n}\n\n/* 在线题库 */\n.online-libs-container {\n max-height: 300px;\n overflow-y: auto;\n margin-bottom: 20px;\n}\n\n.loading-container {\n text-align: center;\n padding: 40px 20px;\n color: var(--text-secondary);\n}\n\n.progress-bar {\n width: 100%;\n height: 4px;\n background: var(--bg-secondary);\n border-radius: var(--border-radius-sm);\n margin-top: 16px;\n overflow: hidden;\n}\n\n.progress-fill {\n height: 100%;\n background: var(--primary-gradient);\n border-radius: var(--border-radius-sm);\n transition: width 0.3s ease;\n}\n\n.loading-spinner {\n width: 24px;\n height: 24px;\n border: 3px solid var(--bg-secondary);\n border-top: 3px solid var(--primary-color);\n border-radius: 50%;\n animation: spin 1s linear infinite;\n margin: 0 auto 12px;\n}\n\n@keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n}\n\n.error-state {\n padding: 40px 20px;\n}\n\n.error-message {\n color: var(--error-color);\n font-size: 14px;\n margin: 12px 0 16px 0;\n}\n\n.lib-cell-group .van-cell {\n border-radius: var(--border-radius-sm);\n margin-bottom: 8px;\n border: 1px solid var(--border-light);\n transition: all var(--transition-fast);\n}\n\n.lib-cell:active {\n background: var(--bg-secondary);\n transform: scale(0.98);\n}\n\n.lib-info {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.lib-title {\n font-weight: 500;\n font-size: 14px;\n color: var(--text-primary);\n}\n\n.lib-category {\n font-size: 12px;\n color: var(--text-secondary);\n background: var(--bg-secondary);\n padding: 2px 8px;\n border-radius: var(--border-radius-sm);\n display: inline-block;\n width: fit-content;\n}\n\n/* 手动导入 */\n.manual-import {\n margin-bottom: 20px;\n}\n\n.import-field-group .van-cell {\n border-radius: var(--border-radius-sm);\n border: 1px solid var(--border-light);\n}\n\n.import-field .van-field__control {\n font-size: 12px;\n line-height: 1.4;\n}\n\n/* 弹窗按钮 */\n.popup-actions {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.action-button {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-weight: 500;\n box-shadow: var(--shadow-sm);\n}\n\n.action-button:active {\n transform: scale(0.98);\n}\n\n\n/* 全局按钮美化 */\n.van-button {\n border-radius: var(--border-radius-md) !important;\n font-weight: 500;\n transition: all var(--transition-fast) !important;\n}\n\n.van-button--primary {\n background: var(--primary-color) !important;\n border-color: var(--primary-color) !important;\n}\n\n.van-button--info {\n background: var(--info-color) !important;\n border-color: var(--info-color) !important;\n}\n\n.van-button--warning {\n background: var(--warning-color) !important;\n border-color: var(--warning-color) !important;\n}\n\n.van-button--danger {\n background: var(--error-color) !important;\n border-color: var(--error-color) !important;\n}\n\n/* 标签美化 */\n.van-tag--warning {\n background: var(--warning-color) !important;\n color: var(--text-white) !important;\n border-radius: var(--border-radius-sm) !important;\n}\n</style>\n\n\n// WEBPACK FOOTER //\n// src/components/home-pages/HomeIndex.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"home-index\"},[_vm._m(0),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"slide-up\",\"mode\":\"out-in\"}},[_c('van-grid',{staticClass:\"category-grid\",attrs:{\"column-num\":2,\"gutter\":16}},[_c('van-grid-item',{staticClass:\"grid-item-enhanced import-item\",attrs:{\"icon\":\"plus\",\"clickable\":\"\"},on:{\"click\":_vm.showImporter}},[_c('div',{staticClass:\"grid-text\",attrs:{\"slot\":\"text\"},slot:\"text\"},[_c('span',{staticClass:\"grid-title\"},[_vm._v(\"开始答题\")]),_vm._v(\" \"),_c('span',{staticClass:\"grid-subtitle\"},[_vm._v(\"导入题库\")])])]),_vm._v(\" \"),_vm._l((_vm.categories),function(category,index){return _c('van-grid-item',{key:category,staticClass:\"grid-item-enhanced category-item\",style:({ 'animation-delay': (index * 0.1) + 's' }),attrs:{\"icon\":\"notes-o\",\"clickable\":\"\"},on:{\"click\":function($event){return _vm.goToCategory(category)}}},[_c('div',{staticClass:\"grid-text\",attrs:{\"slot\":\"text\"},slot:\"text\"},[_c('span',{staticClass:\"grid-title\"},[_vm._v(_vm._s(category))]),_vm._v(\" \"),_c('span',{staticClass:\"grid-subtitle\"},[_vm._v(\"题库分类\")])])])})],2)],1),_vm._v(\" \"),_c('van-popup',{staticClass:\"import-popup\",attrs:{\"round\":\"\"},on:{\"click-overlay\":function($event){_vm.isShowImporter = false}},model:{value:(_vm.isShowImporter),callback:function ($$v) {_vm.isShowImporter=$$v},expression:\"isShowImporter\"}},[_c('div',{staticClass:\"exam-import-box theme-card\"},[_c('div',{staticClass:\"popup-header\"},[_c('h3',[_vm._v(\"导入题库\")]),_vm._v(\" \"),_c('van-icon',{staticClass:\"close-icon\",attrs:{\"name\":\"cross\"},on:{\"click\":function($event){_vm.isShowImporter = false}}})],1),_vm._v(\" \"),(_vm.isFromOnline)?_c('div',{staticClass:\"online-libs-container\"},[(_vm.loadingOnlineLibs)?_c('div',{staticClass:\"loading-container\"},[_c('div',{staticClass:\"loading-spinner\"}),_vm._v(\" \"),_c('p',[_vm._v(_vm._s(_vm.loadingProgress))]),_vm._v(\" \"),(_vm.totalLibsCount > 0)?_c('div',{staticClass:\"progress-bar\"},[_c('div',{staticClass:\"progress-fill\",style:({ width: (((_vm.loadedLibsCount / _vm.totalLibsCount) * 100) + \"%\") })})]):_vm._e()]):(_vm.loadingError)?_c('div',{staticClass:\"loading-container error-state\"},[_c('van-icon',{attrs:{\"name\":\"warning-o\",\"size\":\"32\",\"color\":\"var(--error-color)\"}}),_vm._v(\" \"),_c('p',{staticClass:\"error-message\"},[_vm._v(_vm._s(_vm.loadingError))]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"primary\",\"size\":\"small\",\"round\":\"\"},on:{\"click\":_vm.retryLoadOnlineLibs}},[_vm._v(\"\\n 重试加载\\n \")])],1):(!_vm.onlineLibs || _vm.onlineLibs.length === 0)?_c('div',{staticClass:\"loading-container\"},[_c('div',{staticClass:\"loading-spinner\"}),_vm._v(\" \"),_c('p',[_vm._v(\"准备加载题库...\")])]):_c('van-checkbox-group',{model:{value:(_vm.onlineSelects),callback:function ($$v) {_vm.onlineSelects=$$v},expression:\"onlineSelects\"}},[_c('van-cell-group',{staticClass:\"lib-cell-group\"},_vm._l((_vm.onlineLibs),function(lib,oi){return _c('van-cell',{key:oi,staticClass:\"lib-cell\",attrs:{\"clickable\":\"\"},on:{\"click\":function($event){return _vm.selectLib(lib)}}},[_c('template',{slot:\"title\"},[_c('div',{staticClass:\"lib-info\"},[_c('span',{staticClass:\"lib-title\"},[_vm._v(_vm._s(lib.title))]),_vm._v(\" \"),_c('span',{staticClass:\"lib-category\"},[_vm._v(_vm._s(lib.category || 'default'))])])]),_vm._v(\" \"),_c('van-checkbox',{attrs:{\"slot\":\"right-icon\",\"name\":lib.hashCode},slot:\"right-icon\"})],2)}),1)],1)],1):_vm._e(),_vm._v(\" \"),(!_vm.isFromOnline)?_c('div',{staticClass:\"manual-import\"},[_c('van-cell-group',{staticClass:\"import-field-group\"},[_c('van-field',{staticClass:\"import-field\",attrs:{\"label\":\"题库内容\",\"type\":\"textarea\",\"placeholder\":\"请输入JSON格式的题库数据\",\"rows\":\"8\"},model:{value:(_vm.questionLib),callback:function ($$v) {_vm.questionLib=$$v},expression:\"questionLib\"}})],1)],1):_vm._e(),_vm._v(\" \"),_c('div',{staticClass:\"popup-actions\"},[_c('van-button',{staticClass:\"theme-button action-button\",attrs:{\"type\":\"info\",\"size\":\"large\",\"block\":\"\",\"round\":\"\"},on:{\"click\":_vm.importLib}},[_c('van-icon',{attrs:{\"name\":\"plus\"}}),_vm._v(\"\\n 导入题库\\n \")],1),_vm._v(\" \"),_c('van-button',{staticClass:\"theme-button action-button\",attrs:{\"type\":\"primary\",\"size\":\"large\",\"block\":\"\",\"round\":\"\"},on:{\"click\":_vm.importFromExist}},[_c('van-icon',{attrs:{\"name\":\"cloud-o\"}}),_vm._v(\"\\n 获取在线题库\\n \")],1)],1)])])],1)}\nvar staticRenderFns = [function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"welcome-section\"},[_c('div',{staticClass:\"welcome-card theme-card\"},[_c('div',{staticClass:\"welcome-content\"},[_c('h2',{staticClass:\"gradient-text welcome-title\"},[_vm._v(\"欢迎使用答题神器\")]),_vm._v(\" \"),_c('p',[_vm._v(\"智能题库管理,轻松备考复习\")])])])])}]\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-2eda658d\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/home-pages/HomeIndex.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-2eda658d\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./HomeIndex.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./HomeIndex.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./HomeIndex.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-2eda658d\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./HomeIndex.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-2eda658d\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/home-pages/HomeIndex.vue\n// module id = null\n// module chunks = ","<template>\n <div>\n <van-button type=\"default\">默认按钮</van-button>\n <van-button type=\"primary\">主要按钮</van-button>\n <van-button type=\"info\">信息按钮</van-button>\n <van-button type=\"warning\">警告按钮</van-button>\n <van-button type=\"danger\">危险按钮</van-button>\n </div>\n</template>\n\n<script>\n import Vue from 'vue';\n import { Button } from 'vant';\n\n Vue.use(Button);\n\n export default {\n name: 'HelloWorld',\n data() {\n return {\n msg: 'Welcome to Your Vue.js App'\n }\n }\n }\n</script>\n\n\n\n// WEBPACK FOOTER //\n// src/components/HelloWorld.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('van-button',{attrs:{\"type\":\"default\"}},[_vm._v(\"默认按钮\")]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"primary\"}},[_vm._v(\"主要按钮\")]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"info\"}},[_vm._v(\"信息按钮\")]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"warning\"}},[_vm._v(\"警告按钮\")]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"danger\"}},[_vm._v(\"危险按钮\")])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-a0448bfc\",\"hasScoped\":false,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/HelloWorld.vue\n// module id = null\n// module chunks = ","var normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HelloWorld.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HelloWorld.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-a0448bfc\\\",\\\"hasScoped\\\":false,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./HelloWorld.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = null\n/* scopeId */\nvar __vue_scopeId__ = null\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/HelloWorld.vue\n// module id = null\n// module chunks = ","<template>\n <div class=\"home-page\">\n <van-nav-bar\n :title=\"activePage.label\"\n fixed\n ></van-nav-bar>\n <div class=\"is-relation page-container\">\n <transition name=\"fade\" mode=\"out-in\">\n <component :is=\"activePage.api\" :key=\"activeTabIndex\"></component>\n </transition>\n <p class=\"version-text text-align-center is-absolute\">{{version}}</p>\n </div>\n </div>\n</template>\n\n<script>\n import Vue from 'vue';\n import {NavBar} from 'vant';\n import {Tabbar, TabbarItem} from 'vant';\n import HomeIndex from \"@/components/home-pages/HomeIndex\";\n import HelloWorld from \"@/components/HelloWorld\";\n import config from \"@/config\";\n\n Vue.use(NavBar).use(Tabbar).use(TabbarItem);\n\n export default {\n name: \"HomePage\",\n data() {\n return {\n activeTabIndex: 0,\n pages: [\n {title: '主页', label: 'Home', api: HomeIndex, icon: 'home-o'},\n // {title: '搜索', label: '搜索', api: HelloWorld, icon: 'search'},\n // {title: '朋友', label: '朋友', api: HomeIndex, icon: 'friends-o'},\n // {title: '设置', label: '设置', api: HomeIndex, icon: 'setting-o'},\n ],\n }\n },\n computed: {\n activePage() {\n return this.pages[this.activeTabIndex] || {};\n },\n version() {\n return config.version;\n }\n }\n }\n</script>\n\n<style scoped>\n.home-page {\n background: var(--bg-primary);\n}\n\n.page-container {\n padding: 20px;\n padding-top: 66px; /* 46px (导航栏) + 20px (内容间距) */\n padding-bottom: 80px;\n min-height: calc(100vh - 140px);\n}\n\n.version-text {\n bottom: 80px;\n color: var(--text-light);\n font-size: 12px;\n opacity: 0.6;\n pointer-events: none;\n width: calc(100% - 40px);\n}\n\n.custom-tabbar {\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n}\n\n/* 页面切换动画 */\n.fade-enter-active, .fade-leave-active {\n transition: all var(--transition-normal);\n}\n\n.fade-enter, .fade-leave-to {\n opacity: 0;\n transform: translateY(20px);\n}\n</style>\n\n\n// WEBPACK FOOTER //\n// src/components/HomePage.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"home-page\"},[_c('van-nav-bar',{attrs:{\"title\":_vm.activePage.label,\"fixed\":\"\"}}),_vm._v(\" \"),_c('div',{staticClass:\"is-relation page-container\"},[_c('transition',{attrs:{\"name\":\"fade\",\"mode\":\"out-in\"}},[_c(_vm.activePage.api,{key:_vm.activeTabIndex,tag:\"component\"})],1),_vm._v(\" \"),_c('p',{staticClass:\"version-text text-align-center is-absolute\"},[_vm._v(_vm._s(_vm.version))])],1)],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-08264cc4\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/HomePage.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-08264cc4\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./HomePage.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HomePage.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./HomePage.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-08264cc4\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./HomePage.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-08264cc4\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/HomePage.vue\n// module id = null\n// module chunks = ","<template>\n <div ref=\"root\" class=\"exam-root\" v-finger:swipe=\"swipe\" @touchstart=\"onTouchStart\">\n <van-nav-bar\n :title=\"examInfo.title\"\n fixed\n left-arrow\n right-text=\"目录\"\n @click-left=\"handleBack\"\n @click-right=\"showAcButtons = !showAcButtons\"\n class=\"exam-nav-bar\"\n ></van-nav-bar>\n <transition name=\"fade\">\n <div class=\"ac-qn-backdrop\" v-show=\"showAcButtons\" @click.stop=\"showAcButtons = false\">\n <div class=\"exam-p-around-small ac-qn theme-card\" @click.stop>\n <div class=\"qn-header\">\n <h3>题目导航</h3>\n <span class=\"qn-progress\">{{ questionNum + 1 }} / {{ totalNum }}</span>\n </div>\n <van-row class=\"question-nav-grid\">\n <van-col span=\"4\" v-for=\"(question,i) in questionsInfo\" :key=\"i\">\n <div class=\"exam-circle exam-done theme-button\" @click=\"turnTo(i)\"\n :class=\"getQuestionNavClass(question, i)\">\n {{ i + 1 }}\n </div>\n </van-col>\n </van-row>\n </div>\n </div>\n </transition>\n <div class=\"question-container\">\n <transition :name=\"transitionName\" mode=\"out-in\">\n <div class=\"loading-item\" v-if=\"!questionsInfo[questionNum]\">\n <div class=\"question-card theme-card\">\n <div class=\"question-header\">\n <div class=\"question-title\">加载中...</div>\n <div class=\"question-desc\">正在加载题目数据</div>\n </div>\n </div>\n </div>\n <div class=\"question-item\" \n :key=\"questionNum\" v-else>\n <div class=\"question-card theme-card\">\n <div class=\"question-header\" @click=\"handleImageClick\">\n <div class=\"question-title\" v-for=\"t in getQuestionTitle(questionsInfo[questionNum])\" v-html=\"t\">\n </div>\n <div class=\"question-desc\">{{ getQuestionDesc(questionsInfo[questionNum]) }}</div>\n </div>\n <div v-if=\"questionsInfo[questionNum].isMulti\" class=\"options-container\">\n <van-checkbox-group v-model=\"questionsInfo[questionNum].answer.multi.apis\" @click.stop>\n <div class=\"option-list\">\n <div v-for=\"(option, oi) in questionsInfo[questionNum].answerOptions\"\n class=\"option-item theme-card\"\n @click=\"toggleAnswer(questionNum, option.api)\"\n :key=\"oi\"\n :class=\"{'option-selected': questionsInfo[questionNum].answer.multi.apis.includes(option.api), 'option-correct': option.isRight&&(isShowResult||(questionsInfo[questionNum].answer.isChecked&&isPractice)), 'option-incorrect': !option.isRight&&(isShowResult||(!option.isRight&&questionsInfo[questionNum].answer.isAnswered&&isPractice)) && questionsInfo[questionNum].answer.multi.apis.includes(option.api)}\">\n <div class=\"option-content\">\n <div class=\"option-label\">{{ letterIndex[oi] }}</div>\n <div class=\"option-text\" v-html=\"option.describe\" @click=\"handleImageClick\"></div>\n <van-checkbox :name=\"option.api\" :checked-color=\"getOptionColor(questionsInfo[questionNum],option)\" class=\"option-checkbox\"></van-checkbox>\n </div>\n </div>\n </div>\n </van-checkbox-group>\n </div>\n <div v-if=\"!questionsInfo[questionNum].isMulti\" class=\"options-container\">\n <van-radio-group v-model=\"questionsInfo[questionNum].answer.single.api\">\n <div class=\"option-list\">\n <div v-for=\"(option, oi) in questionsInfo[questionNum].answerOptions\"\n class=\"option-item theme-card\"\n @click=\"setAnswer(questionNum, [option.api])\"\n :key=\"oi\"\n :class=\"{'option-selected': questionsInfo[questionNum].answer.single.api === option.api, 'option-correct': option.isRight&&(isShowResult||(questionsInfo[questionNum].answer.isChecked&&isPractice)), 'option-incorrect': !option.isRight&&(isShowResult||(!option.isRight&&questionsInfo[questionNum].answer.isAnswered&&isPractice)) && questionsInfo[questionNum].answer.single.api === option.api}\">\n <div class=\"option-content\">\n <div class=\"option-label\">{{ letterIndex[oi] }}</div>\n <div class=\"option-text\" v-html=\"option.describe\" @click=\"handleImageClick\"></div>\n <van-radio :name=\"option.api\" :checked-color=\"getOptionColor(questionsInfo[questionNum],option)\" class=\"option-radio\"></van-radio>\n </div>\n </div>\n </div>\n </van-radio-group>\n </div>\n <div class=\"question-analysis\" \n v-if=\"isShowResult || !(isPractice&&!questionsInfo[questionNum].answer.isChecked)\">\n <div class=\"analysis-header\">\n <van-icon name=\"info-o\" />\n <span>题目解析</span>\n </div>\n <div class=\"analysis-content\" v-html=\"questionsInfo[questionNum].analysis || '暂无解析'\" @click=\"handleImageClick\"></div>\n </div>\n </div>\n </div>\n </transition>\n </div>\n <div class=\"ac-buttons theme-card\" v-if=\"questionsInfo[questionNum]\">\n <div class=\"button-row\">\n <van-button \n round \n v-if=\"questionNum>0\" \n @click=\"turnTo(questionNum-1)\"\n class=\"nav-button theme-button\">\n <van-icon name=\"arrow-left\" />\n 上一题\n </van-button>\n <van-button \n type=\"info\" \n round \n v-if=\"questionNum<totalNum-1\" \n @click=\"turnTo(questionNum+1)\"\n class=\"nav-button theme-button\">\n 下一题\n <van-icon name=\"arrow\" />\n </van-button>\n </div>\n <div class=\"button-row\">\n <van-button \n type=\"warning\" \n round \n block\n v-if=\"isPractice&&!questionsInfo[questionNum].answer.isChecked\"\n @click=\"checkResult(questionNum)\"\n class=\"action-button theme-button\">\n <van-icon name=\"eye-o\" />\n 检查答案\n </van-button>\n <van-button \n type=\"primary\" \n round \n block\n v-if=\"!hasSubmit\" \n @click=\"confirmSubmit\"\n class=\"submit-button theme-button pulse\">\n <van-icon name=\"success\" />\n 提交答案\n </van-button>\n </div>\n </div>\n\n <!-- 图片预览弹窗 -->\n <div v-if=\"showImagePreview\" class=\"image-preview-overlay\" @click=\"closeImagePreview\">\n <!-- 顶部控制栏 -->\n <div class=\"image-preview-controls-bar\" @click.stop>\n <van-icon name=\"minus\" class=\"control-icon\" @click=\"zoomOut\" />\n <span class=\"zoom-text\">{{ Math.round(zoomLevel * 100) }}%</span>\n <van-icon name=\"plus\" class=\"control-icon\" @click=\"zoomIn\" />\n <van-icon name=\"replay\" class=\"control-icon\" @click=\"resetZoom\" title=\"重置\" />\n <van-icon name=\"cross\" class=\"control-icon close-icon\" @click=\"closeImagePreview\" />\n </div>\n \n <!-- 图片容器 -->\n <div \n class=\"image-preview-content\" \n ref=\"imageContainer\"\n @touchstart=\"handleTouchStart\"\n @touchmove=\"handleTouchMove\"\n @touchend=\"handleTouchEnd\"\n @wheel=\"handleWheel\"\n @click.stop\n >\n <img \n :src=\"previewImageSrc\" \n :alt=\"previewImageAlt\" \n class=\"preview-image\"\n ref=\"previewImage\"\n :style=\"imageStyle\"\n @load=\"onImageLoad\"\n @dragstart.prevent\n />\n </div>\n </div>\n\n </div>\n</template>\n\n<script>\nimport Vue from 'vue';\nimport {NavBar} from 'vant';\nimport {Panel} from 'vant';\nimport {Button} from 'vant';\nimport {Cell, CellGroup} from 'vant';\nimport {RadioGroup, Radio} from 'vant';\nimport {Checkbox, CheckboxGroup} from 'vant';\nimport {Dialog} from 'vant';\nimport {Row, Col} from 'vant';\nimport {Icon} from 'vant';\nimport utils from '../../utils';\nimport {historyRecordDao, bankDao} from '../../dao'\n\nVue.use(Row).use(Col);\n// 全局注册\nVue.use(Dialog);\nVue.use(Checkbox).use(CheckboxGroup);\nVue.use(RadioGroup);\nVue.use(Radio);\nVue.use(Cell).use(CellGroup);\nVue.use(Icon);\n\nconst defaultQuestionInfo = {\n required: true,\n score: 1,\n usingScore: false,\n type: 'option', // text, number\n describe: 'Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?Do you love me?',\n answerOptions: [\n {api: 'A', describe: 'Yes', isRight: true},\n {api: 'B', describe: 'No'}\n ]\n};\n\nconst defaultExamInfo = {\n title: '试题测试',\n questions: [defaultQuestionInfo]\n};\n\nVue.use(NavBar).use(Panel).use(Button);\n\nexport default {\n name: \"DoExamPage\",\n data() {\n return {\n answers: [],\n questionNum: 0,\n isShowResult: false,\n letterIndex: [...'ABCDEFGHIJKLMNOPQRSTUVWXYZ'],\n examInfo: {},\n hasSubmit: false,\n examHashCode: 0,\n historyExams: [],\n showAcButtons: false,\n backInterceptor: null, // 返回拦截器\n transitionName: 'question-slide-right',\n previousQuestionNum: 0,\n panStartScrollTop: null, // 记录滑动开始时的scrollTop\n showImagePreview: false, // 是否显示图片预览\n previewImageSrc: '', // 预览图片地址\n previewImageAlt: '', // 预览图片描述\n \n // 图片缩放和拖拽相关\n zoomLevel: 1, // 缩放级别\n translateX: 0, // X轴位移\n translateY: 0, // Y轴位移\n initialDistance: 0, // 双指初始距离\n initialZoom: 1, // 初始缩放级别\n lastTouchX: 0, // 上次触摸X坐标\n lastTouchY: 0, // 上次触摸Y坐标\n isDragging: false, // 是否正在拖拽\n isZooming: false, // 是否正在缩放\n imageNaturalWidth: 0, // 图片原始宽度\n imageNaturalHeight: 0, // 图片原始高度\n containerWidth: 0, // 容器宽度\n containerHeight: 0 // 容器高度\n }\n },\n computed: {\n totalNum() {\n return this.questions.length;\n },\n questions() {\n return (this.examInfo.questions || []).filter(\n q => {\n return this.isReviewError ? this.historyErrorHashCodes.includes(q.hashCode) : (this.neverDo ? (!this.doneHashCodes.includes(q.hashCode)) : true)\n }\n ).map((q, i) => ({...q, active: i === this.questionNum}));\n },\n questionsInfo() {\n return this.questions.map(\n (q, i) => {\n if (!this.answers[i]) {\n this.answers[i] = {results: [{}], single: {}, multi: {apis: []}}\n }\n return {\n ...q,\n answer: this.answers[i] || {},\n orderNum: i + 1,\n isMulti: q.answerOptions.filter(opt => opt.isRight).length > 1\n }\n }\n )\n },\n historyErrorHashCodes() {\n return this.historyExams.filter(exam => exam.errorTimes > 0).map(exam => exam.hashCode);\n },\n doneHashCodes(){\n return this.historyExams.filter(exam => exam.errorTimes + exam.rightTimes > 0).map(exam => exam.hashCode);\n },\n \n // 图片样式计算\n imageStyle() {\n return {\n transform: `translate(${this.translateX}px, ${this.translateY}px) scale(${this.zoomLevel})`,\n transformOrigin: 'center center',\n transition: this.isDragging || this.isZooming ? 'none' : 'transform 0.3s ease',\n cursor: this.zoomLevel > 1 ? 'grab' : 'zoom-in',\n userSelect: 'none',\n WebkitUserSelect: 'none',\n MozUserSelect: 'none',\n msUserSelect: 'none'\n };\n }\n },\n methods: {\n handleBack() {\n // 使用全局返回管理器\n if (window.GlobalBackManager) {\n window.GlobalBackManager.goBack();\n } else {\n // 降级处理:如果全局返回管理器不存在,使用原有逻辑\n this.originalHandleBack();\n }\n },\n \n // 原有的返回处理逻辑(保留作为降级方案)\n originalHandleBack() {\n // 检查是否需要确认退出\n if (this.shouldConfirmExit()) {\n Dialog.confirm({\n title: '确认退出',\n message: '当次答题没有保存,是否确认退出?',\n confirmButtonText: '确认退出',\n cancelButtonText: '继续答题',\n confirmButtonColor: 'var(--warning-color)',\n className: 'custom-warning-dialog',\n closeOnClickOverlay: true\n }).then(() => {\n this.$router.back();\n }).catch(() => {\n // 用户取消,不执行任何操作\n });\n } else {\n // 直接返回\n this.$router.back();\n }\n },\n \n // 判断是否需要确认退出\n shouldConfirmExit() {\n // 如果已经提交答案,不需要确认\n if (this.hasSubmit) {\n return false;\n }\n \n // 检查是否至少答了一题\n const answeredCount = this.questionsInfo.filter(q => this.isQuestionAnswered(q)).length;\n return answeredCount > 0;\n },\n \n // 获取题目导航的样式类\n getQuestionNavClass(question, index) {\n let classes = {};\n \n // 当前题目\n classes['exam-current'] = this.questionNum === index;\n \n // 如果是结果显示模式或练习模式且已检查\n if (this.isShowResult || (question.answer.isChecked && this.isPractice)) {\n if (question.answer.isPass) {\n classes['exam-right'] = true; // 绿色 - 检查后正确\n } else if (question.answer.isMistake) {\n classes['exam-error'] = true; // 红色 - 检查后错误\n }\n } else {\n // 未检查状态,根据是否作答显示颜色\n if (this.isQuestionAnswered(question)) {\n classes['exam-answered'] = true; // 蓝色 - 未检查但已作答\n }\n // 未作答保持默认颜色(不添加特殊class)\n }\n \n return classes;\n },\n \n // 注册返回拦截器\n registerBackInterceptor() {\n if (window.GlobalBackManager) {\n // 创建拦截器函数\n this.backInterceptor = () => {\n // 如果图片预览弹窗打开,优先关闭弹窗\n if (this.showImagePreview) {\n this.closeImagePreview();\n return true; // 拦截返回操作\n }\n \n // 检查是否需要确认退出\n if (this.shouldConfirmExit()) {\n // 显示确认弹窗\n Dialog.confirm({\n title: '确认退出',\n message: '当次答题没有保存,是否确认退出?',\n confirmButtonText: '确认退出',\n cancelButtonText: '继续答题',\n confirmButtonColor: 'var(--warning-color)',\n className: 'custom-warning-dialog',\n closeOnClickOverlay: true\n }).then(() => {\n // 用户确认退出,移除拦截器并返回\n this.unregisterBackInterceptor();\n this.$router.back();\n }).catch(() => {\n // 用户取消,不执行任何操作\n });\n return true; // 拦截返回操作\n }\n return false; // 不拦截,继续正常返回流程\n };\n \n // 注册拦截器\n window.GlobalBackManager.addInterceptor(this.backInterceptor);\n console.log('答题页面返回拦截器已注册');\n }\n },\n \n // 移除返回拦截器\n unregisterBackInterceptor() {\n if (window.GlobalBackManager && this.backInterceptor) {\n window.GlobalBackManager.removeInterceptor(this.backInterceptor);\n this.backInterceptor = null;\n console.log('答题页面返回拦截器已移除');\n }\n },\n \n // 检查题目是否已答题\n isQuestionAnswered(question) {\n if (!question || !question.answer) return false;\n \n if (question.isMulti) {\n // 多选题:检查是否选择了至少一个选项\n return question.answer.multi && question.answer.multi.apis && question.answer.multi.apis.length > 0;\n } else {\n // 单选题:检查是否选择了选项\n return question.answer.single && question.answer.single.api;\n }\n },\n getQuestionTitle(question) {\n if (!question || !question.describe) {\n return [`(${this.questionNum + 1}/${this.totalNum})`, '加载中...'];\n }\n return [`(${this.questionNum + 1}/${this.totalNum})`, question.describe].join(' ').split('\\n');\n },\n getQuestionDesc(question) {\n if (!question) {\n return '加载中...';\n }\n let result = '';\n if (!question.required) {\n result += '(可选)'\n }\n if (question.type === 'option') {\n if (question.isMulti) {\n result += '多选题'\n } else {\n result += '单选题'\n }\n }\n let errorExam = this.historyExams.find(exam => exam.hashCode === question.hashCode);\n if (errorExam) {\n if (this.isReviewError) {\n if (errorExam.errorTimes) {\n result += ` (做错次数: ${errorExam.errorTimes})`;\n }\n }\n const totalTimes = errorExam.errorTimes + errorExam.rightTimes;\n if (totalTimes > 0) {\n result += `(历史正确率:${(errorExam.rightTimes / totalTimes * 100).toFixed(0)}%)`;\n }\n }\n return result\n },\n /**\n * @param i\n * @param api {Array}\n */\n setAnswer(i, api) {\n this.answers = [...this.answers].map((answer, ai) => {\n if (ai === i) {\n answer.results = api.map(a => ({api: a}));\n answer.single.api = api[0];\n answer.multi.apis = api;\n }\n return answer;\n });\n },\n toggleAnswer(i, api) {\n let apis = this.answers[i].multi.apis;\n if (apis.includes(api)) {\n apis = apis.filter(a => a !== api);\n } else {\n apis.push(api);\n apis = [...apis];\n }\n this.setAnswer(i, apis);\n },\n checkResult(i) {\n this.answers = [...this.answers].map((answer, ai) => {\n if (i !== ai && i != null) {\n return answer;\n }\n console.log([...this.questions], ai)\n let question = this.questions[ai];\n if (!question) {\n return answer;\n }\n let rightAnswers = question.answerOptions.filter(option => option.isRight).map(option => option.api);\n answer.results.forEach(res => {\n res.isMistake = !rightAnswers.includes(res.api);\n });\n answer.isAnswered = answer.results.filter(res => res.api).length > 0;\n if (!answer.isChecked && answer.isAnswered) {\n answer.isMistake = answer.results.length !== rightAnswers.length || !!answer.results.find(res => res.isMistake);\n answer.isPass = answer.isAnswered && !answer.isMistake;\n answer.isChecked = true;\n }\n return answer;\n })\n },\n turnTo(i) {\n const root = this.$refs.root;\n if (root) {\n root.scrollTop = 0;\n }\n \n // 设置过渡动画方向\n if (i > this.questionNum) {\n this.transitionName = 'question-slide-left';\n } else {\n this.transitionName = 'question-slide-right';\n }\n \n this.previousQuestionNum = this.questionNum;\n this.questionNum = i;\n },\n confirmSubmit() {\n // 计算答题状态\n const answeredNum = this.questionsInfo.filter(q => this.isQuestionAnswered(q)).length;\n const totalNum = this.totalNum;\n const progressRate = Math.round((answeredNum / totalNum) * 100);\n \n // 简化的弹窗内容\n const messageContent = `\n <div class=\"submit-dialog-content\">\n <div class=\"stats-row\">\n <span class=\"stat-text\">已答 <strong class=\"primary\">${answeredNum}</strong></span>\n <span class=\"stat-text\">未答 <strong class=\"secondary\">${totalNum - answeredNum}</strong></span>\n <span class=\"stat-text\">完成 <strong class=\"success\">${progressRate}%</strong></span>\n </div>\n <div class=\"progress-bar-container\">\n <div class=\"progress-bar\" style=\"width: ${progressRate}%;\"></div>\n </div>\n </div>\n `;\n\n Dialog.confirm({\n title: '📋 提交答案',\n message: messageContent,\n confirmButtonText: '确认提交',\n cancelButtonText: '继续答题',\n confirmButtonColor: 'var(--primary-color)',\n className: 'custom-submit-dialog',\n closeOnClickOverlay: true\n }).then(() => {\n this.submit();\n }).catch(e => {\n console.log(e);\n });\n },\n submit() {\n this.checkResult();\n let answeredNum = this.questionsInfo.filter(q => this.isQuestionAnswered(q)).length;\n if (answeredNum < this.totalNum && this.requireAllDone) {\n const unfinishedContent = `\n <div class=\"simple-dialog-content\">\n <div class=\"simple-message\">\n 还有 <strong class=\"warning\">${this.totalNum - answeredNum}</strong> 道题未答完\n </div>\n </div>\n `;\n Dialog.alert({\n title: '提醒',\n message: unfinishedContent,\n confirmButtonText: '继续答题',\n className: 'custom-warning-dialog',\n closeOnClickOverlay: true\n });\n return;\n }\n let rightNum = this.questionsInfo.filter(q => q.answer.isPass).length;\n let wrongNum = this.questionsInfo.filter(q => q.answer.isMistake).length;\n let rightRate = Math.round((rightNum / this.totalNum) * 100);\n \n // 录入错误信息\n let checkedQuestion = this.questionsInfo.filter(q => q.answer.isChecked);\n checkedQuestion.forEach(question => {\n historyRecordDao.queryByHashCode(question.hashCode).then(\n codeInfo => {\n if (!codeInfo) {\n codeInfo = {relatedQuestion: question.hashCode, errorTimes: 0};\n }\n if (question.answer.isPass) {\n if (isNaN(codeInfo.rightTimes)){\n codeInfo.rightTimes = 0;\n }\n codeInfo.rightTimes++;\n } else {\n if (isNaN(codeInfo.errorTimes)){\n codeInfo.errorTimes = 0;\n }\n codeInfo.errorTimes++;\n }\n console.log(codeInfo)\n historyRecordDao.upsert(codeInfo)\n .then(() => {\n console.log('做题信息已保存');\n });\n }\n );\n });\n\n // 显示答题结果\n this.isShowResult = true;\n \n // 根据正确率显示不同的emoji和评价\n let emoji = '';\n let evaluation = '';\n let dialogClass = '';\n \n if (rightRate >= 90) {\n emoji = '🎉';\n evaluation = '太棒了!';\n dialogClass = 'custom-success-dialog';\n } else if (rightRate >= 80) {\n emoji = '👏';\n evaluation = '很好!';\n dialogClass = 'custom-success-dialog';\n } else if (rightRate >= 70) {\n emoji = '👍';\n evaluation = '不错!';\n dialogClass = 'custom-warning-dialog';\n } else if (rightRate >= 60) {\n emoji = '💪';\n evaluation = '继续努力!';\n dialogClass = 'custom-warning-dialog';\n } else {\n emoji = '📚';\n evaluation = '多多练习!';\n dialogClass = 'custom-error-dialog';\n }\n \n const resultContent = `\n <div class=\"result-dialog-content\">\n <div class=\"result-score ${rightRate >= 70 ? 'success' : rightRate >= 60 ? 'warning' : 'error'}\">${rightRate}%</div>\n <div class=\"result-summary\">正确 ${rightNum}/${this.totalNum} 题</div>\n </div>\n `;\n \n Dialog.alert({\n title: '📊 答题结果',\n message: resultContent,\n confirmButtonText: '确定',\n className: dialogClass,\n closeOnClickOverlay: true\n });\n this.hasSubmit = true;\n },\n adaptExamConfig() {\n let examInfo = {...defaultExamInfo, ...this.examConfig};\n examInfo.questions = examInfo.questions.map(q => ({\n ...defaultQuestionInfo, ...q, hashCode: q.hashCode,\n answerOptions: !q.answerOptions ? [] : q.answerOptions.map(a => ({\n ...a,\n api: utils.getHashCode(a) + ''\n }))\n })).filter(q => {\n if (!q.describe || q.answerOptions.length === 0) {\n console.log('错误的题目(无描述或无答案).', q);\n return false;\n }\n // 去掉无正确答案的问题\n const checkNoAnswer = utils.groupArray(q.answerOptions, 'isRight');\n if (checkNoAnswer.length === 1 && !checkNoAnswer[0][0].isRight) {\n console.log('错误的题目(无正确答案).', q);\n return false;\n }\n // 去掉问题中重复的答案\n const checkDuplicate = utils.groupArray(q.answerOptions, 'describe');\n const resultAnswers = checkDuplicate.map(checks => {\n if (checks.length > 1) {\n const result = {...checks[0]};\n if (utils.groupArray(checks, 'isRight').length !== checks.length) {\n result.invalid = true;\n }\n return result;\n }\n return checks[0];\n });\n // 去掉答案中有重复描述且对错不一的问题\n if (resultAnswers.find(r => r.invalid)) {\n console.log('错误的题目(答案中有重复描述且对错不一).', q);\n return false;\n }\n q.answerOptions = utils.randomSort(resultAnswers);\n return true;\n });\n examInfo.questions = utils.randomSort(examInfo.questions);\n\n this.examInfo = examInfo;\n this.examHashCode = this.examConfig.hashCode;\n this.loadHistoryExamInfo();\n },\n getOptionColor(question, option) {\n if (this.isShowResult || (this.isPractice && question.answer.isChecked)) {\n return question.answer.results.map(res => res.api).includes(option.api) && option.isRight ? '#44af11' : '#cd0000'\n }\n return '#1989fa';\n },\n loadHistoryExamInfo() {\n historyRecordDao.queryMany(this.examConfig.questions.map(q => q.hashCode))\n .then(records => {\n // console.log(records.map(r => r.relatedQuestion));\n this.historyExams = records.map(r => ({...r, hashCode: r.relatedQuestion}));\n // console.log(this.historyExams);\n });\n // const errorMapKey = 'errorMap_' + this.examHashCode;\n // let errorMap = utils.storage.getItem(errorMapKey);\n // if (errorMap) {\n // this.historyExams = Object.entries(errorMap).map(([key, value]) => ({hashCode: key, ...value}));\n // }\n },\n onTouchStart: function (evt) {\n // 在触摸开始时记录scrollTop\n const root = this.$refs.root\n if (root) {\n this.panStartScrollTop = root.scrollTop\n console.log('touch开始,scrollTop:', this.panStartScrollTop)\n }\n },\n swipe: function (evt) {\n switch (evt.direction) {\n case 'Left':\n if (this.questionNum < this.totalNum - 1) {\n this.turnTo(this.questionNum + 1);\n }\n break;\n case 'Right':\n if (this.questionNum > 0) {\n this.turnTo(this.questionNum - 1);\n }\n break;\n case 'Up':\n this.showAcButtons = false\n break;\n case 'Down':\n // 需要同时检查滑动开始和结束时的scrollTop都小于等于5\n const root = this.$refs.root\n if (root) {\n const currentScrollTop = root.scrollTop\n console.log('swipe Down触发,开始scrollTop:', this.panStartScrollTop, '结束scrollTop:', currentScrollTop)\n \n // 只有当滑动开始时和结束时的scrollTop都小于等于5时才显示目录\n if (this.panStartScrollTop !== null && \n this.panStartScrollTop <= 5 && \n currentScrollTop <= 5) {\n console.log('满足条件,显示目录弹窗')\n this.showAcButtons = true\n } else {\n console.log('不满足条件,不显示目录弹窗')\n }\n }\n break\n default:\n }\n },\n \n // 处理图片点击事件\n handleImageClick(event) {\n // 检查点击的是否是图片\n if (event.target.tagName.toLowerCase() === 'img') {\n // 只有在真正点击图片时才阻止事件冒泡\n event.stopPropagation();\n \n this.showImagePreview = true;\n this.previewImageSrc = event.target.src;\n this.previewImageAlt = event.target.alt || '图片';\n \n // 为了更好的用户体验,添加轻微的震动反馈\n if (navigator.vibrate) {\n navigator.vibrate(50);\n }\n \n // 添加键盘监听\n document.addEventListener('keydown', this.handleKeyDown);\n }\n // 如果不是图片,不阻止事件冒泡,让选项正常被选中\n },\n \n // 键盘事件处理\n handleKeyDown(event) {\n if (event.key === 'Escape' && this.showImagePreview) {\n this.closeImagePreview();\n }\n },\n \n // 关闭图片预览\n closeImagePreview() {\n this.showImagePreview = false;\n this.previewImageSrc = '';\n this.previewImageAlt = '';\n \n // 重置缩放和位移\n this.resetImageTransform();\n \n // 移除键盘监听\n document.removeEventListener('keydown', this.handleKeyDown);\n },\n \n // 重置图片变换\n resetImageTransform() {\n this.zoomLevel = 1;\n this.translateX = 0;\n this.translateY = 0;\n this.isDragging = false;\n this.isZooming = false;\n },\n \n // 图片加载完成\n onImageLoad() {\n if (this.$refs.previewImage) {\n this.imageNaturalWidth = this.$refs.previewImage.naturalWidth;\n this.imageNaturalHeight = this.$refs.previewImage.naturalHeight;\n \n if (this.$refs.imageContainer) {\n this.containerWidth = this.$refs.imageContainer.clientWidth;\n this.containerHeight = this.$refs.imageContainer.clientHeight;\n }\n }\n },\n \n // 放大\n zoomIn() {\n this.zoomLevel = Math.min(this.zoomLevel * 1.2, 5);\n this.constrainImagePosition();\n },\n \n // 缩小\n zoomOut() {\n this.zoomLevel = Math.max(this.zoomLevel / 1.2, 0.1);\n this.constrainImagePosition();\n },\n \n // 重置缩放\n resetZoom() {\n this.zoomLevel = 1;\n this.translateX = 0;\n this.translateY = 0;\n },\n \n // 鼠标滚轮缩放\n handleWheel(event) {\n event.preventDefault();\n \n const delta = event.deltaY;\n const zoomFactor = delta > 0 ? 0.9 : 1.1;\n const newZoom = Math.min(Math.max(this.zoomLevel * zoomFactor, 0.1), 5);\n \n // 计算缩放中心点\n const rect = this.$refs.imageContainer.getBoundingClientRect();\n const centerX = event.clientX - rect.left - rect.width / 2;\n const centerY = event.clientY - rect.top - rect.height / 2;\n \n // 调整位移以保持缩放中心点\n const zoomChange = newZoom / this.zoomLevel;\n this.translateX = this.translateX + centerX * (1 - zoomChange);\n this.translateY = this.translateY + centerY * (1 - zoomChange);\n \n this.zoomLevel = newZoom;\n this.constrainImagePosition();\n },\n \n // 触摸开始\n handleTouchStart(event) {\n event.preventDefault();\n \n if (event.touches.length === 1) {\n // 单指拖拽\n this.isDragging = true;\n this.lastTouchX = event.touches[0].clientX;\n this.lastTouchY = event.touches[0].clientY;\n \n // 添加拖拽样式\n if (this.$refs.imageContainer) {\n this.$refs.imageContainer.classList.add('dragging');\n }\n } else if (event.touches.length === 2) {\n // 双指缩放\n this.isZooming = true;\n this.isDragging = false;\n \n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n \n this.initialDistance = this.getDistance(touch1, touch2);\n this.initialZoom = this.zoomLevel;\n \n // 移除拖拽样式\n if (this.$refs.imageContainer) {\n this.$refs.imageContainer.classList.remove('dragging');\n }\n }\n },\n \n // 触摸移动\n handleTouchMove(event) {\n event.preventDefault();\n \n if (event.touches.length === 1 && this.isDragging && this.zoomLevel > 1) {\n // 单指拖拽\n const deltaX = event.touches[0].clientX - this.lastTouchX;\n const deltaY = event.touches[0].clientY - this.lastTouchY;\n \n this.translateX += deltaX;\n this.translateY += deltaY;\n \n this.lastTouchX = event.touches[0].clientX;\n this.lastTouchY = event.touches[0].clientY;\n \n this.constrainImagePosition();\n } else if (event.touches.length === 2 && this.isZooming) {\n // 双指缩放\n const touch1 = event.touches[0];\n const touch2 = event.touches[1];\n \n const currentDistance = this.getDistance(touch1, touch2);\n const scaleChange = currentDistance / this.initialDistance;\n \n this.zoomLevel = Math.min(Math.max(this.initialZoom * scaleChange, 0.1), 5);\n this.constrainImagePosition();\n }\n },\n \n // 触摸结束\n handleTouchEnd(event) {\n event.preventDefault();\n \n if (event.touches.length < 2) {\n this.isZooming = false;\n }\n \n if (event.touches.length === 0) {\n this.isDragging = false;\n \n // 移除拖拽样式\n if (this.$refs.imageContainer) {\n this.$refs.imageContainer.classList.remove('dragging');\n }\n }\n },\n \n // 计算两点间距离\n getDistance(touch1, touch2) {\n const dx = touch1.clientX - touch2.clientX;\n const dy = touch1.clientY - touch2.clientY;\n return Math.sqrt(dx * dx + dy * dy);\n },\n \n // 约束图片位置,防止拖出边界\n constrainImagePosition() {\n if (!this.$refs.previewImage || !this.$refs.imageContainer) return;\n \n const img = this.$refs.previewImage;\n const container = this.$refs.imageContainer;\n \n // 获取图片和容器的实际尺寸\n const imgRect = img.getBoundingClientRect();\n const containerRect = container.getBoundingClientRect();\n \n // 计算缩放后的图片尺寸\n const scaledWidth = img.offsetWidth * this.zoomLevel;\n const scaledHeight = img.offsetHeight * this.zoomLevel;\n \n // 计算最大允许的位移\n const maxTranslateX = Math.max(0, (scaledWidth - containerRect.width) / 2);\n const maxTranslateY = Math.max(0, (scaledHeight - containerRect.height) / 2);\n \n // 约束位移范围\n this.translateX = Math.max(-maxTranslateX, Math.min(maxTranslateX, this.translateX));\n this.translateY = Math.max(-maxTranslateY, Math.min(maxTranslateY, this.translateY));\n }\n },\n props: {\n examConfig: {\n type: Object,\n default() {\n return defaultExamInfo;\n }\n },\n isReviewError: {\n type: Boolean,\n default: false\n },\n neverDo: {\n type: Boolean,\n default: false\n },\n isNew: {\n type: Boolean,\n default: false\n },\n requireAllDone: {\n type: Boolean,\n default: false\n },\n isPractice: {\n type: Boolean,\n default: true\n }\n },\n watch: {\n examConfig() {\n this.adaptExamConfig();\n }\n },\n mounted() {\n this.adaptExamConfig();\n console.log('开始答题');\n try {\n plus.device.setWakelock(true);\n console.log('打开屏幕常亮');\n } catch (e) {\n // ignore\n }\n // 注册返回拦截器\n this.registerBackInterceptor();\n },\n destroyed() {\n console.log('结束答题');\n try {\n plus.device.setWakelock(false);\n console.log('关闭屏幕常亮');\n } catch (e) {\n // ignore\n }\n // 移除返回拦截器\n this.unregisterBackInterceptor();\n \n // 清理键盘监听器\n document.removeEventListener('keydown', this.handleKeyDown);\n }\n}\n</script>\n\n<style scoped>\n.exam-root {\n overflow-x: hidden;\n top: 0;\n bottom: 0;\n background: var(--bg-primary);\n min-height: 100vh;\n}\n\n/* 导航栏美化 */\n.exam-nav-bar {\n background: var(--primary-gradient) !important;\n box-shadow: var(--shadow-md);\n}\n\n/* 题目导航弹窗 */\n.ac-qn-backdrop {\n position: fixed;\n top: 46px;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.6);\n z-index: 1000;\n display: flex;\n align-items: center;\n justify-content: center;\n backdrop-filter: blur(4px);\n -webkit-backdrop-filter: blur(4px);\n}\n\n.ac-qn {\n z-index: 1001;\n background: var(--bg-card);\n border-radius: var(--border-radius-lg);\n max-width: 90vw;\n max-height: 80vh;\n overflow-y: auto;\n animation: popIn 0.3s ease-out;\n}\n\n@keyframes popIn {\n from {\n opacity: 0;\n transform: scale(0.8) translateY(20px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n}\n\n.qn-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 16px;\n padding-bottom: 12px;\n border-bottom: 1px solid var(--border-light);\n}\n\n.qn-header h3 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--text-primary);\n}\n\n.qn-progress {\n font-size: 14px;\n color: var(--primary-color);\n font-weight: 500;\n background: var(--bg-secondary);\n padding: 4px 8px;\n border-radius: var(--border-radius-sm);\n}\n\n.question-nav-grid {\n gap: 8px;\n}\n\n.exam-circle {\n height: 2.5rem;\n width: 2.5rem;\n border: 2px solid var(--primary-color);\n border-radius: 50%;\n line-height: 2.1rem;\n text-align: center;\n color: var(--primary-color);\n cursor: pointer;\n margin-bottom: 8px;\n font-weight: 600;\n font-size: 14px;\n transition: all var(--transition-fast);\n position: relative;\n overflow: hidden;\n}\n\n.exam-circle:active {\n transform: scale(0.9);\n}\n\n.exam-circle.exam-error {\n color: var(--error-color);\n border-color: var(--error-color);\n animation: wobble 0.5s ease-in-out;\n}\n\n.exam-circle.exam-right {\n color: var(--success-color);\n border-color: var(--success-color);\n position: relative;\n}\n\n.exam-circle.exam-right::after {\n content: '✓';\n position: absolute;\n top: 6px;\n left: 6px;\n width: 16px;\n height: 16px;\n background: var(--success-color);\n color: white;\n border-radius: 50%;\n font-size: 10px;\n line-height: 16px;\n text-align: center;\n}\n\n.exam-circle.exam-answered {\n color: var(--info-color);\n border-color: var(--info-color);\n position: relative;\n}\n\n.exam-circle.exam-answered::after {\n content: '●';\n position: absolute;\n top: 6px;\n left: 6px;\n width: 16px;\n height: 16px;\n background: var(--info-color);\n color: white;\n border-radius: 50%;\n font-size: 8px;\n line-height: 16px;\n text-align: center;\n}\n\n.exam-circle.exam-current {\n background: var(--primary-gradient);\n color: var(--text-white);\n border-color: transparent;\n box-shadow: var(--shadow-md);\n transform: scale(1.1);\n}\n\n.exam-circle.exam-error.exam-current {\n background: var(--error-color);\n border-color: var(--error-color);\n}\n\n.exam-circle.exam-right.exam-current {\n background: var(--success-color);\n border-color: var(--success-color);\n}\n\n.exam-circle.exam-answered.exam-current {\n background: var(--info-color);\n border-color: var(--info-color);\n}\n\n/* 题目容器 */\n.question-container {\n position: relative;\n width: 100%;\n min-height: calc(100vh - 180px);\n padding-bottom: 120px;\n padding-top: 60px;\n padding-left: 16px;\n padding-right: 16px;\n}\n\n.question-item {\n width: 100%;\n padding: 0 8px;\n}\n\n.question-card {\n background: var(--bg-card);\n border-radius: var(--border-radius-lg);\n overflow: hidden;\n animation: questionSlideIn 0.5s ease-out;\n}\n\n@keyframes questionSlideIn {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n/* 题目头部 */\n.question-header {\n padding: 20px;\n background: var(--bg-secondary);\n border-bottom: 1px solid var(--border-light);\n}\n\n.question-title {\n font-size: 16px;\n font-weight: 600;\n color: var(--text-primary);\n line-height: 1.6;\n margin-bottom: 8px;\n word-break: break-word;\n white-space: break-spaces;\n}\n\n.question-desc {\n font-size: 12px;\n color: var(--text-secondary);\n background: var(--bg-card);\n padding: 6px 12px;\n border-radius: var(--border-radius-sm);\n display: inline-block;\n}\n\n/* 选项容器 */\n.options-container {\n padding: 16px;\n}\n\n.option-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.option-item {\n border: 2px solid var(--border-light);\n border-radius: var(--border-radius-md);\n transition: all var(--transition-normal);\n cursor: pointer;\n overflow: hidden;\n position: relative;\n}\n\n.option-item:active {\n transform: scale(0.98);\n}\n\n.option-item.option-selected {\n border-color: var(--primary-color);\n background: var(--bg-overlay);\n box-shadow: var(--shadow-sm);\n}\n\n.option-item.option-correct {\n border-color: var(--success-color);\n background: rgba(76, 175, 80, 0.1);\n}\n\n.option-item.option-incorrect {\n border-color: var(--error-color);\n background: rgba(244, 67, 54, 0.1);\n animation: shake 0.5s ease-in-out;\n}\n\n@keyframes shake {\n 0%, 100% { transform: translateX(0); }\n 25% { transform: translateX(-5px); }\n 75% { transform: translateX(5px); }\n}\n\n.option-content {\n display: flex;\n align-items: center;\n padding: 16px;\n gap: 12px;\n}\n\n.option-label {\n width: 32px;\n height: 32px;\n background: var(--primary-color);\n color: var(--text-white);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n font-size: 14px;\n flex-shrink: 0;\n transition: all var(--transition-fast);\n}\n\n.option-correct .option-label {\n background: var(--success-color);\n}\n\n.option-incorrect .option-label {\n background: var(--error-color);\n}\n\n.option-text {\n flex: 1;\n font-size: 14px;\n line-height: 1.6;\n color: var(--text-primary);\n word-break: break-word;\n white-space: break-spaces;\n}\n\n.option-checkbox,\n.option-radio {\n flex-shrink: 0;\n}\n\n/* 题目解析 */\n.question-analysis {\n margin: 16px;\n padding: 16px;\n background: var(--bg-secondary);\n border-radius: var(--border-radius-md);\n border-left: 4px solid var(--info-color);\n animation: analysisAppear 0.5s ease-out;\n}\n\n@keyframes analysisAppear {\n from {\n opacity: 0;\n transform: translateY(10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.analysis-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 12px;\n font-weight: 600;\n color: var(--info-color);\n font-size: 14px;\n}\n\n.analysis-content {\n font-size: 14px;\n line-height: 1.6;\n color: var(--text-secondary);\n word-break: break-word;\n white-space: break-spaces;\n}\n\n/* 底部按钮区域 */\n.ac-buttons {\n position: fixed;\n bottom: 0;\n left: 0;\n right: 0;\n padding: 16px;\n background: var(--bg-card);\n box-shadow: 0 -4px 20px rgba(0, 196, 167, 0.15);\n border-top: 1px solid var(--border-light);\n z-index: 100;\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n}\n\n.button-row {\n display: flex;\n gap: 12px;\n margin-bottom: 8px;\n}\n\n.button-row:last-child {\n margin-bottom: 0;\n}\n\n.nav-button {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n font-weight: 500;\n box-shadow: var(--shadow-sm);\n}\n\n.action-button,\n.submit-button {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n font-weight: 600;\n font-size: 16px;\n height: 48px;\n box-shadow: var(--shadow-md);\n}\n\n.submit-button {\n background: var(--primary-gradient) !important;\n border: none;\n position: relative;\n overflow: hidden;\n}\n\n.submit-button::before {\n content: '';\n position: absolute;\n top: 0;\n left: -100%;\n width: 100%;\n height: 100%;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);\n transition: left 0.6s;\n}\n\n.submit-button:active::before {\n left: 100%;\n}\n\n/* 全局美化 */\n.van-cell {\n border-radius: var(--border-radius-sm) !important;\n margin-bottom: 4px;\n border: 1px solid var(--border-light);\n}\n\n.van-checkbox,\n.van-radio {\n margin-right: 0 !important;\n}\n\n.van-checkbox__icon--checked,\n.van-radio__icon--checked {\n background-color: var(--primary-color) !important;\n border-color: var(--primary-color) !important;\n}\n\n/* 过渡动画 */\n.fade-enter-active, .fade-leave-active {\n transition: all var(--transition-normal);\n}\n\n.fade-enter, .fade-leave-to {\n opacity: 0;\n transform: scale(0.9);\n}\n\n/* 题目切换动画 - 向左滑动 (下一题) */\n.question-slide-left-enter-active,\n.question-slide-left-leave-active {\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.question-slide-left-enter {\n opacity: 0;\n transform: translateX(100px);\n}\n\n.question-slide-left-leave-to {\n opacity: 0;\n transform: translateX(-100px);\n}\n\n/* 题目切换动画 - 向右滑动 (上一题) */\n.question-slide-right-enter-active,\n.question-slide-right-leave-active {\n transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.question-slide-right-enter {\n opacity: 0;\n transform: translateX(-100px);\n}\n\n.question-slide-right-leave-to {\n opacity: 0;\n transform: translateX(100px);\n}\n\n.question-item {\n padding: 0 4px;\n margin: 10px 0 50px 0;\n}\n\n/* 图片预览弹窗样式 */\n.image-preview-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.95);\n z-index: 2000;\n animation: fadeIn 0.3s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* 顶部控制栏 */\n.image-preview-controls-bar {\n position: fixed;\n top: 20px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: 16px;\n background: rgba(255, 255, 255, 0.95);\n backdrop-filter: blur(10px);\n -webkit-backdrop-filter: blur(10px);\n padding: 12px 20px;\n border-radius: 50px;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n z-index: 2001;\n animation: slideDown 0.3s ease-out;\n}\n\n@keyframes slideDown {\n from {\n opacity: 0;\n transform: translateX(-50%) translateY(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n}\n\n.control-icon {\n font-size: 20px;\n color: #333;\n cursor: pointer;\n padding: 8px;\n border-radius: 50%;\n transition: all var(--transition-fast);\n background: transparent;\n border: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n}\n\n.control-icon:hover {\n background: rgba(0, 0, 0, 0.1);\n transform: scale(1.1);\n}\n\n.control-icon:active {\n transform: scale(0.95);\n}\n\n.close-icon {\n color: #ff4757;\n font-size: 22px;\n}\n\n.close-icon:hover {\n background: rgba(255, 71, 87, 0.1);\n}\n\n.zoom-text {\n font-size: 14px;\n color: #333;\n font-weight: 600;\n min-width: 50px;\n text-align: center;\n background: rgba(0, 0, 0, 0.05);\n padding: 6px 12px;\n border-radius: 20px;\n border: none;\n}\n\n/* 图片容器 - 全屏无边框 */\n.image-preview-content {\n position: fixed;\n top: 0;\n left: 0;\n width: 100vw;\n height: 100vh;\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: hidden;\n touch-action: none; /* 禁用默认触摸行为 */\n user-select: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n.preview-image {\n max-width: none; /* 移除宽度限制 */\n max-height: none; /* 移除高度限制 */\n width: auto;\n height: auto;\n object-fit: contain;\n pointer-events: none; /* 防止图片自身的拖拽 */\n border-radius: 0; /* 无边框 */\n box-shadow: none; /* 无阴影 */\n}\n\n/* 当图片被缩放时的拖拽光标 */\n.image-preview-content.dragging {\n cursor: grabbing !important;\n}\n\n.image-preview-content.dragging .preview-image {\n cursor: grabbing !important;\n}\n\n/* 为图片添加点击提示样式 */\n.question-title img,\n.option-text img,\n.analysis-content img {\n cursor: pointer;\n border-radius: var(--border-radius-sm);\n transition: all var(--transition-fast);\n border: 2px solid transparent;\n}\n\n.question-title img:hover,\n.option-text img:hover,\n.analysis-content img:hover {\n border-color: var(--primary-color);\n box-shadow: 0 2px 8px rgba(0, 196, 167, 0.3);\n transform: scale(1.02);\n}\n\n.question-title img:active,\n.option-text img:active,\n.analysis-content img:active {\n transform: scale(0.98);\n}\n\n/* 响应式设计 */\n@media (max-width: 768px) {\n .question-container {\n padding-left: 8px;\n padding-right: 8px;\n }\n \n .question-item {\n padding: 0 4px;\n }\n \n .exam-circle {\n height: 2rem;\n width: 2rem;\n line-height: 1.6rem;\n font-size: 12px;\n }\n \n .option-content {\n padding: 12px;\n }\n \n .option-label {\n width: 28px;\n height: 28px;\n font-size: 12px;\n }\n \n /* 移动端控制栏优化 */\n .image-preview-controls-bar {\n top: 10px;\n padding: 8px 16px;\n gap: 12px;\n border-radius: 40px;\n }\n \n .control-icon {\n font-size: 18px;\n padding: 6px;\n width: 36px;\n height: 36px;\n }\n \n .close-icon {\n font-size: 20px;\n }\n \n .zoom-text {\n font-size: 12px;\n min-width: 45px;\n padding: 4px 8px;\n border-radius: 18px;\n }\n \n /* 移动端触摸优化 */\n .image-preview-content {\n -webkit-overflow-scrolling: touch;\n }\n \n /* 防止移动端双击缩放页面 */\n .image-preview-overlay {\n touch-action: manipulation;\n }\n}\n</style>\n\n\n// WEBPACK FOOTER //\n// src/components/exam/DoExamPage.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{directives:[{name:\"finger\",rawName:\"v-finger:swipe\",value:(_vm.swipe),expression:\"swipe\",arg:\"swipe\"}],ref:\"root\",staticClass:\"exam-root\",on:{\"touchstart\":_vm.onTouchStart}},[_c('van-nav-bar',{staticClass:\"exam-nav-bar\",attrs:{\"title\":_vm.examInfo.title,\"fixed\":\"\",\"left-arrow\":\"\",\"right-text\":\"目录\"},on:{\"click-left\":_vm.handleBack,\"click-right\":function($event){_vm.showAcButtons = !_vm.showAcButtons}}}),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"fade\"}},[_c('div',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.showAcButtons),expression:\"showAcButtons\"}],staticClass:\"ac-qn-backdrop\",on:{\"click\":function($event){$event.stopPropagation();_vm.showAcButtons = false}}},[_c('div',{staticClass:\"exam-p-around-small ac-qn theme-card\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('div',{staticClass:\"qn-header\"},[_c('h3',[_vm._v(\"题目导航\")]),_vm._v(\" \"),_c('span',{staticClass:\"qn-progress\"},[_vm._v(_vm._s(_vm.questionNum + 1)+\" / \"+_vm._s(_vm.totalNum))])]),_vm._v(\" \"),_c('van-row',{staticClass:\"question-nav-grid\"},_vm._l((_vm.questionsInfo),function(question,i){return _c('van-col',{key:i,attrs:{\"span\":\"4\"}},[_c('div',{staticClass:\"exam-circle exam-done theme-button\",class:_vm.getQuestionNavClass(question, i),on:{\"click\":function($event){return _vm.turnTo(i)}}},[_vm._v(\"\\n \"+_vm._s(i + 1)+\"\\n \")])])}),1)],1)])]),_vm._v(\" \"),_c('div',{staticClass:\"question-container\"},[_c('transition',{attrs:{\"name\":_vm.transitionName,\"mode\":\"out-in\"}},[(!_vm.questionsInfo[_vm.questionNum])?_c('div',{staticClass:\"loading-item\"},[_c('div',{staticClass:\"question-card theme-card\"},[_c('div',{staticClass:\"question-header\"},[_c('div',{staticClass:\"question-title\"},[_vm._v(\"加载中...\")]),_vm._v(\" \"),_c('div',{staticClass:\"question-desc\"},[_vm._v(\"正在加载题目数据\")])])])]):_c('div',{key:_vm.questionNum,staticClass:\"question-item\"},[_c('div',{staticClass:\"question-card theme-card\"},[_c('div',{staticClass:\"question-header\",on:{\"click\":_vm.handleImageClick}},[_vm._l((_vm.getQuestionTitle(_vm.questionsInfo[_vm.questionNum])),function(t){return _c('div',{staticClass:\"question-title\",domProps:{\"innerHTML\":_vm._s(t)}})}),_vm._v(\" \"),_c('div',{staticClass:\"question-desc\"},[_vm._v(_vm._s(_vm.getQuestionDesc(_vm.questionsInfo[_vm.questionNum])))])],2),_vm._v(\" \"),(_vm.questionsInfo[_vm.questionNum].isMulti)?_c('div',{staticClass:\"options-container\"},[_c('van-checkbox-group',{on:{\"click\":function($event){$event.stopPropagation();}},model:{value:(_vm.questionsInfo[_vm.questionNum].answer.multi.apis),callback:function ($$v) {_vm.$set(_vm.questionsInfo[_vm.questionNum].answer.multi, \"apis\", $$v)},expression:\"questionsInfo[questionNum].answer.multi.apis\"}},[_c('div',{staticClass:\"option-list\"},_vm._l((_vm.questionsInfo[_vm.questionNum].answerOptions),function(option,oi){return _c('div',{key:oi,staticClass:\"option-item theme-card\",class:{'option-selected': _vm.questionsInfo[_vm.questionNum].answer.multi.apis.includes(option.api), 'option-correct': option.isRight&&(_vm.isShowResult||(_vm.questionsInfo[_vm.questionNum].answer.isChecked&&_vm.isPractice)), 'option-incorrect': !option.isRight&&(_vm.isShowResult||(!option.isRight&&_vm.questionsInfo[_vm.questionNum].answer.isAnswered&&_vm.isPractice)) && _vm.questionsInfo[_vm.questionNum].answer.multi.apis.includes(option.api)},on:{\"click\":function($event){return _vm.toggleAnswer(_vm.questionNum, option.api)}}},[_c('div',{staticClass:\"option-content\"},[_c('div',{staticClass:\"option-label\"},[_vm._v(_vm._s(_vm.letterIndex[oi]))]),_vm._v(\" \"),_c('div',{staticClass:\"option-text\",domProps:{\"innerHTML\":_vm._s(option.describe)},on:{\"click\":_vm.handleImageClick}}),_vm._v(\" \"),_c('van-checkbox',{staticClass:\"option-checkbox\",attrs:{\"name\":option.api,\"checked-color\":_vm.getOptionColor(_vm.questionsInfo[_vm.questionNum],option)}})],1)])}),0)])],1):_vm._e(),_vm._v(\" \"),(!_vm.questionsInfo[_vm.questionNum].isMulti)?_c('div',{staticClass:\"options-container\"},[_c('van-radio-group',{model:{value:(_vm.questionsInfo[_vm.questionNum].answer.single.api),callback:function ($$v) {_vm.$set(_vm.questionsInfo[_vm.questionNum].answer.single, \"api\", $$v)},expression:\"questionsInfo[questionNum].answer.single.api\"}},[_c('div',{staticClass:\"option-list\"},_vm._l((_vm.questionsInfo[_vm.questionNum].answerOptions),function(option,oi){return _c('div',{key:oi,staticClass:\"option-item theme-card\",class:{'option-selected': _vm.questionsInfo[_vm.questionNum].answer.single.api === option.api, 'option-correct': option.isRight&&(_vm.isShowResult||(_vm.questionsInfo[_vm.questionNum].answer.isChecked&&_vm.isPractice)), 'option-incorrect': !option.isRight&&(_vm.isShowResult||(!option.isRight&&_vm.questionsInfo[_vm.questionNum].answer.isAnswered&&_vm.isPractice)) && _vm.questionsInfo[_vm.questionNum].answer.single.api === option.api},on:{\"click\":function($event){return _vm.setAnswer(_vm.questionNum, [option.api])}}},[_c('div',{staticClass:\"option-content\"},[_c('div',{staticClass:\"option-label\"},[_vm._v(_vm._s(_vm.letterIndex[oi]))]),_vm._v(\" \"),_c('div',{staticClass:\"option-text\",domProps:{\"innerHTML\":_vm._s(option.describe)},on:{\"click\":_vm.handleImageClick}}),_vm._v(\" \"),_c('van-radio',{staticClass:\"option-radio\",attrs:{\"name\":option.api,\"checked-color\":_vm.getOptionColor(_vm.questionsInfo[_vm.questionNum],option)}})],1)])}),0)])],1):_vm._e(),_vm._v(\" \"),(_vm.isShowResult || !(_vm.isPractice&&!_vm.questionsInfo[_vm.questionNum].answer.isChecked))?_c('div',{staticClass:\"question-analysis\"},[_c('div',{staticClass:\"analysis-header\"},[_c('van-icon',{attrs:{\"name\":\"info-o\"}}),_vm._v(\" \"),_c('span',[_vm._v(\"题目解析\")])],1),_vm._v(\" \"),_c('div',{staticClass:\"analysis-content\",domProps:{\"innerHTML\":_vm._s(_vm.questionsInfo[_vm.questionNum].analysis || '暂无解析')},on:{\"click\":_vm.handleImageClick}})]):_vm._e()])])])],1),_vm._v(\" \"),(_vm.questionsInfo[_vm.questionNum])?_c('div',{staticClass:\"ac-buttons theme-card\"},[_c('div',{staticClass:\"button-row\"},[(_vm.questionNum>0)?_c('van-button',{staticClass:\"nav-button theme-button\",attrs:{\"round\":\"\"},on:{\"click\":function($event){return _vm.turnTo(_vm.questionNum-1)}}},[_c('van-icon',{attrs:{\"name\":\"arrow-left\"}}),_vm._v(\"\\n 上一题\\n \")],1):_vm._e(),_vm._v(\" \"),(_vm.questionNum<_vm.totalNum-1)?_c('van-button',{staticClass:\"nav-button theme-button\",attrs:{\"type\":\"info\",\"round\":\"\"},on:{\"click\":function($event){return _vm.turnTo(_vm.questionNum+1)}}},[_vm._v(\"\\n 下一题\\n \"),_c('van-icon',{attrs:{\"name\":\"arrow\"}})],1):_vm._e()],1),_vm._v(\" \"),_c('div',{staticClass:\"button-row\"},[(_vm.isPractice&&!_vm.questionsInfo[_vm.questionNum].answer.isChecked)?_c('van-button',{staticClass:\"action-button theme-button\",attrs:{\"type\":\"warning\",\"round\":\"\",\"block\":\"\"},on:{\"click\":function($event){return _vm.checkResult(_vm.questionNum)}}},[_c('van-icon',{attrs:{\"name\":\"eye-o\"}}),_vm._v(\"\\n 检查答案\\n \")],1):_vm._e(),_vm._v(\" \"),(!_vm.hasSubmit)?_c('van-button',{staticClass:\"submit-button theme-button pulse\",attrs:{\"type\":\"primary\",\"round\":\"\",\"block\":\"\"},on:{\"click\":_vm.confirmSubmit}},[_c('van-icon',{attrs:{\"name\":\"success\"}}),_vm._v(\"\\n 提交答案\\n \")],1):_vm._e()],1)]):_vm._e(),_vm._v(\" \"),(_vm.showImagePreview)?_c('div',{staticClass:\"image-preview-overlay\",on:{\"click\":_vm.closeImagePreview}},[_c('div',{staticClass:\"image-preview-controls-bar\",on:{\"click\":function($event){$event.stopPropagation();}}},[_c('van-icon',{staticClass:\"control-icon\",attrs:{\"name\":\"minus\"},on:{\"click\":_vm.zoomOut}}),_vm._v(\" \"),_c('span',{staticClass:\"zoom-text\"},[_vm._v(_vm._s(Math.round(_vm.zoomLevel * 100))+\"%\")]),_vm._v(\" \"),_c('van-icon',{staticClass:\"control-icon\",attrs:{\"name\":\"plus\"},on:{\"click\":_vm.zoomIn}}),_vm._v(\" \"),_c('van-icon',{staticClass:\"control-icon\",attrs:{\"name\":\"replay\",\"title\":\"重置\"},on:{\"click\":_vm.resetZoom}}),_vm._v(\" \"),_c('van-icon',{staticClass:\"control-icon close-icon\",attrs:{\"name\":\"cross\"},on:{\"click\":_vm.closeImagePreview}})],1),_vm._v(\" \"),_c('div',{ref:\"imageContainer\",staticClass:\"image-preview-content\",on:{\"touchstart\":_vm.handleTouchStart,\"touchmove\":_vm.handleTouchMove,\"touchend\":_vm.handleTouchEnd,\"wheel\":_vm.handleWheel,\"click\":function($event){$event.stopPropagation();}}},[_c('img',{ref:\"previewImage\",staticClass:\"preview-image\",style:(_vm.imageStyle),attrs:{\"src\":_vm.previewImageSrc,\"alt\":_vm.previewImageAlt},on:{\"load\":_vm.onImageLoad,\"dragstart\":function($event){$event.preventDefault();}}})])]):_vm._e()],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5ea31c9a\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/exam/DoExamPage.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-5ea31c9a\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../../node_modules/vue-loader/lib/selector?type=styles&index=0!./DoExamPage.vue\")\n}\nvar normalizeComponent = require(\"!../../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./DoExamPage.vue\"\nimport __vue_script__ from \"!!babel-loader!../../../node_modules/vue-loader/lib/selector?type=script&index=0!./DoExamPage.vue\"\n/* template */\nimport __vue_template__ from \"!!../../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5ea31c9a\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../../node_modules/vue-loader/lib/selector?type=template&index=0!./DoExamPage.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-5ea31c9a\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/exam/DoExamPage.vue\n// module id = null\n// module chunks = ","<template>\n <div class=\"category-page\">\n <van-nav-bar\n :title=\"categoryTitle\"\n fixed\n left-arrow\n @click-left=\"handleBack\"\n class=\"category-nav-bar\"\n ></van-nav-bar>\n \n <div class=\"category-container\">\n <div class=\"category-header\">\n <h2 class=\"gradient-text\">{{ categoryName }}</h2>\n <p class=\"category-desc\">共 {{ examList.length }} 个题库</p>\n </div>\n\n <transition name=\"slide-up\">\n <van-grid :column-num=\"1\" :gutter=\"12\" class=\"exam-grid\" v-if=\"examList.length > 0\">\n <van-grid-item\n v-for=\"(exam, index) in examList\"\n :key=\"exam.hashCode\"\n clickable\n @click=\"showOption(exam)\"\n class=\"exam-item-card\"\n :style=\"{ 'animation-delay': (index * 0.05) + 's' }\">\n <div class=\"exam-card-content\">\n <div class=\"exam-icon\">\n <van-icon name=\"notes-o\" size=\"24\" :color=\"exam.hasHistoryError ? 'var(--warning-color)' : 'var(--primary-color)'\" />\n </div>\n <div class=\"exam-info\">\n <h3 class=\"exam-title\">{{ exam.title }}</h3>\n <p class=\"exam-meta\">题目数量: {{ exam.questions ? exam.questions.length : 0 }}</p>\n <div class=\"exam-status\" v-if=\"exam.hasHistoryError\">\n <van-tag type=\"warning\" size=\"mini\">有错题</van-tag>\n </div>\n </div>\n <div class=\"exam-arrow\">\n <van-icon name=\"arrow\" />\n </div>\n </div>\n </van-grid-item>\n </van-grid>\n \n <div v-else class=\"empty-state\">\n <div class=\"empty-icon\">\n <van-icon name=\"warning-o\" size=\"48\" color=\"var(--text-light)\" />\n </div>\n <p class=\"empty-text\">该分类下暂无题库</p>\n <van-button type=\"primary\" round @click=\"$router.push('/')\">\n 返回首页\n </van-button>\n </div>\n </transition>\n </div>\n\n <!-- 答题选项弹窗 -->\n <van-popup v-model=\"isShowOption\" position=\"bottom\" round class=\"option-popup\" @click-overlay=\"isShowOption = false\">\n <div class=\"exam-options\">\n <div class=\"popup-header\">\n <div class=\"header-info\">\n <h3>选择答题模式</h3>\n <p class=\"exam-title\">{{ currentExam.title }}</p>\n </div>\n <van-icon name=\"cross\" @click=\"isShowOption = false\" class=\"close-icon\" />\n </div>\n <div class=\"option-grid\">\n <div class=\"option-item\" \n :class=\"{ disabled: getUndoneCounts() === 0 }\"\n @click=\"getUndoneCounts() > 0 && doExam(optionInfo.hashCode, false, true)\">\n <div class=\"option-icon new\">\n <van-icon name=\"edit\" />\n </div>\n <div class=\"option-info\">\n <span class=\"option-title\">未做题</span>\n <span class=\"option-count\">{{ getUndoneCounts() }}题</span>\n </div>\n </div>\n <div class=\"option-item primary\" \n :class=\"{ disabled: getTotalCounts() === 0 }\"\n @click=\"getTotalCounts() > 0 && doExam(optionInfo.hashCode)\">\n <div class=\"option-icon\">\n <van-icon name=\"replay\" />\n </div>\n <div class=\"option-info\">\n <span class=\"option-title\">重新测试</span>\n <span class=\"option-count\">{{ getTotalCounts() }}题</span>\n </div>\n </div>\n <div class=\"option-item warning\" \n :class=\"{ disabled: getErrorCounts() === 0 }\"\n @click=\"getErrorCounts() > 0 && doExam(optionInfo.hashCode, true)\">\n <div class=\"option-icon\">\n <van-icon name=\"question-o\" />\n </div>\n <div class=\"option-info\">\n <span class=\"option-title\">复习错题</span>\n <span class=\"option-count\">{{ getErrorCounts() }}题</span>\n </div>\n </div>\n <div class=\"option-item danger\" @click=\"clearHistory(optionInfo.hashCode)\">\n <div class=\"option-icon\">\n <van-icon name=\"delete-o\" />\n </div>\n <div class=\"option-info\">\n <span class=\"option-title\">清空记录</span>\n <span class=\"option-count\">重置</span>\n </div>\n </div>\n </div>\n </div>\n </van-popup>\n </div>\n</template>\n\n<script>\nimport Vue from 'vue';\nimport {NavBar} from 'vant';\nimport {Grid, GridItem} from 'vant';\nimport {Popup} from 'vant';\nimport {Button} from 'vant';\nimport {Dialog} from 'vant';\nimport {Tag} from 'vant';\nimport {Icon} from 'vant';\nimport {questionDao, historyRecordDao, bankDao} from '../dao';\n\nVue.use(NavBar);\nVue.use(Grid).use(GridItem);\nVue.use(Popup);\nVue.use(Button);\nVue.use(Dialog);\nVue.use(Tag);\nVue.use(Icon);\n\nexport default {\n name: \"CategoryPage\",\n data() {\n return {\n examList: [],\n isShowOption: false,\n optionInfo: {\n hashCode: ''\n },\n currentExam: {},\n historyRecords: []\n }\n },\n computed: {\n categoryName() {\n return this.$route.params.category || 'default';\n },\n categoryTitle() {\n return this.categoryName === 'default' ? '默认分类' : this.categoryName;\n }\n },\n methods: {\n // 处理返回操作\n handleBack() {\n // 使用全局返回管理器\n if (window.GlobalBackManager) {\n window.GlobalBackManager.goBack();\n } else {\n // 降级处理:如果全局返回管理器不存在,使用原有逻辑\n this.$router.back();\n }\n },\n async loadCategoryExams() {\n const category = this.categoryName;\n \n try {\n const banks = await bankDao.query('hashCode').notEqual('').toArray();\n \n // 过滤出当前分类的题库\n const filteredBanks = banks.filter(bank => {\n const bankCategory = bank.category || 'default';\n return bankCategory === category;\n });\n \n // 排序\n filteredBanks.sort((a, b) => {\n return a.title.split('').reduce((a, b) => a + b.charCodeAt(0), 0) - \n b.title.split('').reduce((a, b) => a + b.charCodeAt(0), 0);\n });\n \n // 获取历史记录\n const promises = filteredBanks.map(bank => {\n return historyRecordDao.query('relatedQuestion').anyOf(bank.questions).sortBy('createDate')\n .then(records => {\n const errorMap = Object.fromEntries(records.map(record => [record.relatedQuestion, {\n ...record, times: record.errorTimes\n }]));\n const hasHistoryError = !!Object.values(errorMap).find(q => q.times > 0);\n return {...bank, errorMap, hasHistoryError}\n });\n });\n \n this.examList = await Promise.all(promises);\n } catch (error) {\n console.error('加载分类题库失败:', error);\n this.examList = [];\n }\n },\n \n async showOption(exam) {\n if (exam.hasHistoryError) {\n this.optionInfo.hashCode = exam.hashCode;\n this.currentExam = exam;\n \n // 加载历史记录用于计算题目数量\n try {\n const records = await historyRecordDao.queryMany(exam.questions || []);\n this.historyRecords = records;\n } catch (error) {\n console.error('加载历史记录失败:', error);\n this.historyRecords = [];\n }\n \n this.isShowOption = true;\n } else {\n this.doExam(exam.hashCode);\n }\n },\n \n // 获取总题目数量\n getTotalCounts() {\n return this.currentExam.questions ? this.currentExam.questions.length : 0;\n },\n \n // 获取错题数量\n getErrorCounts() {\n if (!this.currentExam.questions || !this.historyRecords.length) return 0;\n return this.historyRecords.filter(record => record.errorTimes > 0).length;\n },\n \n // 获取未做题数量\n getUndoneCounts() {\n if (!this.currentExam.questions || !this.historyRecords.length) {\n return this.getTotalCounts();\n }\n const doneQuestions = this.historyRecords.filter(record => \n (record.errorTimes || 0) + (record.rightTimes || 0) > 0\n ).length;\n return this.getTotalCounts() - doneQuestions;\n },\n \n doExam(hashCode, isReviewError = false, neverDo = false) {\n this.isShowOption = false; // 关闭弹窗\n bankDao.query('hashCode').equals(hashCode).first()\n .then(exam => {\n return Promise.all([exam, ...exam.questions.map(q => questionDao.query('hashCode').equals(q).first())])\n })\n .then(([exam, ...questions]) => {\n exam.questions = questions;\n if (!exam) {\n Dialog.alert({message: '该题库已失效!'});\n return;\n }\n this.$router.push({\n name: 'DoExamPage',\n params: {\n examConfig: exam,\n isReviewError,\n neverDo\n }\n })\n });\n },\n \n clearHistory(hashCode) {\n this.isShowOption = false; // 先关闭弹窗\n bankDao.queryByHashCode(hashCode)\n .then(bankDao => {\n bankDao = bankDao || {};\n return historyRecordDao.delete(bankDao.questions || []);\n }).then(() => {\n console.log('remove the history.');\n this.loadCategoryExams(); // 重新加载数据\n }\n );\n }\n },\n \n async mounted() {\n await this.loadCategoryExams();\n },\n \n // 监听路由参数变化\n watch: {\n '$route.params.category': {\n handler() {\n this.loadCategoryExams();\n },\n immediate: false\n }\n }\n}\n</script>\n\n<style scoped>\n.category-page {\n background: var(--bg-primary);\n min-height: 100vh;\n}\n\n.category-nav-bar {\n background: var(--primary-gradient) !important;\n box-shadow: var(--shadow-md);\n}\n\n.category-container {\n padding: 66px 16px 20px 16px; /* 46px (导航栏) + 20px (顶部间距) */\n animation: fadeIn 0.6s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: translateY(20px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n\n.category-header {\n text-align: center;\n margin-bottom: 24px;\n padding: 20px;\n background: var(--bg-card);\n border-radius: var(--border-radius-lg);\n box-shadow: var(--shadow-sm);\n}\n\n.category-header h2 {\n margin: 0 0 8px 0;\n font-size: 24px;\n font-weight: 600;\n}\n\n.category-desc {\n margin: 0;\n color: var(--text-secondary);\n font-size: 14px;\n}\n\n/* 考试列表样式 */\n.exam-grid .van-grid-item {\n padding: 0 !important;\n}\n\n.exam-item-card {\n animation: examItemAppear 0.5s ease-out both;\n}\n\n@keyframes examItemAppear {\n from {\n opacity: 0;\n transform: translateX(-20px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n\n.exam-card-content {\n display: flex;\n align-items: center;\n padding: 0 16px;\n width: 100%;\n}\n\n.exam-icon {\n margin-right: 12px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n background: var(--bg-secondary);\n border-radius: var(--border-radius-sm);\n}\n\n.exam-info {\n flex: 1;\n min-width: 0;\n}\n\n.exam-title {\n margin: 0 0 4px 0;\n font-size: 16px;\n font-weight: 600;\n color: var(--text-primary);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.exam-meta {\n margin: 0 0 4px 0;\n font-size: 12px;\n color: var(--text-secondary);\n}\n\n.exam-status {\n margin-top: 4px;\n}\n\n.exam-arrow {\n color: var(--text-light);\n margin-left: 8px;\n}\n\n/* 空状态 */\n.empty-state {\n text-align: center;\n padding: 60px 20px;\n color: var(--text-secondary);\n}\n\n.empty-icon {\n margin-bottom: 16px;\n}\n\n.empty-text {\n margin: 0 0 24px 0;\n font-size: 16px;\n color: var(--text-secondary);\n}\n\n/* 弹窗样式 */\n.option-popup .van-popup {\n background: transparent;\n}\n\n.exam-options {\n width: 90vw;\n max-width: 380px;\n margin: 16px auto;\n padding: 20px;\n border-radius: var(--border-radius-lg);\n background: var(--bg-card);\n}\n\n.popup-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 16px;\n padding-bottom: 12px;\n border-bottom: 1px solid var(--border-light);\n}\n\n.header-info h3 {\n margin: 0 0 4px 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--text-primary);\n}\n\n.exam-title {\n margin: 0;\n font-size: 14px;\n color: var(--text-secondary);\n font-weight: normal;\n}\n\n.close-icon {\n font-size: 18px;\n color: var(--text-light);\n cursor: pointer;\n padding: 4px;\n border-radius: var(--border-radius-sm);\n transition: all var(--transition-fast);\n}\n\n.close-icon:active {\n background: var(--bg-secondary);\n color: var(--text-secondary);\n}\n\n.option-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px;\n}\n\n.option-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 16px 12px;\n border-radius: var(--border-radius-md);\n background: var(--bg-secondary);\n border: 2px solid transparent;\n cursor: pointer;\n transition: all var(--transition-fast);\n text-align: center;\n min-height: 80px;\n justify-content: center;\n}\n\n.option-item:active {\n transform: scale(0.95);\n}\n\n.option-item.disabled {\n opacity: 0.5;\n cursor: not-allowed;\n pointer-events: none;\n}\n\n.option-item.disabled .option-icon {\n background: var(--text-light);\n}\n\n.option-item.disabled .option-title,\n.option-item.disabled .option-count {\n color: var(--text-light);\n}\n\n.option-item.primary {\n background: var(--bg-overlay);\n border-color: var(--primary-color);\n}\n\n.option-item.warning {\n background: rgba(255, 152, 0, 0.1);\n border-color: var(--warning-color);\n}\n\n.option-item.danger {\n background: rgba(244, 67, 54, 0.1);\n border-color: var(--error-color);\n}\n\n.option-item.new {\n background: rgba(76, 175, 80, 0.1);\n border-color: var(--success-color);\n}\n\n.option-icon {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 8px;\n background: var(--primary-color);\n color: var(--text-white);\n}\n\n.option-item.warning .option-icon {\n background: var(--warning-color);\n}\n\n.option-item.danger .option-icon {\n background: var(--error-color);\n}\n\n.option-item.new .option-icon {\n background: var(--success-color);\n}\n\n.option-icon .van-icon {\n font-size: 16px;\n}\n\n.option-info {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.option-title {\n font-weight: 600;\n font-size: 14px;\n color: var(--text-primary);\n margin-bottom: 2px;\n line-height: 1.2;\n}\n\n.option-count {\n font-size: 12px;\n color: var(--text-secondary);\n font-weight: 500;\n}\n\n/* 移动端优化 */\n@media (max-width: 480px) {\n .exam-options {\n width: 95vw;\n margin: 12px auto;\n padding: 16px;\n }\n \n .popup-header {\n margin-bottom: 12px;\n padding-bottom: 10px;\n }\n \n .header-info h3 {\n font-size: 16px;\n }\n \n .exam-title {\n font-size: 13px;\n }\n \n .option-grid {\n gap: 8px;\n }\n \n .option-item {\n padding: 12px 8px;\n min-height: 70px;\n }\n \n .option-icon {\n width: 28px;\n height: 28px;\n margin-bottom: 6px;\n }\n \n .option-icon .van-icon {\n font-size: 14px;\n }\n \n .option-title {\n font-size: 13px;\n }\n \n .option-count {\n font-size: 11px;\n }\n}\n\n/* 过渡动画 */\n.slide-up-enter-active, .slide-up-leave-active {\n transition: all var(--transition-normal);\n}\n\n.slide-up-enter, .slide-up-leave-to {\n opacity: 0;\n transform: translateY(30px);\n}\n</style>\n\n\n\n// WEBPACK FOOTER //\n// src/components/CategoryPage.vue","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"category-page\"},[_c('van-nav-bar',{staticClass:\"category-nav-bar\",attrs:{\"title\":_vm.categoryTitle,\"fixed\":\"\",\"left-arrow\":\"\"},on:{\"click-left\":_vm.handleBack}}),_vm._v(\" \"),_c('div',{staticClass:\"category-container\"},[_c('div',{staticClass:\"category-header\"},[_c('h2',{staticClass:\"gradient-text\"},[_vm._v(_vm._s(_vm.categoryName))]),_vm._v(\" \"),_c('p',{staticClass:\"category-desc\"},[_vm._v(\"共 \"+_vm._s(_vm.examList.length)+\" 个题库\")])]),_vm._v(\" \"),_c('transition',{attrs:{\"name\":\"slide-up\"}},[(_vm.examList.length > 0)?_c('van-grid',{staticClass:\"exam-grid\",attrs:{\"column-num\":1,\"gutter\":12}},_vm._l((_vm.examList),function(exam,index){return _c('van-grid-item',{key:exam.hashCode,staticClass:\"exam-item-card\",style:({ 'animation-delay': (index * 0.05) + 's' }),attrs:{\"clickable\":\"\"},on:{\"click\":function($event){return _vm.showOption(exam)}}},[_c('div',{staticClass:\"exam-card-content\"},[_c('div',{staticClass:\"exam-icon\"},[_c('van-icon',{attrs:{\"name\":\"notes-o\",\"size\":\"24\",\"color\":exam.hasHistoryError ? 'var(--warning-color)' : 'var(--primary-color)'}})],1),_vm._v(\" \"),_c('div',{staticClass:\"exam-info\"},[_c('h3',{staticClass:\"exam-title\"},[_vm._v(_vm._s(exam.title))]),_vm._v(\" \"),_c('p',{staticClass:\"exam-meta\"},[_vm._v(\"题目数量: \"+_vm._s(exam.questions ? exam.questions.length : 0))]),_vm._v(\" \"),(exam.hasHistoryError)?_c('div',{staticClass:\"exam-status\"},[_c('van-tag',{attrs:{\"type\":\"warning\",\"size\":\"mini\"}},[_vm._v(\"有错题\")])],1):_vm._e()]),_vm._v(\" \"),_c('div',{staticClass:\"exam-arrow\"},[_c('van-icon',{attrs:{\"name\":\"arrow\"}})],1)])])}),1):_c('div',{staticClass:\"empty-state\"},[_c('div',{staticClass:\"empty-icon\"},[_c('van-icon',{attrs:{\"name\":\"warning-o\",\"size\":\"48\",\"color\":\"var(--text-light)\"}})],1),_vm._v(\" \"),_c('p',{staticClass:\"empty-text\"},[_vm._v(\"该分类下暂无题库\")]),_vm._v(\" \"),_c('van-button',{attrs:{\"type\":\"primary\",\"round\":\"\"},on:{\"click\":function($event){return _vm.$router.push('/')}}},[_vm._v(\"\\n 返回首页\\n \")])],1)],1)],1),_vm._v(\" \"),_c('van-popup',{staticClass:\"option-popup\",attrs:{\"position\":\"bottom\",\"round\":\"\"},on:{\"click-overlay\":function($event){_vm.isShowOption = false}},model:{value:(_vm.isShowOption),callback:function ($$v) {_vm.isShowOption=$$v},expression:\"isShowOption\"}},[_c('div',{staticClass:\"exam-options\"},[_c('div',{staticClass:\"popup-header\"},[_c('div',{staticClass:\"header-info\"},[_c('h3',[_vm._v(\"选择答题模式\")]),_vm._v(\" \"),_c('p',{staticClass:\"exam-title\"},[_vm._v(_vm._s(_vm.currentExam.title))])]),_vm._v(\" \"),_c('van-icon',{staticClass:\"close-icon\",attrs:{\"name\":\"cross\"},on:{\"click\":function($event){_vm.isShowOption = false}}})],1),_vm._v(\" \"),_c('div',{staticClass:\"option-grid\"},[_c('div',{staticClass:\"option-item\",class:{ disabled: _vm.getUndoneCounts() === 0 },on:{\"click\":function($event){_vm.getUndoneCounts() > 0 && _vm.doExam(_vm.optionInfo.hashCode, false, true)}}},[_c('div',{staticClass:\"option-icon new\"},[_c('van-icon',{attrs:{\"name\":\"edit\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"option-info\"},[_c('span',{staticClass:\"option-title\"},[_vm._v(\"未做题\")]),_vm._v(\" \"),_c('span',{staticClass:\"option-count\"},[_vm._v(_vm._s(_vm.getUndoneCounts())+\"题\")])])]),_vm._v(\" \"),_c('div',{staticClass:\"option-item primary\",class:{ disabled: _vm.getTotalCounts() === 0 },on:{\"click\":function($event){_vm.getTotalCounts() > 0 && _vm.doExam(_vm.optionInfo.hashCode)}}},[_c('div',{staticClass:\"option-icon\"},[_c('van-icon',{attrs:{\"name\":\"replay\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"option-info\"},[_c('span',{staticClass:\"option-title\"},[_vm._v(\"重新测试\")]),_vm._v(\" \"),_c('span',{staticClass:\"option-count\"},[_vm._v(_vm._s(_vm.getTotalCounts())+\"题\")])])]),_vm._v(\" \"),_c('div',{staticClass:\"option-item warning\",class:{ disabled: _vm.getErrorCounts() === 0 },on:{\"click\":function($event){_vm.getErrorCounts() > 0 && _vm.doExam(_vm.optionInfo.hashCode, true)}}},[_c('div',{staticClass:\"option-icon\"},[_c('van-icon',{attrs:{\"name\":\"question-o\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"option-info\"},[_c('span',{staticClass:\"option-title\"},[_vm._v(\"复习错题\")]),_vm._v(\" \"),_c('span',{staticClass:\"option-count\"},[_vm._v(_vm._s(_vm.getErrorCounts())+\"题\")])])]),_vm._v(\" \"),_c('div',{staticClass:\"option-item danger\",on:{\"click\":function($event){return _vm.clearHistory(_vm.optionInfo.hashCode)}}},[_c('div',{staticClass:\"option-icon\"},[_c('van-icon',{attrs:{\"name\":\"delete-o\"}})],1),_vm._v(\" \"),_c('div',{staticClass:\"option-info\"},[_c('span',{staticClass:\"option-title\"},[_vm._v(\"清空记录\")]),_vm._v(\" \"),_c('span',{staticClass:\"option-count\"},[_vm._v(\"重置\")])])])])])])],1)}\nvar staticRenderFns = []\nvar esExports = { render: render, staticRenderFns: staticRenderFns }\nexport default esExports\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/vue-loader/lib/template-compiler?{\"id\":\"data-v-5b326f70\",\"hasScoped\":true,\"transformToRequire\":{\"video\":[\"src\",\"poster\"],\"source\":\"src\",\"img\":\"src\",\"image\":\"xlink:href\"},\"buble\":{\"transforms\":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./src/components/CategoryPage.vue\n// module id = null\n// module chunks = ","function injectStyle (ssrContext) {\n require(\"!!../../node_modules/extract-text-webpack-plugin/dist/loader.js?{\\\"omit\\\":1,\\\"remove\\\":true}!vue-style-loader!css-loader?{\\\"sourceMap\\\":true}!../../node_modules/vue-loader/lib/style-compiler/index?{\\\"vue\\\":true,\\\"id\\\":\\\"data-v-5b326f70\\\",\\\"scoped\\\":true,\\\"hasInlineConfig\\\":false}!../../node_modules/vue-loader/lib/selector?type=styles&index=0!./CategoryPage.vue\")\n}\nvar normalizeComponent = require(\"!../../node_modules/vue-loader/lib/component-normalizer\")\n/* script */\nexport * from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./CategoryPage.vue\"\nimport __vue_script__ from \"!!babel-loader!../../node_modules/vue-loader/lib/selector?type=script&index=0!./CategoryPage.vue\"\n/* template */\nimport __vue_template__ from \"!!../../node_modules/vue-loader/lib/template-compiler/index?{\\\"id\\\":\\\"data-v-5b326f70\\\",\\\"hasScoped\\\":true,\\\"transformToRequire\\\":{\\\"video\\\":[\\\"src\\\",\\\"poster\\\"],\\\"source\\\":\\\"src\\\",\\\"img\\\":\\\"src\\\",\\\"image\\\":\\\"xlink:href\\\"},\\\"buble\\\":{\\\"transforms\\\":{}}}!../../node_modules/vue-loader/lib/selector?type=template&index=0!./CategoryPage.vue\"\n/* template functional */\nvar __vue_template_functional__ = false\n/* styles */\nvar __vue_styles__ = injectStyle\n/* scopeId */\nvar __vue_scopeId__ = \"data-v-5b326f70\"\n/* moduleIdentifier (server only) */\nvar __vue_module_identifier__ = null\nvar Component = normalizeComponent(\n __vue_script__,\n __vue_template__,\n __vue_template_functional__,\n __vue_styles__,\n __vue_scopeId__,\n __vue_module_identifier__\n)\n\nexport default Component.exports\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/components/CategoryPage.vue\n// module id = null\n// module chunks = ","import Vue from 'vue'\nimport Router from 'vue-router'\nimport HomePage from \"@/components/HomePage\";\nimport DoExamPage from \"@/components/exam/DoExamPage\";\nimport CategoryPage from \"@/components/CategoryPage\";\n\nVue.use(Router);\n\nexport default new Router({\n routes: [\n {\n path: '/',\n name: 'HomePage',\n component: HomePage\n },\n {\n path: '/category/:category',\n name: 'CategoryPage',\n component: CategoryPage,\n props: true\n },\n {\n path: '/exam',\n name: 'DoExamPage',\n component: DoExamPage,\n props: true\n }\n ]\n})\n\n\n\n// WEBPACK FOOTER //\n// ./src/router/index.js","import Vue from 'vue'\nimport axios from 'axios'\nimport jsonp from 'jsonp'\nimport Utils from '../utils'\nimport AlloyFinger from 'alloyfinger'\nimport AlloyFingerPlugin from 'alloyfinger/vue/alloy_finger_vue'\nimport { Toast } from 'vant'\n\nVue.use(AlloyFingerPlugin,{\n AlloyFinger\n});\nVue.use(Toast);\n\nVue.prototype.$http = axios;\nVue.prototype.$http.jsonp = jsonp;\n\nif (!Object.fromEntries) {\n Object.fromEntries = Utils.fromEntries;\n}\n\nif (!Array.prototype.flat) {\n try {\n Object.defineProperty(Array.prototype, 'flat', {\n value: function (deep) {\n return Utils.flat(this, deep);\n },\n enumerable: false\n })\n } catch (e) {\n Array.prototype.flat = function (deep) {\n return Utils.flat(this, deep);\n }\n }\n}\n\n\n// WEBPACK FOOTER //\n// ./src/plugins/index.js","// The Vue build version to load with the `import` command\n// (runtime-only or standalone) has been set in webpack.base.conf with an alias.\nimport Vue from 'vue'\nimport App from './App'\nimport router from './router'\nimport './assets/common.css';\nimport './assets/theme.css';\nimport './plugins';\n\nVue.config.productionTip = false;\n\n/* eslint-disable no-new */\nnew Vue({\n el: '#app',\n router,\n components: { App },\n template: '<App/>'\n});\n\n\n\n// WEBPACK FOOTER //\n// ./src/main.js"],"sourceRoot":""}
|