Files
learning-system-mobile/pages/study/courseStudy.vue
joshen abb5b42d50 Merge branch '104master-0626' into 20250821-hz
# Conflicts:
#	unpackage/dist/build/h5/hybrid/html/pdfjs/build/pdf.js
#	unpackage/dist/build/h5/hybrid/html/pdfjs/build/pdf.js.map
#	unpackage/dist/build/h5/hybrid/html/pdfjs/build/pdf.worker.js
#	unpackage/dist/build/h5/hybrid/html/pdfjs/build/pdf.worker.js.map
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/78-EUC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/78-EUC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/78-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/78-RKSJ-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/78-RKSJ-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/78-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/78ms-RKSJ-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/78ms-RKSJ-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/83pv-RKSJ-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/90ms-RKSJ-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/90ms-RKSJ-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/90msp-RKSJ-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/90msp-RKSJ-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/90pv-RKSJ-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/90pv-RKSJ-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Add-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Add-RKSJ-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Add-RKSJ-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Add-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-CNS1-0.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-CNS1-1.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-CNS1-2.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-CNS1-3.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-CNS1-4.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-CNS1-5.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-CNS1-6.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-CNS1-UCS2.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-GB1-0.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-GB1-1.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-GB1-2.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-GB1-3.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-GB1-4.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-GB1-5.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-GB1-UCS2.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Japan1-0.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Japan1-1.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Japan1-2.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Japan1-3.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Japan1-4.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Japan1-5.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Japan1-6.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Japan1-UCS2.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Korea1-0.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Korea1-1.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Korea1-2.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Adobe-Korea1-UCS2.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/B5-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/B5-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/B5pc-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/B5pc-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/CNS-EUC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/CNS-EUC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/CNS1-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/CNS1-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/CNS2-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/CNS2-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/ETHK-B5-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/ETHK-B5-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/ETen-B5-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/ETen-B5-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/ETenms-B5-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/ETenms-B5-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/EUC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/EUC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Ext-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Ext-RKSJ-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Ext-RKSJ-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Ext-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GB-EUC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GB-EUC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GB-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GB-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBK-EUC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBK-EUC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBK2K-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBK2K-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBKp-EUC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBKp-EUC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBT-EUC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBT-EUC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBT-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBT-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBTpc-EUC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBTpc-EUC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBpc-EUC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/GBpc-EUC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKdla-B5-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKdla-B5-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKdlb-B5-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKdlb-B5-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKgccs-B5-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKgccs-B5-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKm314-B5-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKm314-B5-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKm471-B5-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKm471-B5-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKscs-B5-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/HKscs-B5-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Hankaku.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Hiragana.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSC-EUC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSC-EUC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSC-Johab-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSC-Johab-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSCms-UHC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSCms-UHC-HW-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSCms-UHC-HW-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSCms-UHC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSCpc-EUC-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/KSCpc-EUC-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Katakana.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/LICENSE
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/NWP-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/NWP-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/RKSJ-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/RKSJ-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/Roman.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniCNS-UCS2-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniCNS-UCS2-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniCNS-UTF16-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniCNS-UTF16-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniCNS-UTF32-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniCNS-UTF32-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniCNS-UTF8-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniCNS-UTF8-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniGB-UCS2-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniGB-UCS2-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniGB-UTF16-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniGB-UTF16-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniGB-UTF32-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniGB-UTF32-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniGB-UTF8-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniGB-UTF8-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS-UCS2-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS-UCS2-HW-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS-UCS2-HW-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS-UCS2-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS-UTF16-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS-UTF16-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS-UTF32-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS-UTF32-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS-UTF8-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS-UTF8-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS2004-UTF16-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS2004-UTF16-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS2004-UTF32-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS2004-UTF32-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS2004-UTF8-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJIS2004-UTF8-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJISPro-UCS2-HW-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJISPro-UCS2-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJISPro-UTF8-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJISX0213-UTF32-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJISX0213-UTF32-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJISX02132004-UTF32-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniJISX02132004-UTF32-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniKS-UCS2-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniKS-UCS2-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniKS-UTF16-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniKS-UTF16-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniKS-UTF32-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniKS-UTF32-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniKS-UTF8-H.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/UniKS-UTF8-V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/V.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/cmaps/WP-Symbol.bcmap
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/compressed.tracemonkey-pldi-09.pdf
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/debugger.js
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/annotation-check.svg
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/annotation-comment.svg
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/annotation-help.svg
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/annotation-insert.svg
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/annotation-key.svg
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/annotation-newparagraph.svg
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/annotation-noicon.svg
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/annotation-note.svg
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/annotation-paragraph.svg
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/findbarButton-next-rtl.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/findbarButton-next-rtl@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/findbarButton-next.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/findbarButton-next@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/findbarButton-previous-rtl.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/findbarButton-previous-rtl@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/findbarButton-previous.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/findbarButton-previous@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/grab.cur
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/grabbing.cur
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/loading-icon.gif
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/loading-small.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/loading-small@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-documentProperties.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-documentProperties@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-firstPage.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-firstPage@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-handTool.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-handTool@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-lastPage.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-lastPage@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-rotateCcw.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-rotateCcw@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-rotateCw.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-rotateCw@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-scrollHorizontal@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-scrollVertical.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-scrollVertical@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-scrollWrapped.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-scrollWrapped@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-selectTool.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-selectTool@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-spreadEven.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-spreadEven@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-spreadNone.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-spreadNone@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-spreadOdd.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/secondaryToolbarButton-spreadOdd@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/shadow.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/texture.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-bookmark.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-bookmark@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-download.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-download@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-menuArrows.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-menuArrows@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-openFile.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-openFile@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-pageDown-rtl.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-pageDown-rtl@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-pageDown.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-pageDown@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-pageUp-rtl.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-pageUp-rtl@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-pageUp.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-pageUp@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-presentationMode.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-presentationMode@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-print.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-print@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-search.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-search@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-secondaryToolbarToggle-rtl.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-secondaryToolbarToggle-rtl@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-secondaryToolbarToggle.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-secondaryToolbarToggle@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-sidebarToggle-rtl.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-sidebarToggle-rtl@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-sidebarToggle.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-sidebarToggle@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-viewAttachments.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-viewAttachments@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-viewOutline-rtl.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-viewOutline-rtl@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-viewOutline.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-viewOutline@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-viewThumbnail.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-viewThumbnail@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-zoomIn.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-zoomIn@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-zoomOut.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/toolbarButton-zoomOut@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/treeitem-collapsed-rtl.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/treeitem-collapsed-rtl@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/treeitem-collapsed.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/treeitem-collapsed@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/treeitem-expanded.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/images/treeitem-expanded@2x.png
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/locale/locale.properties
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/locale/zh-CN/viewer.properties
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/viewer.css
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/viewer.htm
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/viewer.js
#	unpackage/dist/build/h5/hybrid/html/pdfjs/web/viewer.js.map
#	unpackage/dist/build/h5/index.html
#	unpackage/dist/build/h5/static/editor/editor.css
#	unpackage/dist/build/h5/static/editor/image-resize.min.js
#	unpackage/dist/build/h5/static/editor/quill.min.js
#	unpackage/dist/build/h5/static/images/answer.png
#	unpackage/dist/build/h5/static/images/artical.png
#	unpackage/dist/build/h5/static/images/article/empty.png
#	unpackage/dist/build/h5/static/images/article/image.png
#	unpackage/dist/build/h5/static/images/article/label.png
#	unpackage/dist/build/h5/static/images/article/quash.png
#	unpackage/dist/build/h5/static/images/article/redo.png
#	unpackage/dist/build/h5/static/images/article/time.png
#	unpackage/dist/build/h5/static/images/banner-index.png
#	unpackage/dist/build/h5/static/images/banner-tow.png
#	unpackage/dist/build/h5/static/images/banner.png
#	unpackage/dist/build/h5/static/images/bell.png
#	unpackage/dist/build/h5/static/images/bg.png
#	unpackage/dist/build/h5/static/images/cancel.png
#	unpackage/dist/build/h5/static/images/center/Evaluation.png
#	unpackage/dist/build/h5/static/images/center/articon.png
#	unpackage/dist/build/h5/static/images/center/colle.png
#	unpackage/dist/build/h5/static/images/center/growth.jpg
#	unpackage/dist/build/h5/static/images/center/interlocu.png
#	unpackage/dist/build/h5/static/images/center/mycentericon.png
#	unpackage/dist/build/h5/static/images/center/mymedalicon.png
#	unpackage/dist/build/h5/static/images/center/myubicon.png
#	unpackage/dist/build/h5/static/images/center/rankingicon.png
#	unpackage/dist/build/h5/static/images/center/shareme.png
#	unpackage/dist/build/h5/static/images/centerbg.png
#	unpackage/dist/build/h5/static/images/close.png
#	unpackage/dist/build/h5/static/images/collect.png
#	unpackage/dist/build/h5/static/images/course.png
#	unpackage/dist/build/h5/static/images/course/c_comment.png
#	unpackage/dist/build/h5/static/images/course/c_favorite.png
#	unpackage/dist/build/h5/static/images/course/c_favorite_2.png
#	unpackage/dist/build/h5/static/images/course/c_share.png
#	unpackage/dist/build/h5/static/images/course/courseDefault.png
#	unpackage/dist/build/h5/static/images/course/default.png
#	unpackage/dist/build/h5/static/images/default.png
#	unpackage/dist/build/h5/static/images/dlg.png
#	unpackage/dist/build/h5/static/images/dlg202212.png
#	unpackage/dist/build/h5/static/images/favorite-empt.png
#	unpackage/dist/build/h5/static/images/filter.png
#	unpackage/dist/build/h5/static/images/follow-empt.png
#	unpackage/dist/build/h5/static/images/gonggao/dlg_bg.png
#	unpackage/dist/build/h5/static/images/growth/bg.png
#	unpackage/dist/build/h5/static/images/growth/card-top.png
#	unpackage/dist/build/h5/static/images/growth/qiehuan.png
#	unpackage/dist/build/h5/static/images/his.png
#	unpackage/dist/build/h5/static/images/hotforum/003.png
#	unpackage/dist/build/h5/static/images/hotforum/005.png
#	unpackage/dist/build/h5/static/images/hotforum/01.png
#	unpackage/dist/build/h5/static/images/hotforum/02.png
#	unpackage/dist/build/h5/static/images/hotforum/03.png
#	unpackage/dist/build/h5/static/images/hotforum/04.png
#	unpackage/dist/build/h5/static/images/hotforum/1.png
#	unpackage/dist/build/h5/static/images/hotforum/2.png
#	unpackage/dist/build/h5/static/images/hotforum/2024.png
#	unpackage/dist/build/h5/static/images/hotforum/2025.png
#	unpackage/dist/build/h5/static/images/hotforum/2503.png
#	unpackage/dist/build/h5/static/images/hotforum/3.png
#	unpackage/dist/build/h5/static/images/hotforum/4.png
#	unpackage/dist/build/h5/static/images/hotforum/back.jpg
#	unpackage/dist/build/h5/static/images/hotforum/back.png
#	unpackage/dist/build/h5/static/images/hotforum/back25.png
#	unpackage/dist/build/h5/static/images/hotforum/border.png
#	unpackage/dist/build/h5/static/images/hotforum/foot.png
#	unpackage/dist/build/h5/static/images/hotforum/one.png
#	unpackage/dist/build/h5/static/images/hotforum/two.png
#	unpackage/dist/build/h5/static/images/hotforum/背景框.png
#	unpackage/dist/build/h5/static/images/icon/answers.png
#	unpackage/dist/build/h5/static/images/icon/artice-praise-active.png
#	unpackage/dist/build/h5/static/images/icon/artice-praise.png
#	unpackage/dist/build/h5/static/images/icon/article2.png
#	unpackage/dist/build/h5/static/images/icon/artleft.png
#	unpackage/dist/build/h5/static/images/icon/artright.png
#	unpackage/dist/build/h5/static/images/icon/bar-comment.png
#	unpackage/dist/build/h5/static/images/icon/bar-favorite(1).png
#	unpackage/dist/build/h5/static/images/icon/bar-favorite.png
#	unpackage/dist/build/h5/static/images/icon/bar-praise(1).png
#	unpackage/dist/build/h5/static/images/icon/bar-praise-active.png
#	unpackage/dist/build/h5/static/images/icon/bar-praise.png
#	unpackage/dist/build/h5/static/images/icon/comment.png
#	unpackage/dist/build/h5/static/images/icon/del.png
#	unpackage/dist/build/h5/static/images/icon/disagree2.png
#	unpackage/dist/build/h5/static/images/icon/edit.png
#	unpackage/dist/build/h5/static/images/icon/exam-duration.png
#	unpackage/dist/build/h5/static/images/icon/exam-score.png
#	unpackage/dist/build/h5/static/images/icon/exam-times.png
#	unpackage/dist/build/h5/static/images/icon/eye.png
#	unpackage/dist/build/h5/static/images/icon/eye_close.png
#	unpackage/dist/build/h5/static/images/icon/eye_open.png
#	unpackage/dist/build/h5/static/images/icon/favo.png
#	unpackage/dist/build/h5/static/images/icon/favorite-active.png
#	unpackage/dist/build/h5/static/images/icon/favorite.png
#	unpackage/dist/build/h5/static/images/icon/follow-stop.png
#	unpackage/dist/build/h5/static/images/icon/index-start.png
#	unpackage/dist/build/h5/static/images/icon/isread.png
#	unpackage/dist/build/h5/static/images/icon/isread2x.png
#	unpackage/dist/build/h5/static/images/icon/more.png
#	unpackage/dist/build/h5/static/images/icon/noread.png
#	unpackage/dist/build/h5/static/images/icon/noread2x.png
#	unpackage/dist/build/h5/static/images/icon/ok-icon.png
#	unpackage/dist/build/h5/static/images/icon/praise(1).png
#	unpackage/dist/build/h5/static/images/icon/praise-active.png
#	unpackage/dist/build/h5/static/images/icon/praise.png
#	unpackage/dist/build/h5/static/images/icon/praise1.png
#	unpackage/dist/build/h5/static/images/icon/question2.png
#	unpackage/dist/build/h5/static/images/icon/scoreicon.png
#	unpackage/dist/build/h5/static/images/icon/share.png
#	unpackage/dist/build/h5/static/images/icon/trample-active.png
#	unpackage/dist/build/h5/static/images/icon/trample.png
#	unpackage/dist/build/h5/static/images/icon/withdraw.png
#	unpackage/dist/build/h5/static/images/icon/withdrawnew.png
#	unpackage/dist/build/h5/static/images/icon/撤回.png
#	unpackage/dist/build/h5/static/images/icon/撤回@2x.png
#	unpackage/dist/build/h5/static/images/image_02.png
#	unpackage/dist/build/h5/static/images/jt.png
#	unpackage/dist/build/h5/static/images/l1.png
#	unpackage/dist/build/h5/static/images/l2.png
#	unpackage/dist/build/h5/static/images/l3.png
#	unpackage/dist/build/h5/static/images/l4.png
#	unpackage/dist/build/h5/static/images/l5.png
#	unpackage/dist/build/h5/static/images/l6.png
#	unpackage/dist/build/h5/static/images/l7.png
#	unpackage/dist/build/h5/static/images/l8.png
#	unpackage/dist/build/h5/static/images/lecturer/teacher-girl.png
#	unpackage/dist/build/h5/static/images/lecturer/teacher.png
#	unpackage/dist/build/h5/static/images/login_medal.png
#	unpackage/dist/build/h5/static/images/lubo.png
#	unpackage/dist/build/h5/static/images/man.png
#	unpackage/dist/build/h5/static/images/massive.gif
#	unpackage/dist/build/h5/static/images/me-bg.png
#	unpackage/dist/build/h5/static/images/me-box.png
#	unpackage/dist/build/h5/static/images/meSh.png
#	unpackage/dist/build/h5/static/images/medal/china2023.png
#	unpackage/dist/build/h5/static/images/medal/china2023m.png
#	unpackage/dist/build/h5/static/images/medal/medal2023.png
#	unpackage/dist/build/h5/static/images/medal/medal20231.png
#	unpackage/dist/build/h5/static/images/myubimg.png
#	unpackage/dist/build/h5/static/images/per.png
#	unpackage/dist/build/h5/static/images/que.png
#	unpackage/dist/build/h5/static/images/ranking-list.png
#	unpackage/dist/build/h5/static/images/ranking/list-01.png
#	unpackage/dist/build/h5/static/images/ranking/list-or.png
#	unpackage/dist/build/h5/static/images/ranking/list-pink.png
#	unpackage/dist/build/h5/static/images/ranking/list02.png
#	unpackage/dist/build/h5/static/images/ranking/list03.png
#	unpackage/dist/build/h5/static/images/ranking/listblue01.png
#	unpackage/dist/build/h5/static/images/ranking/listblue010.png
#	unpackage/dist/build/h5/static/images/ranking/listblue02.png
#	unpackage/dist/build/h5/static/images/ranking/listblue03.png
#	unpackage/dist/build/h5/static/images/ranking/listblue04.png
#	unpackage/dist/build/h5/static/images/ranking/listblue05.png
#	unpackage/dist/build/h5/static/images/ranking/listblue06.png
#	unpackage/dist/build/h5/static/images/ranking/listblue07.png
#	unpackage/dist/build/h5/static/images/ranking/listblue08.png
#	unpackage/dist/build/h5/static/images/ranking/listblue09.png
#	unpackage/dist/build/h5/static/images/ranking/listred01.png
#	unpackage/dist/build/h5/static/images/ranking/listred02.png
#	unpackage/dist/build/h5/static/images/ranking/listred03.png
#	unpackage/dist/build/h5/static/images/ranking/qa-bg.png
#	unpackage/dist/build/h5/static/images/ranking/qa-box.png
#	unpackage/dist/build/h5/static/images/ranking/ran-one.png
#	unpackage/dist/build/h5/static/images/ranking/ran-three.png
#	unpackage/dist/build/h5/static/images/ranking/ran-tow.png
#	unpackage/dist/build/h5/static/images/right.png
#	unpackage/dist/build/h5/static/images/rules.png
#	unpackage/dist/build/h5/static/images/seach-empt.png
#	unpackage/dist/build/h5/static/images/show-bg.png
#	unpackage/dist/build/h5/static/images/stuR.png
#	unpackage/dist/build/h5/static/images/studing.png
#	unpackage/dist/build/h5/static/images/tabbar/home0.png
#	unpackage/dist/build/h5/static/images/tabbar/home1.png
#	unpackage/dist/build/h5/static/images/tabbar/my0.png
#	unpackage/dist/build/h5/static/images/tabbar/my1.png
#	unpackage/dist/build/h5/static/images/tabbar/new0.png
#	unpackage/dist/build/h5/static/images/tabbar/new1.png
#	unpackage/dist/build/h5/static/images/tabbar/plus.png
#	unpackage/dist/build/h5/static/images/tabbar/plus0.png
#	unpackage/dist/build/h5/static/images/tabbar/plus1.png
#	unpackage/dist/build/h5/static/images/tabbar/res0.png
#	unpackage/dist/build/h5/static/images/tabbar/res1.png
#	unpackage/dist/build/h5/static/images/tabbar/study0.png
#	unpackage/dist/build/h5/static/images/tabbar/study1.png
#	unpackage/dist/build/h5/static/images/text.png
#	unpackage/dist/build/h5/static/images/toShare.png
#	unpackage/dist/build/h5/static/images/triangle.png
#	unpackage/dist/build/h5/static/images/ubbgimg.png
#	unpackage/dist/build/h5/static/images/uploading.png
#	unpackage/dist/build/h5/static/images/user.png
#	unpackage/dist/build/h5/static/images/utop-course.png
#	unpackage/dist/build/h5/static/images/w1.png
#	unpackage/dist/build/h5/static/images/w2.png
#	unpackage/dist/build/h5/static/images/w3.png
#	unpackage/dist/build/h5/static/images/weike.png
#	unpackage/dist/build/h5/static/images/wenhao.png
#	unpackage/dist/build/h5/static/images/woman.png
#	unpackage/dist/build/h5/static/images/xuan-bg1.png
#	unpackage/dist/build/h5/static/images/xuan-btn.png
#	unpackage/dist/build/h5/static/index.883130ca.css
#	unpackage/dist/build/h5/static/js/chunk-vendors.b01deae1.js
#	unpackage/dist/build/h5/static/js/index.730ac718.js
#	unpackage/dist/build/h5/static/js/pages-exam-answer.393b65f7.js
#	unpackage/dist/build/h5/static/js/pages-exam-answer~pages-exam-exam~pages-exam-test~pages-index-index~pages-lecturer-certification-inf~45743a86.8bc41d70.js
#	unpackage/dist/build/h5/static/js/pages-exam-answer~pages-exam-exam~pages-exam-test~pages-index-index~pages-lecturer-certification-inf~6decbdae.9d499e81.js
#	unpackage/dist/build/h5/static/js/pages-exam-answer~pages-exam-exam~pages-exam-test~pages-login-headPortrait~pages-login-indLabels~pag~afd3085b.af6f686f.js
#	unpackage/dist/build/h5/static/js/pages-exam-exam.895328d3.js
#	unpackage/dist/build/h5/static/js/pages-exam-exam~pages-exam-test~pages-index-index~pages-lecturer-certification-info~pages-login-newB~a76f9ed8.a977f8be.js
#	unpackage/dist/build/h5/static/js/pages-exam-qrcode.0f8b16a2.js
#	unpackage/dist/build/h5/static/js/pages-exam-qrcode~pages-login-loading.1936a235.js
#	unpackage/dist/build/h5/static/js/pages-exam-test.fb94e967.js
#	unpackage/dist/build/h5/static/js/pages-forward.4d23679a.js
#	unpackage/dist/build/h5/static/js/pages-hotforum-index.5da225af.js
#	unpackage/dist/build/h5/static/js/pages-index-index.08f0e6c1.js
#	unpackage/dist/build/h5/static/js/pages-index-index~pages-my-follow~pages-my-index~pages-my-myArticles~pages-my-myFavorites~pages-my-m~448c876d.5fd11681.js
#	unpackage/dist/build/h5/static/js/pages-lecturer-certification-info.469c7115.js
#	unpackage/dist/build/h5/static/js/pages-lecturer-certification-info~pages-login-indLabels~pages-login-newBirt~pages-login-nickName~pag~5fa2257d.5aaa1fdc.js
#	unpackage/dist/build/h5/static/js/pages-lecturer-certification-list.f6a7933f.js
#	unpackage/dist/build/h5/static/js/pages-login-headPortrait.5a406774.js
#	unpackage/dist/build/h5/static/js/pages-login-headPortrait~pages-plus-addQuestion.68866c6e.js
#	unpackage/dist/build/h5/static/js/pages-login-indLabels.a89ca39f.js
#	unpackage/dist/build/h5/static/js/pages-login-loading.cd202a17.js
#	unpackage/dist/build/h5/static/js/pages-login-login.2bb2ea62.js
#	unpackage/dist/build/h5/static/js/pages-login-login~pages-login-next~pages-plus-addArticle~pages-plus-addQuestion~pages-plus-editAnser~f7d715d4.70e1e969.js
#	unpackage/dist/build/h5/static/js/pages-login-newBirt.dbf5c9bb.js
#	unpackage/dist/build/h5/static/js/pages-login-next.2847c2a6.js
#	unpackage/dist/build/h5/static/js/pages-login-nickName.e7ac5650.js
#	unpackage/dist/build/h5/static/js/pages-my-follow.156c775f.js
#	unpackage/dist/build/h5/static/js/pages-my-growth.7cbd82b3.js
#	unpackage/dist/build/h5/static/js/pages-my-growth~pages-my-message.6804f161.js
#	unpackage/dist/build/h5/static/js/pages-my-headimg.03cb8c1f.js
#	unpackage/dist/build/h5/static/js/pages-my-index.c8cad5f4.js
#	unpackage/dist/build/h5/static/js/pages-my-message.21df9fab.js
#	unpackage/dist/build/h5/static/js/pages-my-myAnswers.6b6aed6b.js
#	unpackage/dist/build/h5/static/js/pages-my-myArticles.239ccbf2.js
#	unpackage/dist/build/h5/static/js/pages-my-myAssdetail.991025a5.js
#	unpackage/dist/build/h5/static/js/pages-my-myAssesses.0d5a66b3.js
#	unpackage/dist/build/h5/static/js/pages-my-myAssesses~pages-study-index.d8410264.js
#	unpackage/dist/build/h5/static/js/pages-my-myFavorites.433b090c.js
#	unpackage/dist/build/h5/static/js/pages-my-myMedal.c658e010.js
#	unpackage/dist/build/h5/static/js/pages-my-myQa.a31d6390.js
#	unpackage/dist/build/h5/static/js/pages-my-myQuestions.238c994b.js
#	unpackage/dist/build/h5/static/js/pages-my-myShares.b30b78b5.js
#	unpackage/dist/build/h5/static/js/pages-my-myub.252d7c80.js
#	unpackage/dist/build/h5/static/js/pages-my-myubrules.891b9b60.js
#	unpackage/dist/build/h5/static/js/pages-my-rankingList.05d31ed9.js
#	unpackage/dist/build/h5/static/js/pages-my-setting.1e62f53c.js
#	unpackage/dist/build/h5/static/js/pages-my-toMeComments.bb2c5a93.js
#	unpackage/dist/build/h5/static/js/pages-my-toMeShares.8c095153.js
#	unpackage/dist/build/h5/static/js/pages-my-uCurrencyRules.1b08247b.js
#	unpackage/dist/build/h5/static/js/pages-news-index.24fd7b39.js
#	unpackage/dist/build/h5/static/js/pages-plus-addArticle.8308ec88.js
#	unpackage/dist/build/h5/static/js/pages-plus-addQuestion.2c93cc8f.js
#	unpackage/dist/build/h5/static/js/pages-plus-editAnser.cc29d6d6.js
#	unpackage/dist/build/h5/static/js/pages-plus-editArticle.eebfe8cd.js
#	unpackage/dist/build/h5/static/js/pages-plus-editQuestion.0a71288d.js
#	unpackage/dist/build/h5/static/js/pages-plus-feedback.35cc762d.js
#	unpackage/dist/build/h5/static/js/pages-plus-index.0d518e8c.js
#	unpackage/dist/build/h5/static/js/pages-resource-articeDetail.efcf3ced.js
#	unpackage/dist/build/h5/static/js/pages-resource-courseDetail.892a14f7.js
#	unpackage/dist/build/h5/static/js/pages-resource-index.4c133635.js
#	unpackage/dist/build/h5/static/js/pages-resource-microDetail.2caea90a.js
#	unpackage/dist/build/h5/static/js/pages-resource-qaDetail.8e34c3fd.js
#	unpackage/dist/build/h5/static/js/pages-resource-search.09f5d0ab.js
#	unpackage/dist/build/h5/static/js/pages-study-audioTest.99919cca.js
#	unpackage/dist/build/h5/static/js/pages-study-courseAssess.625530cb.js
#	unpackage/dist/build/h5/static/js/pages-study-exam.82bc8aae.js
#	unpackage/dist/build/h5/static/js/pages-study-examList.694ae4bc.js
#	unpackage/dist/build/h5/static/js/pages-study-homework.cbc750db.js
#	unpackage/dist/build/h5/static/js/pages-study-homeworkDetail.527383b0.js
#	unpackage/dist/build/h5/static/js/pages-study-homeworkList.71f959ad.js
#	unpackage/dist/build/h5/static/js/pages-study-index.093e0643.js
#	unpackage/dist/build/h5/static/js/pages-study-loaddetail.34efd4f7.js
#	unpackage/dist/build/h5/static/js/pages-study-onlineCourse.5a648581.js
#	unpackage/dist/build/h5/static/js/pages-study-studydetail.2fe4369e.js
#	unpackage/dist/build/h5/static/temp/1.JPEG
#	unpackage/dist/build/h5/static/temp/2.jpg
#	unpackage/dist/build/h5/static/temp/3.JPEG
#	unpackage/dist/build/h5/static/temp/4.JPEG
#	unpackage/dist/build/h5/static/temp/5.JPEG
#	unpackage/dist/build/h5/static/temp/6.JPEG
#	unpackage/dist/build/h5/static/temp/assist.png
#	unpackage/dist/build/h5/static/temp/course.png
#	unpackage/dist/build/h5/static/temp/course1.jpg
#	unpackage/dist/build/h5/static/temp/exam-view-paper.png
#	unpackage/dist/build/h5/static/temp/hPhoto.png
#	unpackage/dist/build/h5/static/temp/praise.jpg
#	unpackage/dist/build/h5/static/temp/share.png
#	unpackage/dist/build/h5/static/temp/uploading.png
#	unpackage/dist/build/h5/static/temp/video.mp4
#	unpackage/dist/build/h5/static/temp/wkpingg_r2_c2.png
2025-09-11 10:28:34 +08:00

2554 lines
87 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<!--新的课程学习页面没有中间的详细页面了课程点过来就是这个用户未报名就直接报名-->
<view>
<page-title :showBack="true" :sticky="true" v-if="showNavbar" @go="goBack">详情</page-title>
<watermark></watermark>
<u-toast ref="messager"></u-toast>
<!-- <page-title :showBack="true"></page-title> -->
<view class="playbox" v-if="isShowPdt"><!--内容播放区域-->
<view v-if="renderCourse">
<view style="min-height: 440upx;" >
<view v-if="curContent.contentType==10" style="background-color: #000000;">
<!--视频-->
<view style="position: relative;">
<video-player
:url="blobUrl"
:blobId="blobId"
controls
:enable-play-gesture="true"
:inittime="curContent.lastStudyTime"
@play="onPlayerPlay"
@pause="onPlayerPause"
@ended="onPlayerEnded"
@timeupdate="onPlayerPlaying"
@fullscreenchange="onFullScreen"
:drag="curriculumData.isDrag"
style="width: 100%; object-fit: fill">
>
</video-player>
<view class="player-box" v-if="playerBoxShow">
<view class="player-praise">
<view @click="praiseContent" style="cursor: pointer;">
<image class="icon-small" v-if="isPraise" src="/static/images/icon/praise-active.png" />
<image class="icon-small" v-else src="/static/images/icon/praise1.png" />
<!-- {{ courseInfo.praises }} -->
<view style="color:#fff;cursor: pointer;"></view>
</view>
<view style="margin-left: 15px;cursor: pointer;" @click="treadContent">
<image class="icon-small" v-if="isTrample" src="/static/images/icon/trample-active.png" />
<image class="icon-small" v-else src="/static/images/icon/trample.png" />
<!-- {{ courseInfo.trampleCount }} -->
<view style="color:#fff;cursor: pointer;"></view>
</view>
</view>
<!--以下部分已经移到下面了-->
<!-- <view v-if="!scoreInfo.has" class="player-rate">
<u-rate v-model="scoreInfo.score" active-color="#f7ba2a" text-color="#ff9900" score-template="{value}" void-color="#fff" @change="addScore"></u-rate>
</view>
<view v-if="scoreInfo.has" style="padding-top: 5px;display: flex;">
<view class="player-rate" style="padding-left: 5px;">
<u-rate readonly :count="5" active-color="#f7ba2a" v-model="scoreInfo.score"></u-rate>
</view>
<view class="score-text" style="margin-top:20px">
<text style="color:#ffb30f;">{{ toScore(scoreInfo.score) }}</text>
<text style="font-size: 12px;color: #fff"></text>
</view>
</view> -->
</view>
</view>
</view>
<!---->
<view v-if="curContent.contentType==20">
<!--音频播放-->
<view style="text-align: center;padding-top: 40px;background-color: #FFFFFF;">
<audio-player
:src="blobUrl"
:name="curContent.contentName"
:drag="curriculumData.isDrag"
@onPlay="audioPlay"
@onPause="audioPause"
@onPlaying="audioPlaying"
@onEnded="audioEnd">
</audio-player>
</view>
</view>
<view v-if="curContent.contentType==30">
<image :src="fileBaseUrl+curContent.content" style="width: 100%;"></image>
</view>
<view v-if="curContent.contentType==40">
<!--pdf文档-->
<view style="min-height: 500px;padding-top: 200upx;position: relative;">
<pdf-preview v-if="curContent.content && curContent.content!=''"
:src="curContent.content ? fileBaseUrl+curContent.content : ''"></pdf-preview>
</view>
</view>
<view v-if="curContent.contentType==41">
<view class="about-gongsi-info" :style="{height:articleMore? '500upx':'auto'}"
style="padding: 15px;text-indent:40px;line-height: 28px;position: relative;">
<u-parse :content="curContent.content"></u-parse>
</view>
<view v-if="articleMore" @click="showMore" style="text-align: center;color: #387DF7;">
<text>查看更多</text>
</view>
</view>
<div v-if="curContent.contentType == 50" style="min-height: 500px;">
<!--因为web-view 动态切换地址不好用所以这里先使用iframe-->
<iframe id="iframe-scorm" v-if="scormUrl" :src="scormUrl" @load="iframeScormLoad()" frameborder="0"
scrolling="no" border="0px" style="width:100%;min-height:500px;border:0px;"></iframe>
</div>
<view v-if="curContent.contentType==52">
<!--外连接-->
<view v-if="conLink.openType == 1">
<view v-if="conLink.url!=''" style="min-height: 400px;position: relative;">
<web-view :src="conLink.url"></web-view>
</view>
</view>
<view v-else>
<div style="text-align: center;padding: 20px;">{{ curContent.contentName }}</div>
<div style="text-align: center;padding: 20px;">{{ conLink.url }}</div>
</view>
</view>
<!--作业-->
<view v-if="curContent.contentType==60">
<course-homework :content="curContent" :studyId="studyId"></course-homework>
</view>
<!--考试-->
<view v-if="curContent.contentType==61">
<course-exam :courseType="courseInfo.type" :content="curContent" :studyId="studyId"></course-exam>
</view>
<!--评估-->
<view v-if="curContent.contentType==62">
<course-assess :content="curContent" :studyId="studyId"></course-assess>
</view>
</view>
</view>
<view v-if="!renderCourse && Internet ==2">
<div style="margin-top:40px">
<span style="font-size: large">十分抱歉您当前的网络环境不符合观看要求为了保障课程信息的安全您需要接入公司内网才能观看</span>
</div>
</view>
</view>
<view class="contentbox" v-if="courseInfo.name">
<view v-if="!catalogShow">
<view class="tabrow">
<view class="tabrow-item" @click="goTop">目录({{totalContent}})</view>
<view class="tabrow-item" @click="changeTab(1)">
<text :class="{'tabrow-active':tabIndex==1}">简介</text>
</view>
<view class="tabrow-item" @click="changeTab(2)">
<text :class="{'tabrow-active':tabIndex==2}">评论</text>
</view>
<view class="player-box-tabrow">
<view class="player-praise">
<view @click="praiseContent" style="cursor: pointer;">
<image class="icon-small" v-if="isPraise" src="/static/images/icon/praise-active.png"/>
<image class="icon-small" v-else src="/static/images/icon/praise1.png"/>
<!-- {{ courseInfo.praises }} -->
<text style="cursor: pointer;"></text>
</view>
<view style="margin-left: 15px;cursor: pointer;" @click="treadContent">
<image class="icon-small" v-if="isTrample" src="/static/images/icon/trample-active.png"/>
<image class="icon-small" v-else src="/static/images/icon/trample.png"/>
<!-- {{ courseInfo.trampleCount }} -->
<text style="cursor: pointer;"></text>
</view>
</view>
</view>
</view>
<!--简介内容-->
<view v-if="tabIndex==1" class="cinfo">
<view class="cinfo-title" style="display: flex;flex-wrap: wrap;">
<view>
{{ courseInfo.name }}
</view>
<view>
<text class="cinfo-tag1">{{ convertTypeName(courseInfo.sysType1) }}</text>
<text v-if="courseInfo.sysType2!= '' && courseInfo.sysType2!= '0'" class="cinfo-tag2">
{{ convertTypeName(courseInfo.sysType2) }}
</text>
<text v-if="courseInfo.sysType3!= '' && courseInfo.sysType3!= '0'" class="cinfo-tag2">
{{ convertTypeName(courseInfo.sysType3) }}
</text>
</view>
</view>
<view class="desrow">
<view>
<text class="desrow-name">目标人群</text>
<text class="desrow-value">{{ courseInfo.forUsers }}</text>
</view>
<view style="color: #999999;min-width: 160upx;text-align: right;font-size: 24upx;">
{{ formatUserNumber(courseInfo.studys) }}人学习
</view>
</view>
<view class="desrow" style="justify-content: flex-start;">
<view style="line-height: 60upx;">
<text class="desrow-name">讲师</text>
</view>
<view style="flex: 1;">
<view v-for="(tea,teaIdx) in teachers" :key="tea.id"
style="display: flex;justify-content: space-between;line-height: 60upx;">
<view>
<text class="desrow-value">{{ tea.teacherName }}</text>
<text class="desrow-value" style="font-size: 24upx;margin-left: 6upx;color: #999999;">
({{ tea.orgInfo }})
</text>
</view>
<view @click="followUser(tea)" style="color: #387DF7;">
<text class="concern" v-if="tea.followed">已关注</text>
<text v-else class="concern">+关注</text>
</view>
</view>
</view>
</view>
<view class="desrow">
<view style="display: flex;">
<text class="desrow-name">课程评分</text>
<u-rate readonly v-if="courseInfo.score>0" :count="5" activeColor="#F37101" :size="16"
v-model="courseInfo.score"></u-rate>
<text class="score">{{ toScore(courseInfo.score) }}</text>
</view>
</view>
<view class="desrow" v-if="myScore>0">
<view style="display: flex;">
<text class="desrow-name">我的评分</text>
<u-rate readonly :count="5" activeColor="#F37101" :size="16" v-model="myScore"></u-rate>
<text class="score">{{ toScore(myScore) }}</text>
</view>
</view>
<view v-if="totalContent>1" class="desrow">
<view style="font-size: 32upx;color: #333333;">目录</view>
<view v-if="totalContent>2" @click="showAllCatalog" style="font-size: 28upx;color: #666666;">全部&gt;</view>
</view>
<view v-if="totalContent>1"><!--单个内容时不显示内容名称-->
<view v-if="totalContent==2">
<view v-if="courseInfo.type==10">
<view class="citembox1">
<view v-for="(con,conIdx) in contentList" :key="conIdx" class="citembox1-item">
<view class="citem" @click="playContent(con,conIdx,0)">
<view class="citem-body" :class="{'box-studying':con.id==curContent.id}">
<text :class="{'color-studying':con.id==curContent.id}">{{ con.contentName }}</text>
</view>
</view>
</view>
</view>
</view>
<view v-else><!--有目录的但是只有两项内容-->
<view class="citembox1">
<view v-for="(con,conIdx) in scrollList" :key="conIdx" class="citembox1-item">
<view class="citem" @click="playContent(con,conIdx,0)">
<view class="citem-body" :class="{'box-studying':con.id==curContent.id}">
<text :class="{'color-studying':con.id==curContent.id}">{{ con.contentName }}</text>
</view>
</view>
</view>
</view>
</view>
</view>
<view v-else>
<view v-if="courseInfo.type==10">
<view v-if="scrollItemWidth>0" class="main-cata-active">
<scroll-view scroll-x :scroll-y="false"
style="min-height:180upx;white-space: nowrap;overflow: hidden;"
:scroll-left="scrollInfo.scrollLeft" @scroll="scrollHandler">
<!-- <view class="mycrollcontent" style="display: flex;justify-content:flex-start;"> -->
<view v-for="(con,conIdx) in contentList" :key="conIdx" style="display: inline-block;" :id="con.id"
@click="playContent(con,conIdx,0)">
<!---->
<view :style="{width:scrollItemWidth+'px'}" class="scroll-item"
:class="{'box-studying':curContent.id==con.id}">
<view class="scroll-item-con">
<view class="scroll-item-name">
{{ con.contentName }}
</view>
<!-- <view class="scroll-item-type">
<view class="square-border">
<view :class="statusClass(con.status)">
{{getConType(con.contentType)}}
</view>
</view>
<text v-if="con.status==1" class="status-tag" :class="statusClass(con.status)">未开始</text>
<text v-if="con.status==2" class="status-tag" :class="statusClass(con.status)">进行中</text>
<text v-if="con.status==9" class="status-tag" :class="statusClass(con.status)">已完成</text>
</view> -->
</view>
</view>
</view>
<!-- </view> -->
</scroll-view>
</view>
</view>
<view v-else>
<view v-if="scrollItemWidth>0" class="main-cata-active">
<scroll-view scroll-x :scroll-y="false" style="height:115px;white-space: nowrap;overflow: hidden;"
:scroll-left="scrollInfo.scrollLeft" @scroll="scrollHandler">
<!-- <view class="mycrollcontent" style="display: flex;justify-content:flex-start;"> -->
<view v-for="(con,conIdx) in scrollList" :key="conIdx" style="display: inline-block;" :id="con.id"
@click="playContent(con,conIdx,0)">
<!---->
<view :style="{width:scrollItemWidth+'px'}" class="scroll-item"
:class="{'color-studying':curContent.id==con.id}">
<view class="scroll-item-sec">{{ con.cataName }}
<!-- <text v-if="con.cataStatus && con.cataStatus==1" class="status-tag" :class="statusClass(con.cataStatus)">未开始</text>
<text v-if="con.cataStatus && con.cataStatus==2" class="status-tag" :class="statusClass(con.cataStatus)">进行中</text>
<text v-if="con.cataStatus && con.cataStatus==9" class="status-tag" :class="statusClass(con.cataStatus)">已完成</text> -->
</view>
<view class="scroll-item-con" :class="{'box-studying':curContent.id==con.id}">
<view class="scroll-item-name">
{{ con.contentName }}
</view>
<!-- <view class="scroll-item-type">
<view class="square-border">
<view :class="statusClass(con.status)">
{{getConType(con.contentType)}}
</view>
</view>
<text v-if="con.status==1" class="status-tag" :class="statusClass(con.status)">未开始</text>
<text v-if="con.status==2" class="status-tag" :class="statusClass(con.status)">进行中</text>
<text v-if="con.status==9" class="status-tag" :class="statusClass(con.status)">已完成</text>
</view> -->
</view>
</view>
</view>
<!-- </view> -->
</scroll-view>
</view>
</view>
</view>
</view>
<!--交互-->
<view class="cinfo-btns">
<view class="cinfo-btn" @click="openScore()">
<view>
<image src="/static/images/course/c_comment.png" style="width: 80upx;height: 80upx;"></image>
</view>
<view>评价</view>
</view>
<view class="cinfo-btn" @click="addFavorite()">
<view>
<image v-if="isFavorite" src="/static/images/course/c_favorite_2.png"
style="width: 80upx;height: 80upx;">
<image v-else src="/static/images/course/c_favorite.png" style="width: 80upx;height: 80upx;">
</view>
<view>
<text v-if="isFavorite">已收藏</text>
<text v-else>收藏</text>
</view>
</view>
<view class="cinfo-btn" @click="openShare()">
<view>
<image src="/static/images/course/c_share.png" style="width: 80upx;height: 80upx;">
</view>
<view>转发</view>
</view>
</view>
</view>
<!--评论-->
<view v-show="tabIndex==2" class="pinglun">
<comments ref="comments" v-if="courseId && courseId!=''" :objType="1" :objId="courseId"></comments>
<interact-fixed ref="fiexdbar" :type="1" :data="courseInfo" :users="teachers" :praises="false"
:favorites="false" :shares="false" :comments="false" @comment-success="refreshComments"
@share-success="shareSuccess"></interact-fixed>
</view>
</view>
<!--全部目录-->
<view v-else>
<view class="tabrow" style="justify-content: space-between;">
<view class="tabrow-item">
<text class="tabrow-active">目录</text>
</view>
<view @click="closeAllCatalog">
<image src="/static/images/close.png" style="width: 50upx;height: 50upx;"></image>
</view>
</view>
<view class="catalogbox">
<view v-if="courseInfo.type>10" class="catalog">
<view v-for="(cata,catIdx) in catalogTree" :key="catIdx"
style="border-bottom: 1px solid #ebebeb;padding-bottom: 30upx;">
<view class="catalog-sec" style="margin-bottom: 20rpx;">
<view class="catalog-sec-name">
<!-- <text>{{catIdx+1}}, </text> -->
<text class="text-ellipsis">{{ cata.section.name }}</text>
</view>
<view :class="{'color-studying':cata.section.status==2}">
<text v-if="cata.section.status==1" style="font-size: 14px;">未开始</text>
<text v-if="cata.section.status==2" style="font-size: 14px;">进行中</text>
<text v-if="cata.section.status==9" style="font-size: 14px;">已完成</text>
</view>
</view>
<view>
<view v-for="(con,conIdx) in cata.children" :key="conIdx" class="catalog-con"
@click="playContent(con,conIdx,catIdx)">
<view class="catalog-con-name" :class="{'color-studying':curContent.id==con.id}">
<text>{{ catIdx + 1 }}.{{ conIdx + 1 }}.</text>
<!-- <text class="square-border">{{getConType(con.contentType)}}</text> -->
<text class="text-ellipsis" style="font-size: 14px;">{{ con.contentName }}</text>
</view>
<view>
<text v-if="con.status==1" class="status-tag tag-nostart" style="font-size: 14px;">未开始</text>
<text v-if="con.status==2" class="status-tag tag-studying" style="font-size: 14px;">进行中</text>
<text v-if="con.status==9" class="status-tag tag-finish" style="font-size: 14px;">已完成</text>
</view>
</view>
</view>
</view>
</view>
<view v-else class="catalog">
<view>
<view v-for="(con,conIdx) in contentList" :key="conIdx" class="catalog-con"
@click="playContent(con,conIdx)">
<view class="catalog-con-name" :class="{'color-studying':curContent.id==con.id}">
<text>{{ conIdx + 1 }}.</text>
<!-- <text class="square-border">{{getConType(con.contentType)}}</text> -->
<text class="text-ellipsis" style="font-size: 14px;">{{ con.contentName }}</text>
</view>
<view>
<text v-if="con.status==1" class="status-tag tag-nostart" style="font-size: 14px;">未开始</text>
<text v-if="con.status==2" class="status-tag tag-studying" style="font-size: 14px;">进行中</text>
<text v-if="con.status==9" class="status-tag tag-finish" style="font-size: 14px;">已完成</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<!--推荐课程-->
<view v-if="tabIndex==1 && !catalogShow" style="padding: 30upx;background-color: #fff;">
<view style="color: #333333; font-size: 32upx;font-weight: 600;padding-bottom: 20upx;">课程推荐</view>
<course-list :items="recommendCourses"></course-list>
</view>
<!--弹出窗口-->
<!--课程简介-->
<u-popup :show="summarylogShow" mode="right" @close="summaryCatalog" :safeAreaInsetTop="true" :closeable="true">
<view class="summary-log" :style="`width: ${treePopupWidth};padding-top: 20px;`"
style="height: 100vh; overflow: auto;">
<!-- <view class=""> -->
<view class="particulars">课程详情</view>
<view class="matter">
<u-parse v-if="courseInfo.summary" :content="courseInfo.summary"></u-parse>
<text v-else>暂无</text>
</view>
<!-- </view> -->
</view>
</u-popup>
<!-- 评分赞和踩 -->
<u-popup :show="scoreInfo.dlgShow" mode="center" :closeable="false" :closeOnClickOverlay="false" :round="14"
@close="closeScore" @open="openScore">
<view class="dlgscore">
<view class="dlgscore-top">
<view class="dlgscore-title">课程评价</view>
<view class="dlgscore-desc">对课程进行评分吧</view>
<view class="dlgscore-score">
<u-rate :count="5" :size="35" activeColor="#F37101" v-model="scoreInfo.score"></u-rate>
</view>
</view>
<view class="dlgscore-btns">
<view class="dlgscore-cancel">
<text @click="closeScore">取消</text>
</view>
<view class="dlgscore-submit">
<text @click="addScore()">提交</text>
</view>
<!-- <u-button type="primary" @click="addScore()" text="提交评分"></u-button> -->
</view>
</view>
</u-popup>
<interact-share ref="comShare" :data="courseInfo" :type="1"></interact-share>
</view>
<!-- <u-popup :show="protocolDialogVisible" mode="center" :closeable="false" :closeOnClickOverlay="false" :round="14" @close="closeDialog">-->
<!-- <view class="dlgscore">-->
<!-- <view class="dlgscore-top">-->
<!-- <view class="dlgscore-title">{{warnTitle}}</view>-->
<!-- <view class="dlgscore-desc">{{warn}}</view>-->
<!-- </view>-->
<!-- <view class="dlgscore-btns">-->
<!-- <view class="dlgscore-submit">-->
<!-- <text @click="addScore()">确认</text>-->
<!-- </view>-->
<!-- &lt;!&ndash; <u-button type="primary" @click="addScore()" text="提交评分"></u-button> &ndash;&gt;-->
<!-- </view>-->
<!-- </view>-->
<!-- </u-popup>-->
</template>
<script>
import config from '@/config/index.js'
import apiCoursePortal from '@/api/modules/coursePortal.js'
import apiCourseStudy from '@/api/modules/courseStudy.js'
import apiVideoStudy from "@/api/modules/videoStudy.js";
import apiCourseGrade from "@/api/modules/courseGrade.js";
import apiCourseFile from "@/api/modules/courseFile.js";
import apiUser from '@/api/system/user.js';
import apiUserFollow from '@/api/phase2/userfollow.js'
import apiStat from '@/api/phase2/stat.js'
import apiResOwner from '@/api/modules/resowner.js'
import apiPraises from "@/api/modules/praises.js";
import apiTrample from "@/api/modules/trample.js";
import apiMessage from '@/api/system/message.js'
import apiFavorites from '@/api/modules/favorites.js'
import {getContentType} from "@/utils/tools.js";
import studyUtil from '@/utils/study.js';
import {toScore, cutOrgNamePath, formatUserNumber} from '@/utils/tools.js';
import {mapGetters, mapActions} from 'vuex'
export default {
data() {
return {
tentative: false,
isShowPdt: true,
progressData: 0,
contentTypeV: '',
trueFalse: true,
loading: false,//加载中
courseId: '',//当前课程的id
studyId: '',//当前学习的id
initContentId: '',//初始化的内容id
courseInfo: {id: '', name: '', score: 0},//课程信息
teachers: [],//课程老师列表
recommendCourses: [],//推荐课程列表
catalogShow: false,//是否显示目录
totalContent: 0,//课程内容数量
hasSection: false,//是否有目录
tabIndex: 1,//显示的tab内容
scoreInfo: {dlgShow: false, score: 0, has: false},//评分控制项
isPraise: false,//是否已点赞
isTrample: false,//是否已踩
isFavorite: false,//是否已收藏
isFollow: false,//是否已关注
myScore: 0,//我的评分如果是0表未评分
toScore: toScore,
formatUserNumber: formatUserNumber,
getConType: getContentType,
onplay: false,
touchNum: 0,
playerBoxShow: false,
summarylogShow: false,
scrollItemWidth: this.$width,
treePopupWidth: '400px',
fileBaseUrl: this.$config.fileUrl,
curSection: {},//当前所在的章
curContent: {id: '', studyItemId: '', status: 1},//当前的内容
conLink: {openType: 1, url: ''},//外连接内容
curriculumData: {url: '', isDrag: true, completeSetup: 1, setupTage: 0, second: 0},// 课件内容
authorInfo: {aid: '', name: '', code: '', orgInfo: ''},
sectionList: [],
contentList: [],
videoScore: 3,
videoPlayingTime: 0,
speedListShow: false,
speedList: ["2.0", "1.5", "1.25", "1.0", "0.75", "0.5"],
videoSpeed: 1.0, // 当前倍速:
interactRuning: false,
scrollInfo: {
scrollLeft: 0,
scrollWidth: 0
},
handleTimeout: null,
isAppendTime: true,
appendStartTime: null, //记录追加的开始时间
appendHandle: null,//追加学习时长的timeout句柄
appentId: '',//当前追加的学习时长的id
appentInterval: 15,//追加学习时间的间隔 3秒加一次
preTime: -1,
blobUrl: '',//音视频的播放地址
blobId: '',
localTimeKey: 'boeu-study-time',//本地存储的学习时长的key json格式
localTimeValue: 0,//计算的时间
appendStudyOtherHandle: null,
articleMore: true,
scormUrl: '',
maxDuration: 0, //非音频最大时长
cumulativeDuration: 0, //非音频累计时长
defaultMaxTime: 1800, //非音频默认最大时间
Internet: 3,//1是成功 2是是失败 3是检测中
protocolDialogVisible:false,
warn:"测试内容",
warnTitle:"测试提示",
renderCourse:true,
showNavbar: true
}
},
computed: {
...mapGetters(['userInfo', 'sysTypeMap']),
catalogTree() {
let treeList = [];
let $this = this;
$this.sectionList.forEach(sec => {
let treeNode = {section: sec, children: []}
sec.status = 1;
let finishCount = 0;
$this.contentList.forEach(c => {
if (c.csectionId == sec.id) {
if (c.status > 1) {
sec.status = 2;
if (c.status == 9) {
finishCount++;
}
}
treeNode.children.push(c);
}
});
if (finishCount == treeNode.children.length) {
sec.status = 9;
}
treeList.push(treeNode);
})
return treeList;
},
scrollList() {
let list = [];
this.catalogTree.forEach((cata) => {
cata.children.forEach((child, childIdx) => {
if (childIdx == 0) {
child.cataName = cata.section.name;
child.cataStatus = cata.section.status;
} else {
child.cataName = '';
}
list.push(child)
})
});
return list;
},
},
onLoad(options) {
this.getInternet();
//this.$watermark.set(this.userInfo.name+ this.userInfo.loginName);
this.scrollItemWidth = (this.$width - 100) / 2;//横向滚动的内容块宽度
this.treePopupWidth = (this.$width - 100) + 'px'; //右边出来的抽屉宽度控制
if (options.contentId) {
this.initContentId = options.contentId;
}
this.courseId = options.id;
this.courseInfo.id = options.id;
this.loadDetail();//加载课程数据
this.getSysTypeTree();
this.loadSysTypes();
this.loadReCourses();//加载推荐课程
this.loadIsData();//加载关注,收藏,评价等信息
this.loadMyScore();
},
onShow() {
uni.setNavigationBarTitle({title: '\u200E'})
//实时渲染当前的播放状态
},
onReady() {
},
onHide() {
//清除定时任务,隐藏的时候不清除,因为没有停止播放
// this.clearTimeHandle();
console.log('触发onHide');
},
destroyed() {
this.clearTimeHandle();
},
methods: {
...mapActions({
// getResOwnerTree:'resOwner/getResOwnerTree',
// loadResOwners:'resOwner/loadResOwners',
getSysTypeTree: 'sysType/getSysTypeTree',
loadSysTypes: 'sysType/loadSysTypes'
}),
// 没有写播放时间
onPlayerPlay() {
console.log(`start play`)
this.playerBoxShow = false;
this.isAppendTime = true;
this.appendStudyTime();//启动追加学习时长
},
convertTypeName(code) {
if (!code) {
return '';
}
return this.sysTypeMap.get(code);
},
clearTimeHandle() {
if (this.appendStudyOtherHandle != null) {
window.clearTimeout(this.appendStudyOtherHandle);
}
if (this.appendHandle != null) {
window.clearTimeout(this.appendHandle);
}
if (this.handleTimeout != null) {
window.clearTimeout(this.handleTimeout);
}
},
getXmlHttpRequest() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
else if (window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
},
// 检测是否为内网
getInternet() {
this.Internet = 3;
let $this = this;
let xmlhttp = this.getXmlHttpRequest();
let timedOut = false;
let timer = setTimeout(function () {
timedOut = true;
xmlhttp.abort();
}, 1000);
xmlhttp.open("HEAD", window.location.protocol + "//uapi.boe.com.cn/500.html", true);
xmlhttp.send();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
clearTimeout(timer);
$this.Internet = 1;
} else {
clearTimeout(timer);
// $this.protocolDialogVisible=true
$this.Internet = 2;
}
} else {
if (timedOut) return;//忽略中止请求
clearTimeout(timer);//取消等待的超时
}
}
},
iframeScormLoad() {
setTimeout(function () {
var scormIframe = document.getElementById('iframe-scorm');
if (scormIframe) {
let iframeWin = scormIframe.contentWindow;
let iframeDoc = scormIframe.contentDocument || scormIframe.document;
let cHeight = Math.max(iframeDoc.body.clientHeight, iframeDoc.documentElement.clientHeight);
let sHeight = Math.max(iframeDoc.body.scrollHeight, iframeDoc.documentElement.scrollHeight);
let winHeight = iframeWin.document.documentElement.scrollHeight || iframeWin.document.body.scrollHeight;
let lheight = Math.max(cHeight, sHeight);
let finalHeight = Math.max(lheight, winHeight);
scormIframe.height = finalHeight;
console.log('scormIframe.height', scormIframe.height);
}
}, 1500);
},
loadMyScore() {
apiCourseGrade.score({courseId: this.courseId}).then(rs => {
if (rs.status == 200) {
this.myScore = rs.result.scores;
this.scoreInfo.has = true;
}
})
},
loadDetail() {
let $this = this;
uni.showLoading({title: '加载中...'})
apiCourseStudy.studyIndex(this.courseId).then(rs => {
console.log("是这个")
if (rs.status != 200) {
uni.hideLoading();
uni.showToast({title: rs.message, type: 'fail'});
//$this.$refs.messager.show({message:rs.message,type:'error'});
return;
}
if (rs.result.contents.length == 0) {
//$this.$refs.messager.show({message:'课程内容已删除或课程已不再使用',type:'error'});
uni.showToast({title: '课程内容已删除或课程已不再使用', type: 'fail'});
return;
}
if (!rs.result.course.enabled) {
uni.showToast({title: '十分抱歉,此课程已停用,如需使用,请联系管理员。', type: 'fail'});
//$this.$refs.messager.show({message:'十分抱歉,此课程已停用,如需使用,请联系管理员。',type:'error'});
return;
}
if (!rs.result.isPermission || (rs.result.isPermission && this.Internet==1)){
// this.getInternet()
this.renderCourse = true
}else{
// this.Internet=1;
this.renderCourse = false
// this.protocolDialogVisible=true
}
$this.courseInfo = rs.result.course;
//$this.scoreInfo.score=rs.result.course.score;
//处理老师数据
if (rs.result.teachers && rs.result.teachers.length > 0) {
let userIds = [];
//let ctoUsers = [];
rs.result.teachers.forEach(item => {
item.followed = false;
item.name = '';
item.orgInfo = '';
item.avatar = '';
item.code = '';
item.sex = null;
userIds.push(item.teacherId);
//检查是否已关注
apiUserFollow.has(item.teacherId).then(followRs => {
if (followRs.status == 200 && followRs.result) {
item.followed = true;
}
})
});
$this.loadAuthorInfo(rs.result.teachers, userIds);
$this.teachers = rs.result.teachers;
}
let showConId = this.initContentId;
//console.log(showConId,'showConId');
if (rs.result.course.type > 10) {
rs.result.sections.forEach(sec => {
sec.status = 1;//加入状态表未开始
rs.result.contents.forEach(c => {
c.status = 1;//初始化状态 ,未开始
c.studyItemId = '';//初始化字段学习条目id
c.lastStudyTime = 0;
if (showConId != '' && c.id == showConId) {
$this.curContent = c;
$this.curSection = sec;
}
});
})
} else if (rs.result.course.type == 10) {
let indexNum = 0;
let delIndexs = [];
rs.result.contents.forEach((c, cidx) => {
c.status = 0; //
c.studyItemId = '';
c.lastStudyTime = 0;
if (c.sortIndex == 1) {
c.contentName = rs.result.course.name;
indexNum++;
if (indexNum > 1) {
delIndexs.push(cidx);
}
} else if (c.sortIndex == 2) {
c.contentName = '作业';
} else if (c.sortIndex == 3) {
c.contentName = '考试';
} else if (c.sortIndex == 4) {
c.contentName = '评估';
}
});
if (delIndexs.length > 0) {
delIndexs.forEach(delIdx => {
rs.result.contents.splice(delIdx, 1);
})
}
//定位初始化数据
rs.result.contents.forEach((c, cidx) => {
if (showConId != '' && c.id == showConId) {
$this.curContent = c;
}
})
}
this.contentList = rs.result.contents;//内容列表
this.totalContent = rs.result.contents.length;//一共有向个可以播放的内容
this.sectionList = rs.result.sections;
//处理学习内容
this.studyId = rs.result.studyId;
this.contentList.forEach(con => {
con.progressVideo = con.progressVideo || 0;
rs.result.contentStudys.forEach((scon, sconIdx) => {
//第一条就是最近学习的
if (sconIdx == 0 && $this.initContentId == '') {
//$this.curContent=con;
//查询对应的章节
}
if (scon.contentId == con.id) {
con.lastStudyTime = scon.lastStudyTime;
con.progressVideo = scon.progressVideo || 0;
//以下判断是为了兼容之前的问题,学习状态
if (scon.status) {
con.status = scon.status;
} else {
con.status = 9;
}
con.studyItemId = scon.id;//这个就是学习内容条目的id
}
})
});
//设置正在学习的章节
if (this.curContent.id) {
this.playContent(this.curContent, 0);
//this.curSection=this.sectionList[0];
} else {
let treelist = this.catalogTree;
//console.log(treelist,'treelist')
if (treelist.length > 0) {
this.curSection = treelist[0].sec;
this.curContent = treelist[0].children[0];
} else {
this.curContent = this.contentList[0];
this.curSection = this.sectionList[0];
}
//要不要在这里处理?
// if(this.curContent.contentType==10 || this.curContent.contentType==20){
// if(this.contentList[0].content.startsWith('\{')){
// this.curriculumData=JSON.parse(this.contentList[0].content);
// }else{
// this.curriculumData.url=this.contentList[0].content;
// }
// }
//this.curContent=this.contentList[0];
this.playContent(this.curContent, 0);
}
uni.hideLoading();
});
},
playContent(con, conIndex, catIndex) {
this.isShowPdt = true
// 视频设置禁用处理逻辑,如果用户已全部观看完该视频则设置为能全部拖动的逻辑把isDrag设置为true即可,同时删除本地存储的数据
if (con.progressVideo === 1) {
var obj = JSON.parse(con.content)
obj.isDrag = true
con.content = JSON.stringify(obj)
var time = localStorage.getItem('videoProgressData')
var arr = time && JSON.parse(time) || {}
//alert(con.progressVideo+'--'+con.id + '--'+JSON.stringify(arr))
delete arr[con.id];
localStorage.setItem('videoProgressData', JSON.stringify(arr))
}
if (con.progressVideo > 0 && con.progressVideo !== 1) {
var time = localStorage.getItem('videoProgressData')
var arr = time && JSON.parse(time) || {}
arr[con.id] = con.progressVideo
localStorage.setItem('videoProgressData', JSON.stringify(arr))
}
console.log('更换播放内容 playContent::', con, conIndex, catIndex)
//对于需要控制学习顺序的
if (conIndex != undefined && catIndex != undefined) {
if (this.courseInfo.orderStudy) {
let hasIndex = -1;
this.scrollList.some((one, idx) => {
if (one.id == con.id) {
hasIndex = idx;
return true;
}
return false;
})
if (hasIndex > 0) {
let pre = this.scrollList[hasIndex - 1];
if (pre.status != 9) {
//uni.showToast({title:'请按顺序学习',type:'fail'});
this.$refs.messager.show({message: '请按顺序学习', type: 'error'});
return;
}
}
}
}
//切换播放内容
this.changePlayRes(con);
},
loadReCourses() {
let dto = {
sysType1: this.courseInfo.sysType1,
sysType2: this.courseInfo.sysType2,
sysType3: this.courseInfo.sysType3
}
apiCoursePortal.recommendList(dto).then(rs => {
if (rs.status == 200) {
this.recommendCourses = rs.result;
}
})
},
loadAuthorInfo(list, ids) {
//加载作者信息,头像,机构信息
if (ids.length == 0) {
return;
}
apiUser.getByIds(ids).then(res => {
if (res.status == 200) {
list.forEach((item, index) => {
res.result.some(author => {
if (author.aid == item.teacherId) {
item.name = author.name;
item.orgInfo = cutOrgNamePath(author.orgInfo);
item.avatar = author.avatar;
item.code = author.code;
item.sex = author.sex;
if (author.avatar != '') {
item.avatar = this.$config.fileUrl + author.avatar;
}
return true;
} else {
return false;
}
});
});
} else {
//console.log('加载课程信息失败:'+res.error);
//this.$message.error(res.message);
}
});
},
loadUserInfo(uid) {
apiUser.getByIds([uid]).then(res => {
if (res.status == 200) {
this.authorInfo = res.result[0];
}
})
},
loadIsData() {
//加载是否关注,是否收藏,是否评价等
apiFavorites.has(1, this.courseId).then(rs => {
if (rs.status == 200 && rs.result) {
this.isFavorite = true;
} else {
this.isFavorite = false;
}
})
// apiCourseGrade.has(this.courseId).then(rs=>{
// if(rs.status==200 && rs.result){
// this.scoreInfo.has=true;
// }
// });
apiPraises.has(1, this.courseId).then(rs => {
if (rs.status == 200 && rs.result) {
this.isPraise = true;
}
});
apiTrample.has(this.courseId).then(rs => {
if (rs.status == 200 && rs.result) {
this.isTrample = true;
}
});
},
//更换播放内容
changePlayRes(con) {
this.tentative = false;
this.trueFalse = true;
this.videoPlayingTime = 0
this.scormUrl = '';//清空地址
this.articleMore = true;
this.clearTimeHandle();
//this.curContent=0;
// console.log(con,'con');
this.playerBoxShow = false;
if (con.contentType == 40) {
//如果是文档需要再次加载pdf
if (con.content != '' && con.content.indexOf('.pdf') == -1) {
// 先置空,否则会有延迟
con.content = '';
apiCourseFile.detail(con.contentRefId).then(cfrs => {
if (cfrs.status == 200) {
con.content = cfrs.result.previewFilePath;
//console.log(r.content);
} else {
$this.$refs.messager.show({message: '加载pdf课件文件失败', type: 'error'});
}
});
}
if (con.content == '') {
apiCourseFile.detail(con.contentRefId).then(cfrs => {
if (cfrs.status == 200) {
con.content = cfrs.result.previewFilePath;
} else {
$this.$refs.messager.show({message: '加载pdf课件文件失败', type: 'error'});
}
});
}
} else if (con.contentType == 50) { //scorm课件的内容
apiCourseFile.detail(con.contentRefId).then(cfrs => {
if (cfrs.status == 200) {
//this.curCFile = cfrs.result;
//this.scormUrl=cfrs
let pars = '?mode=normal&r=' + Math.random();
pars += '&scormId=' + cfrs.result.id;
pars += '&courseId=' + this.courseId;
pars += '&contentId=' + con.id;
pars += '&studentId=' + this.userInfo.aid;
pars += '&studentName=' + encodeURIComponent(this.userInfo.name);
pars += '&lmsId=' + this.studyId;
pars += '&scoId=';//不指定scorm模块自动根据学习记录定位
pars += '&r=' + Math.random();//加一个随机数,以便重新加载
let urlPre = window.location.protocol;
let configUrl = config.scormPlayer;
configUrl = urlPre + configUrl.substring(configUrl.indexOf(':') + 1);
this.scormUrl = configUrl + pars;//播放的首页
console.log(this.scormUrl, 'this.scormUrl')
}
});
} else if (con.contentType == 52) {
if (con.content.startsWith('\{')) {
this.conLink = JSON.parse(con.content);
} else {
this.conLink.url = con.content;
this.conLink.openType = 1;
}
// todo: 暂时不知道这个 52 是干嘛的, 先写死吧
// if (this.conLink.openType == 2) {
//新的窗口直接打开
const url = this.conLink.url
console.log(`------- current url is : `, url)
if (url.includes("/mobile")) {
setTimeout(() => window.open(url.replace("/mobile", ""), "_top"))
} else {
location.href = url
}
// }
} else if (con.contentType == 10 || con.contentType == 20) {
if (con.content.startsWith('\{')) {
var d = JSON.parse(con.content)
// if(d.url=="/course/2024/4/1224670812274712576.mp4") d.isDrag = false
this.curriculumData = d;
} else {
this.curriculumData.url = con.content;
}
console.log('this.curriculumData:::', this.curriculumData)
this.blobUrl = this.fileBaseUrl + this.curriculumData.url;
this.blobId = con.id;
}
//console.log(con.contentType,'con.contentType');
this.curContent = con;
this.catalogShow = false;
this.scoreInfo.itemId = con.id;
if (this.curContent.status < 2) {
this.curContent.status = 2; //设置状态 进行中
}
//横向滚动条定位
let len = 0;
this.scrollList.some((sitem, idx) => {
if (sitem.id == con.id) {
len = idx;
return true;
}
return false;
})
this.scrollInfo.scrollLeft = len * this.scrollItemWidth + len * 6;
//50事scorm项目单独计时
if (con.contentType > 20 && con.contentType !== 50) {
let $this = this;
//用户的学习时长,音视频课程学习,单独的处理,不再追加学习时长
this.isAppendTime = false;
this.appendStudyOtherHandle = setTimeout(function () {
// 开始之前把响应式清空
$this.maxDuration = 0;
$this.cumulativeDuration = 0;
// 没有设置默认时长三十分钟,
$this.maxDuration = con.duration !== 0 ? con.duration * 2 : $this.defaultMaxTime;
//静默处理
apiStat.sendEvent({
"key": "StudyCourse",//课程学习的key
"title": "学习课程",//事件的标题
"parameters": "second:15",//second:value,total:value 本次的学习时长
"content": "学习课程【" + $this.courseInfo.name + "】",//事件的内容
"objId": $this.courseInfo.id,//课程的id
"objType": "1",//类型
"source": "h5",
"objInfo": "" + $this.courseInfo.name,
"aid": $this.userInfo.aid, //当前登录人的id
"aname": $this.userInfo.name,//当前人的姓名
"status": 1 //状态
}).then(rs => {
if (rs.status !== 200) {
console.log(rs.message);
}
});
$this.appendStudyOtherTime();
}, 1000 * 15); //非音视频课程学习,15秒后记录因为一次记录是60秒
//this.appendStudyTime();
//非视频音频的5秒后学习完成
if (con.contentType != 50) {
this.handleTimeout = setTimeout(function () {
$this.saveStudyInfo();
}, 5000);//5秒后记录学习完成
} else {
//scorm课件不记录完成情况由播放回调记录完成情况
//当前先保存学习记录,未学习状态
this.saveScormStudy();
}
}
// 切换课程之后 studyItemId 没有及时清理, 导致 chrome 系列的浏览器
// 切换课程之后不会重新计算观看时间位置
this.curContent.studyItemId = ''
},
followUser(tea) {
//实现关注处理
if (tea.followed) {
apiUserFollow.remove(tea.teacherId).then(rs => {
if (rs.status == 200) {
tea.followed = false;
this.$refs.messager.show({message: '取消关注', type: 'success'});
} else {
this.$refs.messager.show({message: rs.message, type: 'error'});
}
})
} else {
apiUserFollow.save(tea.teacherId).then(rs => {
if (rs.status == 200) {
tea.followed = true;
this.$refs.messager.show({message: '关注成功', type: 'success'});
} else {
this.$refs.messager.show({message: rs.message, type: 'error'});
}
})
}
},
goTop() {
window.scrollTo(0, 0);
this.showAllCatalog()
this.isShowPdt = false
},
changeTab(idx) {
this.tabIndex = idx;
},
showAllCatalog() {
this.catalogShow = true;
//定位目录
},
closeAllCatalog() {
this.catalogShow = false;
this.isShowPdt = true
//定位目录
},
openScore() {
//显示评分弹窗
if (this.scoreInfo.has) {
this.$refs.messager.show({message: '您已评过分', type: 'error'});
return;
}
this.scoreInfo.dlgShow = true;
},
closeScore() {
this.scoreInfo.dlgShow = false;
},
closeDialog(){
this.protocolDialogVisible=false;
},
addScore() {
if (this.scoreInfo.has) {
this.$refs.messager.show({message: '您已评过分', type: 'error'});
this.scoreInfo.dlgShow = false;
return;
}
let postData = {
courseId: this.courseInfo.id,
studyId: this.studyId,
score: this.scoreInfo.score
}
if (this.scoreInfo.score > 0) {
apiCourseGrade.grade(postData).then(rs => {
if (rs.status == 200) {
this.scoreInfo.dlgShow = false;
this.scoreInfo.has = true;
if (this.courseInfo.score == 0) {
this.courseInfo.score = postData.score;
}
if (this.myScore == 0) {
this.myScore = postData.score;
}
this.$refs.messager.show({message: '评分成功,谢谢您的评分', type: 'success'});
//发送评分事件
let event = {
key: "ScoreCourse", //后台的事件key 发布文章且审核通过
title: "完成课程评分", //事件的标题
source: "h5",//移动端是2
parameters: "", //用户自定义参数 name:value,name:value
content: "给课程评分", //事件的内容
objId: this.courseInfo.id, //关联的id
objType: 1, //关联的类型
objInfo: this.courseInfo.name,
aid: this.userInfo.aid, //当前登录人的id
aname: this.userInfo.name, //当前人的姓名
status: 1 //状态直接写1
}
apiStat.sendEvent(event);
} else {
this.$refs.messager.show({message: '评分分处理失败,请稍后再试', type: 'error'});
}
});
}
},
openComment() {
//打开评论窗口,调用组件内事件
this.$refs.fiexdbar.openInput();
},
refreshComments() {
this.$refs.comments.loadData(false);
},
openShare() {
//console.log(this.$refs.fiexdbar,'this.$refs.fiexdbar');
//因为开始是v-if控制的所以这里获取不到必须显示时才会获取到所以需要单独的弄一个分享组件
this.$refs.comShare.openShare();
},
shareSuccess(rs) {
this.$refs.messager.show({message: '分享成功', type: 'success'});
},
addFavorite() {
if (this.loading) {
return;
}
this.loading = true;
uni.showLoading({title: '处理中...'})
let firstTeacher = {};
if (this.teachers.length > 0) {
firstTeacher = this.teachers[0];
}
//需要判断是否已点赞,已点赞的不再加
let postData = {
objType: 1,
objId: this.courseId,
title: this.courseInfo.name,
}
if (this.isFavorite) {// 已经收藏,再次点击取消收藏
apiFavorites.remove(1, this.courseId).then(res => {
this.loading = false;
if (res.status == 200) {
this.isFavorite = false;
this.$refs.messager.show({message: '已取消收藏', type: 'success'});
} else {
console.log('取消收藏失败:' + res.message);
}
uni.hideLoading();
})
} else {
apiFavorites.save(postData).then(res => {
this.loading = false;
if (res.status == 200 && res.result) {
this.isFavorite = true;
this.$refs.messager.show({message: '已加入收藏', type: 'success'});
//发送消息
let message = {
content: this.userInfo.name + '收藏了我的课程-' + this.courseInfo.name,
refId: this.courseInfo.id,
refType: 1,
source: 1,
pageType: 1,
pageParams: this.courseInfo.id,
sendAid: this.userInfo.aid,
sendName: this.userInfo.name,
acceptName: firstTeacher.teacherName,
acceptId: firstTeacher.teacherId,
title: '系统消息',
sendType: 1,
conType: this.courseInfo.type,
}
apiMessage.save(message).then(res => {
if (res.status != 200) {
console.log('发送消息失败')
}
})
} else {
this.$refs.messager.show({message: '收藏失败', type: 'error'});
console.log('加入收藏失败:' + res.message);
}
uni.hideLoading();
})
}
},
praiseContent() {
//赞和踩只能是一个
if (this.isTrample) {
this.$refs.messager.show({message: '已踩不能赞了', type: 'error'});
return;
}
let postData = {
objType: 1,
objId: this.courseInfo.id,
title: this.courseInfo.name
}
if (this.interactRuning) {
return;
}
this.interactRuning = true;
let firstTeacher = {};
if (this.teachers.length > 0) {
firstTeacher = this.teachers[0];
}
if (this.isPraise) {
apiPraises.remove(1, this.courseInfo.id).then(rs => {
this.interactRuning = false;
if (rs.status == 200) {
this.$refs.messager.show({message: '已取消点赞', type: 'success'});
this.isPraise = false;
this.courseInfo.praises--;
let event = {
key: "CancelPraise",//点赞
title: "取消点赞",//事件的标题
parameters: "author:" + firstTeacher.teacherId,//用户自定义参数 name:value,name:value
content: "取消点赞课程",//事件的内容
source: "h5",//移动端是2
objId: this.courseId,//关联的id
objType: "1",//关联的类型
objInfo: this.courseInfo.name,
aid: this.userInfo.aid, //当前登录人的id
aname: this.userInfo.name,//当前人的姓名
status: 1 //状态直接写1
}
apiStat.sendEvent(event);
} else {
this.$refs.messager.show({message: '取消点赞失败,请稍后再试', type: 'success'});
}
})
} else {
apiPraises.save(postData).then(rs => {
this.interactRuning = false;
if (rs.status == 200) {
this.$refs.messager.show({message: '点赞成功', type: 'success'});
this.isPraise = true;
this.courseInfo.praises++;
let event = {
key: "Praise",//点赞
title: "点赞",//事件的标题
parameters: "author:" + firstTeacher.teacherId,//用户自定义参数 name:value,name:value
content: "点赞了课程",//事件的内容
source: "h5",//移动端是2
objId: this.courseInfo.id,//关联的id
objType: "1",//关联的类型
objInfo: this.courseInfo.name,
aid: this.userInfo.aid, //当前登录人的id
aname: this.userInfo.name,//当前人的姓名
status: 1 //状态直接写1
}
apiStat.sendEvent(event);
let message = {
content: this.userInfo.name + '点赞了我的课程-' + this.courseInfo.name,
refId: this.courseInfo.id,
refType: 1,
source: 1,
pageType: 1,
pageParams: this.courseInfo.id,
sendAid: this.userInfo.aid,
sendName: this.userInfo.name,
acceptName: firstTeacher.teacherName,
acceptId: firstTeacher.teacherId,
title: '系统消息',
sendType: 1,
conType: this.courseInfo.type,
}
apiMessage.save(message).then(res => {
if (res.status != 200) {
console.log('发送消息失败')
}
})
} else {
this.$refs.messager.show({message: '点赞失败,请稍后再试', type: 'success'});
}
})
}
},
treadContent() {
//赞和踩只能是一个
if (this.isPraise) {
this.$refs.messager.show({message: '已赞不能踩了', type: 'error'});
return;
}
if (this.interactRuning) {
return;
}
this.interactRuning = true;
if (this.isTrample) {
//取消
apiTrample.remove(this.courseInfo.id).then(rs => {
this.interactRuning = false;
if (rs.status == 200) {
this.$refs.messager.show({message: '已取消踩', type: 'success'});
this.isTrample = false;
this.courseInfo.trampleCount--;
} else {
this.$refs.messager.show({message: '取消踩失败,请稍后再试', type: 'error'});
}
})
} else {
apiTrample.trample(this.courseInfo.id).then(rs => {
this.interactRuning = false;
if (rs.status == 200) {
this.$refs.messager.show({message: '已踩', type: 'success'});
this.isTrample = true;
this.courseInfo.trampleCount++;
} else {
this.$refs.messager.show({message: '踩失败,请稍后再试', type: 'error'});
}
})
}
},
scrollHandler(e) {
//console.log(e);
this.scrollInfo = e.detail;
},
//以下是播放相关的处理
saveStudyDuration(duration) { //保存本地存储的学习时长
if (duration > 0) {
//发送用户学习事件
//console.log('保存到后台学习时长='+duration);
let postData = {
"key": "StudyCourse",//课程学习的key
"title": "学习课程",//事件的标题
"parameters": "second:" + duration,//second:value,total:value 本次的学习时长
"content": "学习课程【" + this.courseInfo.name + "】",//事件的内容
"objId": this.courseInfo.id,//课程的id
"objType": "1",//类型
"source": "h5",
"objInfo": "" + this.courseInfo.name,
"aid": this.userInfo.aid, //当前登录人的id
"aname": this.userInfo.name,//当前人的姓名
"status": 1 //状态
}
//静默处理
apiStat.sendEvent(postData).then(rs => {
if (rs.status == 200) {
//this.appendStartTime = new Date();//重新计时
studyUtil.clearStudyDuration(); //清除本地存储
} else {
console.log(rs.message);
}
});
}
},
//结束追加学习时长
stopStudyTime() {
//console.log('停止追加学习时长');
this.isAppendTime = false;
//暂停让他为空 从新计时
this.appendStartTime = null
if (this.appendHandle != null) {
window.clearTimeout(this.appendHandle);
}
},
//追加学习时长, flag是否提交到后台
appendStudyTime() {
// 暂停的时候重新从十五秒开始
if (!this.appendStartTime) {
this.appentInterval = 15
}
//重新覆盖时间
this.appendStartTime = new Date();
//console.log('开始追加学习时长',this.isAppendTime);
if (this.studyId == '') {
console.warn(`this.studyId == ''`, this.studyId)
return;
}
if (!this.curContent.id) {
console.warn(`this.curContent.id`, this.studyId)
return;
}
//清除之前的
if (this.appendHandle != null) {
console.warn(`timer clear`)
window.clearTimeout(this.appendHandle);
}
if (!this.isAppendTime) {
console.warn(`this.isAppendTime` , false)
return;
}
//启动下次追加学习时长
this.appendHandle = setTimeout(() => {
let endTime = new Date().getTime();
this.appentInterval = 60;
let duration = Math.round((endTime - this.appendStartTime) / 1000);
this.appendStudyTime();
this.saveStudyDuration(duration);
}, this.appentInterval * 1000);
},
// appendStudyTime() {
// //console.log('开始追加学习时长',this.isAppendTime);
// if (this.studyId == '') {
// return;
// }
// if (!this.curContent.id) {
// return;
// }
// //清除之前的
// if(this.appendHandle != null) {
// window.clearTimeout(this.appendHandle);
// }
// if (!this.isAppendTime) {
// this.appendStartTime = null;
// return;
// }
// //首先从本地读取
// let duration = studyUtil.getStudyDuration();
// //console.log('追加学习时长,当前本地积累的学习时长='+duration);
// //追加学习长
// let $this = this;
// if (this.appendStartTime == null) {
// this.appendStartTime = new Date();
// this.appendHandle = setTimeout(function() {
// $this.appendStudyTime();
// }, $this.appentInterval); //设置定时追加学习时长
// //保存之前的
// if (duration >= 60 ) {
// this.saveStudyDuration(duration);
// }
// return;
// }
// //如果当前追加开始时间不为空
// let now = new Date();
// let m = now.getTime() - this.appendStartTime.getTime(); //相差的毫秒数
// let sen = Math.round(m / 1000); //计算秒数
// // 每次添加的是定时器计时的时间
// duration = duration + sen;//追加的是秒
// if (duration >= 60) { //一分钟保存一次
// this.saveStudyDuration(duration);
// } else {
// studyUtil.setStudyDuration(duration); //添加到本地存储中
// }
// //重新覆盖时间
// this.appendStartTime = new Date();
// //启动下次追加学习时长
// this.appendHandle = setTimeout(function() {
// $this.appendStudyTime();
// }, $this.appentInterval);
// },
appendStudyOtherTime() { //非音视频课学习时长的增加,每一分钟保存一次
//console.log('开始追加学习时长',this.isAppendTime);
if (this.studyId == '') {
return;
}
if (!this.curContent.id) {
return;
}
//每一分钟保存一次
// 取消阅读的每分钟六十秒的计时,最多是设置的时间或默认时间
let $this = this;
let startTime = new Date().getTime();
this.appendStudyOtherHandle = setTimeout(function () {
let endTime = new Date().getTime();
let totalTime = Math.round((endTime - startTime) / 1000);
$this.cumulativeDuration += totalTime;
if ($this.cumulativeDuration <= $this.maxDuration) {
//静默处理
$this.sendOtherTime(totalTime)
$this.appendStudyOtherTime();
} else {
clearTimeout(this.appendStudyOtherHandle);
$this.cumulativeDuration = 0;
$this.maxDuration = 0;
}
}, 1000 * 60);
},
sendOtherTime(totalTime) {
apiStat.sendEvent({
"key": "StudyCourseOther",//课程学习的key
"title": "非音视频课内容",//事件的标题
"parameters": "second:" + totalTime,//second:value 本次的学习时长
"content": "学习课程",//事件的内容
"objId": this.courseInfo.id,//课程的id
"objType": "1",//类型
"source": "h5",
"objInfo": "" + this.courseInfo.name,
"aid": this.userInfo.aid, //当前登录人的id
"aname": this.userInfo.name,//当前人的姓名
"status": 1 //状态
}).then(rs => {
if (rs.status != 200) {
console.log(rs.message);
}
});
},
//先保存学习的内容,针对于音视频的内容
saveStudyItem() {
if (this.curContent.studyItemId) {
return;//已经有记录的,不需要再保存了
}
let params = {
studyId: this.studyId, //学习id,
courseId: this.courseId, //课程id,
contentId: this.curContent.id, //内容id,
contentType: this.curContent.contentType, //内容id,
contentName: this.curContent.contentName, //内容名称
progress: 0,
lastStudyTime: 0,
status: 2,
studyDuration: 0,
contentTotal: this.totalContent
};
apiVideoStudy.saveStudyItem(params).then(res => {
if (res.status == 200) {
this.curContent.studyItemId = res.result.id;
this.curContent.status = 2;//进行中状态
} else {
console.log("记录学习失败:" + res.message + "" + res.error);
}
});
},
finishStudyItem() { //设置完成学习的内容,针对于音视频的内容
if (!this.curContent.studyItemId) { //临时方案避免重复调用
//这种可能没有不过这里也是为了万中那个1
!this.tentative && this.saveStudyInfo();
} else {
let params = {
itemId: this.curContent.studyItemId,
studyId: this.studyId,
courseId: this.courseId,
cnum: this.totalContent
}
apiVideoStudy.finishStudyItem(params).then(res => {
if (res.status == 200) {
this.curContent.status = 9;
this.curContent.progress = 100;
} else {
console.log("记录完成学习失败:" + res.message + "" + res.error);
}
});
}
},
onFullScreen(screen) {
console.log("video screen status", screen)
// debugger
this.showNavbar = !screen
},
onPlayerPause() {
this.stopStudyTime();
},
onPlayerEnded() {
this.playerBoxShow = true;
this.stopStudyTime();
if (this.curContent.status < 9) {
this.finishStudyItem();
}
},
onPlayerPlaying(e) {
if (!this.curContent.studyItemId || (e.detail.currentTime > 2 && this.trueFalse && this.curContent.status < 9)) {
let params = {
studyId: this.studyId,//学习id,
courseId: this.courseId,//课程id,
contentId: this.curContent.id,//内容id,
contentType: this.curContent.contentType,
contentName: this.curContent.contentName,//内容名称
progress: 1,
status: 2,
contentTotal: this.totalContent
}
apiCourseStudy.studyContent(params).then(res => {
if (res.status == 200) {
this.curContent.status = 9;//完成
this.curContent.studyItemId = res.result;//学习记录id
} else {
console.log('记录学习失败:' + res.message + '' + res.error);
}
})
this.trueFalse = false
}
//console.log("当前播放11",itme);
// console.log("当前播放11"+itme);
let intTime = parseInt(e.detail.currentTime);
if (intTime > this.videoPlayingTime) {
this.videoPlayingTime = intTime;
//判断是否完成
let completeType = this.curriculumData.completeSetup;
let completeSecond = this.curriculumData.second;
if (!completeSecond || completeType == 0) {
completeSecond = 5; //如果没有就采用默认的时间了
}
if (this.curContent.status < 9) { //因为1按进度2按时长都是计算时间所以这里直接大于0处理
if (completeType == 1) {
let finishPercent = this.curriculumData.setupTage;
let videDuration = this.curContent.duration;
let percent = intTime * 100 / videDuration;
if (percent >= finishPercent) {
this.finishStudyItem();
}
} else {
if (intTime >= completeSecond) {
this.finishStudyItem();
}
}
}
}
//以下是每隔10秒存储一下进度
let saveTime = Math.floor(intTime % 10);
console.warn(intTime,saveTime,'aa',this.curContent.studyItemId)
if (this.preTime != intTime && saveTime == 0 && this.curContent.studyItemId != '') {
this.preTime = intTime;
this.curContent.lastStudyTime = intTime;
//记录播放时间
console.log('记录播放时间:'+intTime);
let postData = {
itemId: this.curContent.studyItemId,
videoTime: intTime,
id: this.appentId,
studyId: this.studyId,
courseId: this.curContent.courseId,
contentId: this.curContent.id,
studyInfo: this.courseInfo.name + "-" + this.curContent.contentName,
duration: 10
}
//alert(3+'--'+this.curriculumData.isDrag +'---'+this.curContent.progressVideo)
if (!this.curriculumData.isDrag && this.curContent.progressVideo != 1) {
var time = localStorage.getItem('videoProgressData')
var arr = time && JSON.parse(time) || {}
console.log('this.curContent.progressVideo::', arr[this.blobId], this.curContent.progressVideo, arr[this.blobId])
if (arr[this.blobId] && this.curContent.progressVideo < arr[this.blobId]) {
postData.progressVideo = arr[this.blobId]
// postData.contentId = this.curContent.id
// postData.courseId = this.curContent.courseId
}
}
//alert(intTime+'----'+this.videoPlayingTime)
apiCourseStudy.updateStudyVideoTime(postData).then(rs => {
if (rs.status != 200) {
console.log('记录播放时间错误');
} else {
studyUtil.clearStudyDuration(); //清除本地存储
}
})
}
},
audioPlay() {
this.isAppendTime = true;//开始记录音视频的学习时长
this.appendStudyTime();//开始追加学习时长
// let $this=this;
// if(this.curContent.status<9){
// let completeType=this.curriculumData.completeSetup;
// //console.log(completeType,'completeType');
// if(completeType==0){
// //默认5秒后学习完成.
// $this.handleTimeout= setTimeout(function() {$this.saveStudyInfo();}, 5000); //5秒后记录学习完成
// }else{
// //先记录进行中的学习内容
// this.saveStudyItem();
// }
// }
},
audioEnd() {
this.stopStudyTime();
if (this.curContent.status < 9) {
this.finishStudyItem();
}
},
audioPause() {
this.stopStudyTime();
},
audioPlaying(e, second) {
console.log("=======courseStudy");
this.isAppendTime = true;//打开追加载学习时长
let intTime = second;//当前播放时间
let videDuration = e.duration;//音频总时长,秒
if (!videDuration) {
videDuration = this.curContent.duration;
}
//判断是否完成
let completeType = this.curriculumData.completeSetup;
let completeSecond = this.curriculumData.second;
if (!completeSecond) {
completeSecond = 5;//如果没有就采用默认的时间了
}
if (completeType > 0 && this.curContent.status < 9) { //因为1按进度2按时长都是计算时间所以这里直接大于0处理
if (completeType == 1) {
let finishPercent = this.curriculumData.setupTage;
let percent = intTime * 100 / videDuration;
if (percent >= finishPercent) {
this.finishStudyItem();
}
} else {
if (intTime >= completeSecond) {
this.finishStudyItem();
}
}
}
//以下是每隔10秒存储一下进度
let saveTime = Math.floor(intTime % 10);
//console.log(intTime,saveTime,'aa',this.curContent.studyItemId)
if (this.preTime != intTime && saveTime == 0 && this.curContent.studyItemId != '') {
this.preTime = intTime;
this.curContent.lastStudyTime = intTime;
//记录播放时间
//console.log('记录播放时间:'+intTime);
let postData = {
itemId: this.curContent.studyItemId,
videoTime: intTime,
id: this.appentId,
studyId: this.studyId,
courseId: this.curContent.courseId,
contentId: this.curContent.id,
studyInfo: this.courseInfo.name + "-" + this.curContent.contentName,
duration: 10
}
if (!this.curriculumData.isDrag && this.curContent.progressVideo != 1) {
var time = localStorage.getItem('videoProgressData')
var arr = time && JSON.parse(time) || {}
if (arr[this.blobId] && this.curContent.progressVideo < arr[this.blobId]) {
postData.progressVideo = arr[this.blobId]
// postData.contentId = this.curContent.id
// postData.courseId = this.curContent.courseId
}
}
//alert(this.preTime!=intTime +'---'+ saveTime +'---'+ this.curContent.studyItemId)
apiCourseStudy.updateStudyVideoTime(postData).then(rs => {
if (rs.status != 200) {
console.log('记录播放时间错误');
} else {
studyUtil.clearStudyDuration(); //清除本地存储
}
})
}
},
saveScormStudy() {
//只记录SCORM课件的学习
if (this.curContent.contentType != 50) {
return;
}
if (this.curContent.status == 9) {
//已学习完的,不用再添加
return;
}
let params = {
studyId: this.studyId,//学习id,
courseId: this.courseId,//课程id,
contentId: this.curContent.id,//内容id,
contentType: this.curContent.contentType,
contentName: this.curContent.contentName,//内容名称
progress: 1,
status: 2,
contentTotal: this.totalContent
}
apiCourseStudy.studyContent(params).then(res => {
if (res.status == 200) {
this.curContent.status = 2;//完成
this.curContent.studyItemId = res.result;//学习记录id
} else {
console.log('记录学习失败:' + res.message + '' + res.error);
}
})
},
//还需要记录播放时间
saveStudyInfo() { //记录课件学习信息
this.tentative = true;
if (this.curContent.contentType >= 60) {
//只有在课件页面停留超过5秒才会记录
return;
}
if (this.curContent.status == 9) {
//已学习完的,不用再添加
return;
}
let params = {
studyId: this.studyId,//学习id,
courseId: this.courseId,//课程id,
contentId: this.curContent.id,//内容id,
contentType: this.curContent.contentType,
contentName: this.curContent.contentName,//内容名称
progress: 100,
status: 9,
contentTotal: this.totalContent
}
apiCourseStudy.studyContent(params).then(res => {
if (res.status == 200) {
this.curContent.status = 9;//完成
this.curContent.studyItemId = res.result;//学习记录id
} else {
console.log('记录学习失败:' + res.message + '' + res.error);
}
})
},
statusClass(status) {
let statusObj = {
1: 'nostart',
2: 'studying',
9: 'finish',
}
return statusObj[status]
},
showMore() {
this.articleMore = false;
},
goBack() {
history.go(-1)
}
}
}
</script>
<style lang="scss" scoped>
.concern {
font-size: 24upx;
border: 1upx solid #387DF7;
padding: 3upx 20upx;
border-radius: 30upx;
}
.pinglun {
/deep/ .comments {
padding: 0;
.comments-top {
display: none;
}
}
/deep/ .interact-fixed {
.interact-bar {
padding-right: 40upx;
}
}
/deep/ .interact-bar {
padding-left: 0 !important;
}
/deep/ .field-right {
width: 0 !important;
}
/deep/ .interact-bar-item {
width: 100% !important;
.field {
width: 100% !important;
}
}
// /deep/ .interact-bar{
// // padding-left: 0;
// }
// /deep/ .field{
// width: 448upx;
// }
// /deep/ .field-right{
// margin-right: 60upx;
// }
}
body {
background-color: #fff;
}
.playbox {
//padding: 10upx;
background-color: #fff;
}
.contentbox {
padding: 34upx;
background-color: #fff;
}
.player-box {
position: absolute;
// top: 62px;
// left: 184px;
width: 200px;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
height: 147px;
background: #a9abb3;
opacity: 0.8;
border-radius: 33px;
text-align: center;
padding: 20px;
box-sizing: border-box;
image {
width: 40px;
height: 40px;
margin: 0px 10px;
}
.player-praise {
margin-top: 5px;
display: flex;
// justify-items: center;
justify-content: center;
}
.player-rate {
margin-top: 20px;
text-align: center;
display: flex;
justify-content: center;
}
}
.tabrow {
display: flex;
border-bottom: 1px solid rgba(153, 153, 153, 0.14);
font-size: 28upx;
position: relative;
.tabrow-active {
font-size: 32upx;
color: #387DF7;
border-bottom: 4upx solid #007DFF;
}
.tabrow-item {
margin-right: 30upx;
line-height: 60upx;
font-weight: 600;
text {
padding-bottom: 10upx;
}
}
.player-box-tabrow {
position: absolute;
top: -20px;
right: -15px;
// left: 184px;
// width: 200px;
// left: 50%;
// top: 50%;
// transform: translate(-50%, -50%);
// height: 147px;
// background:#a9abb3;
// opacity: 0.8;
// border-radius: 33px;
// text-align: center;
padding: 20px;
box-sizing: border-box;
image {
width: 20px;
height: 20px;
vertical-align: middle;
margin-right: 4px;
// margin: 0px 10px;
}
.player-praise {
margin-top: 5px;
display: flex;
// justify-items: center;
justify-content: center;
}
.player-rate {
margin-top: 20px;
text-align: center;
display: flex;
justify-content: center;
}
}
}
.cinfo {
.cinfo-title {
min-height: 18upx;
color: #333333;
font-size: 32upx;
padding: 28upx 0upx;
}
.cinfo-tag1 {
font-size: 22upx;
color: #528CEC;
background: rgba($color: #387DF7, $alpha: 0.1);
border-radius: 16upx;
margin-left: 12upx;
margin-right: 12upx;
padding: 2upx 12upx;
}
.cinfo-tag2 {
font-size: 22upx;
color: #D98135;
background: rgba($color: #FF7900, $alpha: 0.1);
border-radius: 16upx;
margin-right: 12upx;
padding: 4upx 12upx;
}
.desrow {
display: flex;
justify-content: space-between;
padding: 26upx 0upx;
.desrow-name {
color: #333333;
font-size: 28upx;
}
.desrow-value {
color: #666666;
font-size: 28upx;
}
.score {
color: #FB7303;
margin-left: 10upx;
font-weight: 700;
font-size: 32upx;
}
}
.cinfo-btns {
display: flex;
justify-content: center;
margin-top: 66upx;
.cinfo-btn {
flex: 1;
font-size: 28upx;
text-align: center;
color: #999999;
}
}
}
.citembox1 {
display: flex;
.citembox1-item {
width: 50%;
}
}
.citem {
margin: 10upx;
.citem-title {
color: #333333;
word-break: break-all;
text-overflow: ellipsis;
display: -webkit-box;
overflow: hidden;
}
.citem-body {
background-color: #F7F8F9;
border-radius: 4upx;
color: #333333;
height: 100upx;
padding: 20upx 30upx;
word-break: break-all;
text-overflow: ellipsis;
display: -webkit-box;
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
}
}
.scroll-item {
// margin: 3px;
margin-right: 20upx;
.scroll-item-sec {
height: 20px;
// padding: 10upx;
margin-bottom: 30upx;
margin-right: 20upx;
// word-wrap: break-word;
// word-break:break-all;
overflow: hidden;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1
}
.scroll-item-con {
width: 220rpx;
display: inline-flex;
border-radius: 8upx;
padding: 20upx 30upx;
min-height: 100upx;
// line-height: 60rpx;
background-color: #f4f5f7;
.scroll-item-name {
width: 100%;
height: 76rpx;
// white-space: pre-wrap;
word-break: break-all;
line-height: 40rpx;
overflow: hidden;
white-space: pre-wrap;
text-overflow: ellipsis;
-webkit-box-orient: vertical;
display: -webkit-box;
-webkit-line-clamp: 2;
font-size: 28upx;
// margin-bottom: 20upx;
}
.scroll-item-type {
font-size: 26upx;
display: flex;
justify-content: flex-start;
align-items: center;
line-height: 1;
.square-border {
margin-right: 20upx;
display: flex;
justify-content: center;
align-items: center;
border: 1px solid;
padding: 3px 5px;
.finish {
padding: 5upx;
}
.nostart {
padding: 5upx;
}
}
}
}
}
.box-studying {
//color:#FFB30F;
color: #387DF7;
border: 1upx solid rgba(56, 125, 247, 0.14);
}
.box-finish {
color: #3C7EFF;
}
.box-nostart {
color: #EE474A;
}
.color-studying {
// background: #FDF1D7;
//color: #FFB30F;
color: #387DF7;
}
.color-finish {
// background: #f3f9ff;
color: #666666;
}
.color-nostart {
// background: #ffe8e7;
color: #666666;
}
.status-tag {
height: 40upx;
width: 44px;
white-space: nowrap;
display: inline-block;
text-align: center;
line-height: 40upx;
padding: 2upx 10upx;
border-radius: 14upx;
}
.tag-studying {
// color: #FFB30F;
color: #588AFC;
}
.tag-finish {
// color: #00aaff;
color: #08A890;
}
.tag-nostart {
// color: #ff0000;
color: #787878;
}
.text-ellipsis {
//display: inline-block;
max-width: 80%;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.player-controls-btn {
position: absolute;
right: 10px;
top: 10px;
display: inline-block;
color: #e5e5e5;
padding: 0 0.4rem;
transition: color 0.3s;
height: 22px;
}
.btn-speed:hover .speed-control {
// visibility: visible;
}
.speed-control {
position: absolute;
top: 180px;
right: -20px;
transition: visibility 0.3s;
transform: translate(-50%, -100%);
}
.speed-control .speed-control-list {
list-style: none;
color: #e5e5e5;
width: 50px;
font-size: 12px;
text-align: left;
padding: 0px 0px 0px 5px;
margin: 0;
overflow: hidden;
border-radius: 4px;
background: rgba(21, 21, 21, 0.8);
}
.speed-control .speed-control-list .li {
position: relative;
display: block;
height: 25px;
line-height: 25px;
}
.speed-control .speed-control-list .li:hover {
color: #fff;
background: rgba(99, 99, 99, 0.8);
}
.speed-control .speed-control-list .li.current {
color: var(--primaryColor);
}
.catalog {
background: #FFFFFF;
padding: 20upx;
.catalog-sec {
display: flex;
justify-content: space-between;
// border-bottom: 2upx solid #FAFAFA;
// padding:20upx;
line-height: 40upx;
.catalog-sec-name {
max-width: 90%;
font-weight: 600;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
.catalog-con:last-child {
border: none;
}
.catalog-con {
display: flex;
justify-content: space-between;
padding: 30upx 0upx 30upx 30upx;
padding-right: 0;
border-bottom: 1px solid rgba(153, 153, 153, 0.08);
.square-border {
display: inline-block;
border: 1px solid;
padding: 4upx 6upx;
font-size: 0.8em;
margin: 0upx 8upx;
}
.catalog-con-name {
padding-left: 0upx;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
}
.dlgscore { //评分的样式
.dlgscore-top {
text-align: center;
padding: 50upx 100upx 0upx 100upx;
.dlgscore-title {
text-align: center;
font-size: 36upx;
}
.dlgscore-desc {
text-align: center;
color: #999999;
font-size: 24upx;
padding-top: 10upx;
}
.dlgscore-score {
padding-top: 40upx;
display: flex;
justify-content: center;
}
}
.dlgscore-btns {
margin-top: 60upx;
height: 100upx;
display: flex;
justify-content: center;
border-top: 1px solid rgba(153, 153, 153, 0.14);
.dlgscore-cancel {
text-align: center;
width: 49%;
border-right: 1px solid rgba(153, 153, 153, 0.14);
line-height: 100upx;
color: #666666;
}
.dlgscore-submit {
text-align: center;
width: 50%;
line-height: 100upx;
color: #387DF7;
}
}
}
.about-gongsi-info {
overflow: hidden;
position: relative;
}
.about-gongsi-info::after {
content: '';
position: absolute;
width: 100%;
height: 30px;
background: -webkit-gradient(linear, 0 0, 0 100%, from(rgba(255, 255, 255, 0)), to(rgba(255, 255, 255, 1)));
background: -moz-linear-gradient(top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));
background: -o-linear-gradient(top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));
background: linear-gradient(top, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1));
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#0ff, endColorstr=#fff, GradientType=0);
bottom: 0;
left: 0;
}
</style>