From a969b6482b24c2263a2c31bcd7fdd9dbeb609f0b Mon Sep 17 00:00:00 2001 From: shawko Date: Sat, 9 May 2026 10:34:51 +0800 Subject: [PATCH] =?UTF-8?q?=E2=80=98add=E7=AC=AC=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 7 + .env.test | 9 + .eslintignore | 4 + .eslintrc.cjs | 68 + .gitignore | 35 + .husky/commit-msg | 1 + .husky/pre-commit | 1 + .prettierrc.cjs | 14 + .vscode/extensions.json | 30 + README.md | 5 + backup-config/.eslintrc.js | 67 + backup-config/.prettierrc.js | 14 + backup-config/settings.json | 36 + commitlint.config.cjs | 24 + index.html | 40 + package.json | 104 + pnpm-lock.yaml | 7604 +++++++++++++++++ pnpm-workspace.yaml | 6 + public/logo.svg | 233 + src/App.vue | 19 + src/api/chat.ts | 79 + src/api/classroomInteraction.ts | 32 + src/api/global.ts | 284 + src/api/http.ts | 140 + src/api/log.ts | 55 + src/api/login.ts | 84 + src/api/only-last.ts | 65 + src/api/order.ts | 40 + src/api/ranking.ts | 34 + src/api/request.ts | 90 + src/api/service/basic.ts | 30 + src/api/service/coin-transaction.ts | 17 + src/api/service/self-coin-detail.ts | 17 + src/api/service/task.ts | 172 + src/api/service/user-task.ts | 17 + src/api/service/word-table.ts | 48 + src/api/service/word-test.ts | 126 + src/api/studentManage.ts | 330 + src/api/studyAnalysis.ts | 80 + src/api/subject/config.ts | 879 ++ src/api/subject/dictionaries.ts | 83 + src/api/subject/doWork.ts | 46 + src/api/subject/happyRead.ts | 71 + src/api/subject/homework/index.ts | 48 + src/api/subject/homework/type.ts | 269 + src/api/subject/languageSense.ts | 67 + src/api/subject/learnWord.ts | 132 + src/api/subject/questionExplain.ts | 21 + src/api/subject/sentenceCollect.ts | 29 + src/api/subject/subject.ts | 328 + src/api/subject/wordBook.ts | 31 + src/api/subject/wordDetail.ts | 39 + src/api/subject/wordTable.ts | 230 + src/api/subject/wordTest.ts | 150 + src/api/subject/wrongQuestion.ts | 136 + src/api/system/activity.ts | 21 + src/api/system/announcement.ts | 26 + src/api/system/homeWork.ts | 324 + src/api/system/mailbox.ts | 63 + src/api/system/setting.ts | 87 + src/api/system/user.ts | 81 + src/api/task.ts | 75 + src/api/urge.ts | 166 + src/components/AbbrImg/index.vue | 52 + src/components/Accent/index.vue | 70 + src/components/AiText/index.scss | 352 + src/components/AiText/index.vue | 143 + src/components/AiText/languages.json | 105 + src/components/BackBar/index.vue | 53 + src/components/BigTitle/index.vue | 26 + src/components/Btn/index.vue | 175 + src/components/ClozeTest/index.vue | 99 + src/components/ConfirmDia/index.vue | 113 + src/components/DifficultyStart/index.vue | 186 + src/components/Empty/index.vue | 155 + src/components/EnlargePicture/index.vue | 213 + src/components/Horn/index.vue | 48 + src/components/HornC.vue | 66 + src/components/Icon/index.vue | 91 + src/components/ImageCropper/index.vue | 261 + src/components/ImgBg/index.vue | 24 + src/components/ImgView/index.vue | 127 + src/components/ItemPopover/index.vue | 178 + src/components/LazyLoad.vue | 65 + src/components/LineFont/index.vue | 74 + src/components/PostLoad/index.vue | 85 + src/components/ProgressBar/index.vue | 98 + src/components/RewardDia/index.vue | 133 + src/components/Select/index.vue | 243 + src/components/SelectTab/index.vue | 81 + src/components/ShowLottie/ShowLottie.vue | 108 + src/components/ShowLottie/type.ts | 15 + src/components/Sidebar/index.vue | 161 + src/components/SignaturePad/index.vue | 211 + src/components/SimpleTable/index.vue | 95 + src/components/Table/column/index.vue | 22 + src/components/Table/index.vue | 229 + src/components/Table/render/index.vue | 21 + src/components/UrmLoad/index.vue | 182 + src/components/UrmLoad/urmUrl.json | 119 + .../components/UserCenterSidebar.vue | 128 + src/components/UserCenterDia/index.vue | 949 ++ src/components/UserHead/index.vue | 70 + src/components/VideoPlayer/index.vue | 339 + src/components/WinningStreakAnimation.vue | 70 + src/components/WrongQuesItem/OptionsList.vue | 52 + src/components/WrongQuesItem/index.vue | 394 + src/components/XAe/index.vue | 100 + src/components/XDia/index.vue | 183 + src/components/XLDia/index.vue | 141 + src/components/XStatusDia/index.vue | 121 + src/components/XTree/index.ts | 13 + src/components/XTree/index.vue | 239 + src/components/XTree/item.vue | 100 + src/components/board-bg/index.vue | 88 + src/components/book-select/index.ts | 2 + src/components/book-select/index.vue | 641 ++ src/components/book-shelf/index.vue | 360 + src/components/card/number-card/index.vue | 184 + src/components/card/right-rate-card/index.vue | 80 + src/components/chapter-list/index.vue | 464 + src/components/heart-bg/index.vue | 40 + src/components/keyboard/index.ts | 2 + src/components/keyboard/index.vue | 323 + src/components/keyboard/keyboard-item.vue | 292 + src/components/latex-text/index.vue | 89 + src/components/memory-tips/index.vue | 125 + src/components/mj/mj-button/index.vue | 204 + src/components/mj/mj-check-group/index.vue | 130 + src/components/mj/mj-check/index.vue | 48 + src/components/mj/mj-date-picker/index.vue | 217 + src/components/mj/mj-dialog/index.ts | 77 + src/components/mj/mj-dialog/index.vue | 318 + src/components/mj/mj-grid/index.vue | 254 + src/components/mj/mj-loading/index.ts | 79 + src/components/mj/mj-loading/index.vue | 231 + src/components/mj/mj-radio/index.vue | 73 + src/components/mj/mj-table/const.ts | 42 + src/components/mj/mj-table/fmt.ts | 52 + src/components/mj/mj-table/index.scss | 351 + src/components/mj/mj-table/index.ts | 5 + src/components/mj/mj-table/index.vue | 585 ++ src/components/new-progress-bar/index.vue | 67 + src/components/pagination/index.vue | 162 + src/components/question/Question.vue | 1504 ++++ .../question/answer/CameraPreview.vue | 303 + src/components/question/answer/ClozeTest.vue | 166 + .../question/answer/CompositeStem.vue | 272 + src/components/question/answer/HandDrawn.vue | 382 + src/components/question/answer/Input.vue | 106 + src/components/question/answer/Judgment.vue | 144 + .../question/answer/JudgmentCloze.vue | 179 + .../question/answer/MultipleChoice.vue | 161 + src/components/question/answer/Other.vue | 285 + .../question/answer/SingleChoice.vue | 147 + src/components/school-class-select/index.vue | 72 + src/components/user-asset-item/index.vue | 71 + src/components/user-figure-big/index.vue | 175 + src/components/user-figure/index.vue | 72 + src/components/user-profile-card/index.vue | 238 + src/components/user-task-list/index.vue | 163 + src/components/word-book-select/index.vue | 110 + src/components/word-book-select/store.ts | 74 + src/components/word-book-selector/index.ts | 40 + src/components/word-book-selector/index.vue | 58 + src/components/word-game/hooks/main.ts | 235 + src/components/word-game/index.scss | 196 + src/components/word-game/index.ts | 127 + src/components/word-game/index.vue | 439 + .../word-game/word-single-choice/index.vue | 385 + .../word-game/word-spelling-bee/index.vue | 502 ++ src/components/word-print/index.vue | 182 + src/directive/auth.ts | 34 + src/directive/index.ts | 16 + src/directive/longpress.ts | 36 + src/directive/notice-btn-auth.ts | 29 + src/hooks/index.ts | 16 + src/hooks/useAudio.ts | 56 + src/hooks/useBindQrCode.ts | 38 + src/hooks/useCommonAudio.ts | 46 + src/hooks/useCopy.ts | 16 + src/hooks/useDict.ts | 24 + src/hooks/useLoad.ts | 88 + src/hooks/useLog.ts | 35 + src/hooks/useMathJax.ts | 13 + src/hooks/useMessage.ts | 39 + src/hooks/usePay.ts | 87 + src/hooks/useReward.ts | 38 + src/hooks/useSocket.ts | 210 + src/hooks/useSound.ts | 12 + src/hooks/useSubject.ts | 41 + src/hooks/useTeacherExplain.ts | 379 + src/hooks/useTips.ts | 42 + src/hooks/useTools.ts | 28 + src/layouts/android.json | 124 + src/layouts/app.json | 1086 +++ src/layouts/index.vue | 377 + src/layouts/tool.vue | 146 + src/main.ts | 44 + src/page/app/app.ts | 301 + src/page/app/index.vue | 314 + src/page/app/link.vue | 38 + src/page/app/routes.ts | 24 + src/page/chat/components/AiText/index.scss | 352 + src/page/chat/components/AiText/index.vue | 143 + .../chat/components/AiText/languages.json | 105 + src/page/chat/components/Message.vue | 127 + src/page/chat/components/MessageList.vue | 124 + src/page/chat/components/Sender.vue | 101 + src/page/chat/components/SessionItem.vue | 80 + src/page/chat/components/SessionList.vue | 96 + src/page/chat/components/Text/test.json | 3 + src/page/chat/index.scss | 17 + src/page/chat/index.ts | 2 + src/page/chat/index.vue | 35 + src/page/chat/routes.ts | 10 + src/page/classroomInteraction/index.vue | 413 + src/page/classroomInteraction/routes.ts | 10 + src/page/home/index.vue | 696 ++ src/page/home/routes.ts | 23 + src/page/home/self-coin-detail/index.vue | 111 + src/page/login/components/Option.vue | 116 + src/page/login/index.vue | 339 + src/page/login/init.vue | 483 ++ src/page/login/routes.ts | 22 + src/page/positive/goodThings/index.vue | 208 + src/page/positive/routes.ts | 25 + src/page/positive/smileSign/index.vue | 12 + src/page/ranking/components/AsideList.vue | 96 + src/page/ranking/components/SelectTab.vue | 99 + src/page/ranking/components/VirtualList.vue | 197 + src/page/ranking/index.vue | 853 ++ src/page/ranking/interface.ts | 8 + src/page/ranking/other/index.vue | 82 + src/page/ranking/routes.ts | 25 + src/page/sfxzy/index.vue | 106 + src/page/sfxzy/routes.ts | 12 + .../basic-info/batch-operation.vue | 89 + .../student-mgr/basic-info/batch-send.vue | 283 + src/page/student-mgr/basic-info/dialog.scss | 36 + src/page/student-mgr/basic-info/index.ts | 41 + src/page/student-mgr/basic-info/index.vue | 332 + .../student-mgr/basic-info/user-detail.vue | 417 + src/page/student-mgr/coin-detail/index.vue | 304 + src/page/student-mgr/index.scss | 139 + src/page/student-mgr/index.ts | 1 + src/page/student-mgr/index.vue | 98 + src/page/student-mgr/routes.ts | 52 + src/page/student-mgr/set-book/index.vue | 157 + .../student-mgr/set-task/add-task/index.scss | 16 + .../student-mgr/set-task/add-task/index.vue | 156 + .../set-task/add-task/reward-item/index.vue | 177 + .../set-task/add-task/target-item/index.vue | 101 + .../add-task/target-item/set-target.vue | 237 + .../set-task/add-task/task-cfg-item/index.vue | 80 + .../task-cfg-item/task-free-learn/index.vue | 185 + .../task-cfg-item/task-sentence/index.vue | 72 + .../task-cfg-item/task-word-quest/index.vue | 64 + .../task-cfg-item/task-word-table/index.vue | 111 + src/page/student-mgr/set-task/index.ts | 98 + src/page/student-mgr/set-task/index.vue | 271 + src/page/student-mgr/set-task/store.ts | 1 + .../set-task/task-detail/index.vue | 76 + .../set-task/task-detail/task-basic-info.vue | 261 + src/page/student-mgr/store/index.ts | 58 + .../student-mgr/study-data/chinese-data.vue | 14 + src/page/student-mgr/study-data/column.tsx | 305 + .../student-mgr/study-data/english-data.vue | 14 + .../study-data/english-word-data.vue | 228 + .../study-data/hooks/auto-update.ts | 54 + .../student-mgr/study-data/hooks/index.ts | 50 + .../student-mgr/study-data/hooks/table.ts | 57 + src/page/student-mgr/study-data/index.scss | 91 + src/page/student-mgr/study-data/math-data.vue | 14 + src/page/student-mgr/study-data/rank.vue | 174 + .../student-mgr/study-data/subject-data.vue | 183 + .../components/KnowledgeChart.vue | 435 + .../components/KnowledgeList.vue | 94 + .../study-analysis/components/NumberCard.vue | 90 + .../study-analysis/components/ReadData.vue | 315 + .../study-analysis/components/SelectTime.vue | 92 + .../study-analysis/components/StudyTime.vue | 246 + .../study-analysis/components/TopicChart.vue | 495 ++ .../study-analysis/components/VideoTime.vue | 325 + .../study-analysis/components/WordChart.vue | 585 ++ src/page/study-analysis/hooks.ts | 18 + src/page/study-analysis/index.vue | 213 + src/page/study-analysis/interface.ts | 8 + src/page/study-analysis/routes.ts | 12 + src/page/subject/SubjectDia.vue | 171 + src/page/subject/aiStudy/index.vue | 279 + src/page/subject/components/Book.vue | 139 + src/page/subject/components/Card.vue | 184 + src/page/subject/components/MapRegion.vue | 270 + .../subject/components/VideoFullBox/index.vue | 125 + .../dictionaries/components/TopSearch.vue | 154 + .../dictionaries/components/seekWords.vue | 535 ++ src/page/subject/dictionaries/index.vue | 97 + .../subject/dictionaries/interface/index.ts | 27 + .../subject/doWork/components/AiReplyDia.vue | 170 + .../subject/doWork/components/Feedback.vue | 237 + .../components/reportDia/KnowledgeList.vue | 123 + .../doWork/components/reportDia/index.vue | 414 + src/page/subject/doWork/index.ts | 16 + src/page/subject/doWork/index.vue | 1132 +++ src/page/subject/doWork/parent.vue | 18 + src/page/subject/doWork/titles.ts | 1373 +++ .../english_basic_categories.json | 156 + src/page/subject/englishBasic/index.vue | 302 + src/page/subject/explain/index.vue | 294 + src/page/subject/explain/parent.vue | 8 + .../subject/freeStudy/views/home/index.vue | 103 + .../freeStudy/views/knowledgePoints/Empty.vue | 80 + .../views/knowledgePoints/KnowledgeCard.vue | 150 + .../views/knowledgePoints/KnowledgeVideo.vue | 83 + .../views/knowledgePoints/TrainRecord.vue | 241 + .../freeStudy/views/knowledgePoints/index.vue | 157 + .../textbookDetail/ChapterTree/index.vue | 235 + .../views/textbookDetail/ChapterTree/item.vue | 137 + .../views/textbookDetail/RoundSplit.vue | 34 + .../views/textbookDetail/TrainList/index.vue | 259 + .../views/textbookDetail/VideoList/index.vue | 270 + .../freeStudy/views/textbookDetail/index.vue | 465 + .../combination/ChapterTree/index.vue | 167 + .../combination/ChapterTree/item.vue | 94 + .../combination/TextbookDia/Chapter.vue | 153 + .../combination/TextbookDia/XTree/index.vue | 260 + .../combination/TextbookDia/XTree/item.vue | 116 + .../combination/TextbookDia/index.vue | 141 + .../subject/groupPaper/combination/index.vue | 327 + src/page/subject/groupPaper/history/Card.vue | 203 + src/page/subject/groupPaper/history/index.vue | 147 + .../historyDetail/AnalysisTable.vue | 96 + .../groupPaper/historyDetail/index.vue | 203 + src/page/subject/groupPaper/home/index.vue | 85 + .../read/components/NavList.vue | 116 + .../read/components/ReadBook.vue | 154 + .../classicReading/read/interface/index.ts | 62 + .../happyRead/classicReading/read/read.vue | 118 + .../classicReading/readDetail/PlayBooks.vue | 209 + .../components/playBooksDetails.vue | 298 + .../readDetail/components/sentence.vue | 458 + .../readDetail/interface/index.ts | 32 + .../components/Introduce.vue | 294 + .../singleBookIntroduction/interface/index.ts | 70 + .../singleBookIntroduction.vue | 679 ++ src/page/subject/happyRead/index.vue | 99 + .../subject/happyRead/phonics/ReportDia.vue | 347 + .../blankFill/components/ChooseTitle.vue | 115 + .../phonics/blankFill/components/Title.vue | 63 + .../phonics/blankFill/components/WordCard.vue | 175 + .../happyRead/phonics/blankFill/index.vue | 691 ++ src/page/subject/happyRead/phonics/index.vue | 283 + src/page/subject/happyRead/phonics/load.vue | 171 + .../subject/happyRead/shortReading/index.vue | 292 + .../shortReading/readRecord/index.vue | 370 + .../components/ReadMeaningSentence.vue | 288 + .../readTopic/components/WordChoose.vue | 292 + .../shortReading/readTopic/index.vue | 583 ++ .../readTopic/interface/interface.ts | 14 + src/page/subject/index.vue | 210 + .../home/components/ProgressBar.vue | 89 + src/page/subject/languageSense/home/index.vue | 258 + .../languageSense/sentenceCollect/index.vue | 353 + .../sentenceSort/component/Answer.vue | 136 + .../sentenceSort/component/CurrentTopic.vue | 267 + .../sentenceSort/component/Tools.vue | 68 + .../sentenceSort/component/TopicItem.vue | 172 + .../sentenceSort/component/WordCard.vue | 242 + .../sentenceSort/component/topic.scss | 112 + .../languageSense/sentenceSort/index.vue | 458 + .../languageSense/sentenceSort/tool.ts | 43 + .../sentenceSortStatistics/index.vue | 536 ++ .../subject/learnWord/components/DataBar.vue | 77 + .../learnWord/components/LevelItem.vue | 378 + .../learnWord/components/LevelList.vue | 233 + .../subject/learnWord/components/Road.vue | 98 + .../subject/learnWord/components/Select.vue | 205 + .../subject/learnWord/components/UserList.vue | 259 + .../subject/learnWord/components/medal.vue | 250 + .../learnWord/hardMode/components/FailPop.vue | 373 + .../hardMode/components/HardRound-1.vue | 461 + .../hardMode/components/Keyboard.vue | 486 ++ .../hardMode/components/ResultTable.vue | 457 + .../hardMode/components/SuccessPop.vue | 659 ++ .../hardMode/components/confirmPop.vue | 100 + .../subject/learnWord/hardMode/hardMode.vue | 876 ++ .../learnWord/hardMode/hooks/useAnimate.ts | 71 + .../learnWord/hardMode/hooks/useAnswer.ts | 619 ++ .../learnWord/hardMode/hooks/useAudio.ts | 25 + .../learnWord/hardMode/hooks/useNextStage.ts | 72 + .../learnWord/hardMode/hooks/usePopup.ts | 25 + .../learnWord/hardMode/interface/index.ts | 64 + .../learnWord/hardMode/styles/animate.scss | 107 + .../learnWord/hardMode/styles/page.scss | 315 + .../learnWord/hooks/useInfiniteScroll.ts | 44 + src/page/subject/learnWord/index.ts | 2 + src/page/subject/learnWord/index.vue | 970 +++ src/page/subject/learnWord/interface/index.ts | 39 + .../normalMode/components/FailPop.vue | 402 + .../normalMode/components/PictureOptions.vue | 198 + .../normalMode/components/ProgressBar.vue | 146 + .../normalMode/components/ResultTable.vue | 265 + .../normalMode/components/SemanticReview.vue | 169 + .../normalMode/components/SingleChoice.vue | 557 ++ .../normalMode/components/SuccessPop.vue | 663 ++ .../normalMode/components/TestBtn.vue | 55 + .../normalMode/components/TextOptions.vue | 277 + .../learnWord/normalMode/hooks/useAnswer.ts | 125 + .../learnWord/normalMode/hooks/useLoad.ts | 75 + .../learnWord/normalMode/hooks/usePopup.ts | 25 + .../normalMode/hooks/useStarAnimate.ts | 78 + .../learnWord/normalMode/interface/index.ts | 70 + .../learnWord/normalMode/normalMode.vue | 759 ++ .../learnWord/normalMode/styles/common.scss | 97 + .../subject/learnWord/word-review/index.vue | 13 + .../word-table/components/AllBookSeleton.vue | 131 + .../word-table/components/Dropdown.vue | 177 + .../word-table/components/Select.vue | 138 + .../word-table/components/WordPopup.vue | 789 ++ .../word-table/components/swiper.vue | 79 + .../word-table/hooks/useReadLoading.ts | 28 + .../subject/learnWord/word-table/index.ts | 2 + .../subject/learnWord/word-table/index.vue | 1126 +++ .../learnWord/word-table/interface/index.ts | 69 + .../word-table/style/familiarityColor.scss | 15 + .../test/components/AdaptiveText.vue | 64 + .../word-table/test/components/Card.vue | 240 + .../test/components/RecordDetailPop.vue | 281 + .../test/components/question-box.scss | 178 + .../test/components/single-choice/index.ts | 8 + .../test/components/single-choice/index.vue | 500 ++ .../test/components/spelling-bee/index.vue | 627 ++ .../word-table/test/hooks/useExam.ts | 105 + .../learnWord/word-table/test/index.vue | 18 + .../learnWord/word-table/test/testList.vue | 424 + .../learnWord/word-table/test/testRecords.vue | 433 + .../subject/learnWord/word-table/test/type.ts | 57 + .../word-test-class-records/index.vue | 295 + .../learnWord/word-test-records/index.ts | 96 + .../learnWord/word-test-records/index.vue | 315 + .../new-test-dialog/index.vue | 160 + .../subject/learnWord/word-test/index.vue | 420 + .../learnWord/word-test/report/index.vue | 294 + src/page/subject/learningArtifact/app.ts | 891 ++ src/page/subject/learningArtifact/index.vue | 285 + .../detail/components/WordCard.vue | 180 + .../phoneticTranscription/detail/index.vue | 426 + .../subject/phoneticTranscription/index.vue | 181 + src/page/subject/routes.ts | 401 + .../strangeBook/components/SearchWordPup.vue | 111 + .../strangeBook/components/WordCard.vue | 423 + src/page/subject/strangeBook/index.vue | 441 + .../subject/strangeBook/interface/index.ts | 25 + src/page/subject/studyVideo/index.vue | 320 + src/page/subject/textbook/index.vue | 341 + src/page/subject/user-word-book/hooks/main.ts | 128 + .../user-word-book/hooks/word-print.ts | 79 + src/page/subject/user-word-book/index.vue | 358 + .../components/MeaningHighLight.vue | 59 + .../wordDetails/components/XgVideo.vue | 40 + src/page/subject/wordDetails/details/hook.ts | 65 + .../wordDetails/details/swiperPage.vue | 445 + .../subject/wordDetails/details/wordForm.vue | 239 + .../subject/wordDetails/details/wordGist.vue | 407 + .../wordDetails/details/wordMeaning.vue | 699 ++ .../wordDetails/details/wordUnderstand.vue | 324 + src/page/subject/wordDetails/index.vue | 233 + .../wordDetails/skeleton/listSkeleton.vue | 604 ++ .../wordDetails/skeleton/wordSkeleton.vue | 111 + src/page/subject/wrongBook/index.vue | 460 + src/page/system/activity/checkIn.vue | 246 + src/page/system/activity/englishEnhance.vue | 206 + src/page/system/activity/index.vue | 127 + src/page/system/announcement/index.vue | 278 + src/page/system/homeWork/history/index.vue | 522 ++ src/page/system/homeWork/index.vue | 484 ++ .../homeWork/reports/components/Analyse.vue | 290 + .../homeWork/reports/components/Detail.vue | 118 + .../reports/components/EchartsBar.vue | 129 + .../reports/components/EchartsPie.vue | 101 + .../homeWork/reports/components/Knowledge.vue | 189 + .../homeWork/reports/components/hooks.ts | 6 + src/page/system/homeWork/reports/index.vue | 117 + .../homeWork/statistics/SingleAnalysis.vue | 463 + src/page/system/homeWork/statistics/Whole.vue | 148 + src/page/system/homeWork/statistics/index.vue | 171 + src/page/system/homeWork/temporary/index.vue | 278 + .../homeWork/temporary/singleDetail.vue | 314 + src/page/system/homeWork/wrong/index.vue | 557 ++ .../system/homeWork/wrongQuestion/index.vue | 1309 +++ .../do-work/components/Question.vue | 645 ++ .../system/homework copy/do-work/index.vue | 584 ++ .../system/homework copy/history/index.vue | 473 + src/page/system/homework copy/index.vue | 506 ++ .../reports/components/Analyse.vue | 261 + .../reports/components/Detail.vue | 116 + .../reports/components/EchartsBar.vue | 129 + .../reports/components/EchartsPie.vue | 101 + .../reports/components/Knowledge.vue | 180 + .../homework copy/reports/components/hooks.ts | 6 + .../system/homework copy/reports/index.vue | 117 + .../statistics/SingleAnalysis.vue | 463 + .../system/homework copy/statistics/Whole.vue | 148 + .../system/homework copy/statistics/index.vue | 171 + .../system/homework copy/temporary/index.vue | 278 + .../homework copy/temporary/singleDetail.vue | 314 + src/page/system/homework copy/wrong/index.vue | 557 ++ src/page/system/interface.ts | 27 + .../system/mailbox/components/LoadIcon.vue | 70 + src/page/system/mailbox/index.vue | 825 ++ src/page/system/routes.ts | 120 + src/page/system/setting/account.vue | 380 + src/page/system/setting/changePassword.vue | 265 + src/page/system/setting/equipment.vue | 266 + src/page/system/setting/index.vue | 87 + src/page/system/setting/voice.vue | 309 + src/page/system/user/PayDia.vue | 310 + src/page/system/user/basicInfo.vue | 73 + src/page/system/user/index.vue | 89 + src/page/system/user/medal.vue | 141 + src/page/system/user/orderRecord.vue | 127 + src/page/system/user/setting.vue | 82 + src/page/system/user/vip-center/index.vue | 14 + src/page/task/components/Achievement.vue | 268 + src/page/task/components/Popover.vue | 127 + src/page/task/components/RewardDia.vue | 154 + src/page/task/components/dynamic-list.vue | 238 + src/page/task/components/show-rewards.vue | 246 + src/page/task/components/task-item.vue | 281 + src/page/task/components/task-list.vue | 266 + src/page/task/index.ts | 22 + src/page/task/index.vue | 542 ++ src/page/task/routes.ts | 22 + src/page/task/user-task-records/index.vue | 53 + src/page/urge/assets/bg-mesh.svg | 258 + src/page/urge/assets/bg-stamp.svg | 6 + src/page/urge/assets/empty-tip.svg | 39 + src/page/urge/assets/hole-purple.svg | 258 + src/page/urge/assets/hole.svg | 258 + src/page/urge/assets/leaf.svg | 23 + src/page/urge/assets/learning/avatar-self.png | Bin 0 -> 27504 bytes .../urge/assets/learning/avatar-teacher.png | Bin 0 -> 28791 bytes .../urge/assets/learning/bg-im-content.svg | 1431 ++++ src/page/urge/assets/learning/bg-mesh.svg | 258 + src/page/urge/assets/learning/bg-stamp.svg | 6 + src/page/urge/assets/learning/icon-failed.svg | 26 + src/page/urge/assets/learning/icon-image.svg | 4 + .../urge/assets/learning/icon-loading.svg | 22 + src/page/urge/assets/learning/icon-send.svg | 4 + src/page/urge/assets/learning/icon-voice.svg | 10 + src/page/urge/assets/nav-next.svg | 18 + src/page/urge/assets/nav-prev.svg | 18 + src/page/urge/assets/panel-nail.svg | 7 + src/page/urge/assets/pay-dialog/reload.svg | 9 + src/page/urge/assets/report/panel-stamp.svg | 7 + .../assets/report/subject-bg-completed.svg | 275 + src/page/urge/assets/report/subject-bg.svg | 275 + .../assets/report/task-heart-completed.svg | 3 + src/page/urge/assets/report/task-heart.svg | 3 + src/page/urge/assets/stat-corner.svg | 3 + src/page/urge/assets/stat-mesh.svg | 258 + src/page/urge/assets/task-modes/1.png | Bin 0 -> 26986 bytes src/page/urge/assets/task-modes/2.png | Bin 0 -> 37149 bytes src/page/urge/assets/task-modes/3.png | Bin 0 -> 51196 bytes src/page/urge/assets/teacher.png | Bin 0 -> 47098 bytes src/page/urge/assets/timetable/icon-table.svg | 29 + src/page/urge/assets/timetable/wave.svg | 3 + src/page/urge/components/Card.vue | 21 + .../urge/components/ReportExerciseCount.vue | 215 + src/page/urge/components/ReportHistory.vue | 647 ++ .../urge/components/ReportKnowledgeMap.vue | 399 + src/page/urge/components/ReportPanel.vue | 202 + src/page/urge/components/ReportProgress.vue | 31 + src/page/urge/components/ReportVideoViews.vue | 216 + src/page/urge/components/ScheduleTasks.vue | 203 + src/page/urge/components/StatCard.vue | 132 + src/page/urge/index.vue | 7 + .../components/LearningDia/VideoBox.vue | 102 + .../learning/components/LearningDia/index.vue | 201 + .../urge/learning/components/LearningIm.vue | 482 ++ .../learning/components/LearningReport.vue | 324 + .../learning/components/LearningToday.vue | 466 + src/page/urge/learning/home.vue | 277 + .../urge/opening/components/PayDialog.vue | 233 + src/page/urge/opening/home.vue | 733 ++ src/page/urge/routes.ts | 40 + src/page/urge/service/components/Faq.vue | 97 + .../urge/service/components/LearningCases.vue | 111 + .../urge/service/components/ServiceIntro.vue | 275 + .../urge/service/components/TeachingStaff.vue | 219 + src/page/urge/service/home.vue | 89 + src/page/urge/timetable/components/Order.vue | 246 + src/page/urge/timetable/components/Report.vue | 189 + .../urge/timetable/components/Timetable.vue | 211 + .../components/TimetableCalendar.vue | 363 + .../timetable/components/TimetableClass.vue | 124 + .../components/TimetableSchedule.vue | 177 + .../components/TimetableScheduleDialog.vue | 226 + .../timetable/components/TimetableTeacher.vue | 214 + src/page/urge/timetable/home.vue | 77 + src/plugins/dayjs/dayjs.d.ts | 1 + src/plugins/dayjs/index.ts | 30 + src/plugins/encryptor/index.ts | 8 + src/plugins/pinia-plugin-persist/index.ts | 53 + src/router/index.ts | 222 + src/stores/chat.ts | 193 + src/stores/global.ts | 544 ++ src/stores/home-red-point.ts | 14 + src/stores/index.ts | 7 + src/stores/lead-task.ts | 95 + src/stores/learnWord/language-sense.ts | 10 + src/stores/learnWord/useLearnWordStore.ts | 83 + src/stores/share.ts | 42 + src/stores/student-access.ts | 142 + src/stores/subject.ts | 59 + src/stores/taskJump.ts | 50 + src/stores/urge.ts | 22 + src/stores/useReviewWordStore.ts | 14 + src/stores/user.ts | 305 + src/stores/wordDetail.ts | 52 + src/stores/wordSort.ts | 61 + src/styles/element-plus.scss | 106 + src/styles/global.scss | 583 ++ src/styles/homeWorkCSS/point.png | Bin 0 -> 17676 bytes src/styles/homeWorkCSS/style.css | 530 ++ src/styles/homeWorkCSS/style.scss | 26 + src/styles/homeWorkCSS/wave.png | Bin 0 -> 17687 bytes src/styles/nprogress.scss | 42 + src/styles/qml-preview.css | 269 + src/styles/variate.scss | 349 + src/styles/variate.ts | 1 + src/styles/vxe.scss | 179 + src/types/enum.ts | 17 + src/types/global.d.ts | 99 + src/types/index.ts | 0 src/types/postcss-px-to-viewport.d.ts | 23 + src/types/question.ts | 108 + src/utils/android.ts | 143 + src/utils/const.ts | 17 + src/utils/copy.ts | 14 + src/utils/dict.ts | 26 + src/utils/hud.ts | 65 + src/utils/index.ts | 11 + src/utils/loading.ts | 25 + src/utils/mathjax.ts | 15 + src/utils/num.ts | 94 + src/utils/obj.ts | 245 + src/utils/polling.ts | 106 + src/utils/random.ts | 40 + src/utils/sass.ts | 46 + src/utils/scroll.ts | 21 + src/utils/sse.ts | 88 + src/utils/store.ts | 44 + src/utils/str.ts | 26 + src/utils/time.ts | 54 + src/utils/tool.ts | 340 + src/utils/xbTable.ts | 122 + src/vite-env.d.ts | 1 + tsconfig.app.json | 35 + tsconfig.json | 16 + tsconfig.node.json | 8 + tsconfig.node.tsbuildinfo | 1 + type-check-errors.txt | 253 + vite.config.ts | 177 + web.html | 67 + 666 files changed, 130383 insertions(+) create mode 100644 .env create mode 100644 .env.test create mode 100644 .eslintignore create mode 100644 .eslintrc.cjs create mode 100644 .gitignore create mode 100755 .husky/commit-msg create mode 100644 .husky/pre-commit create mode 100644 .prettierrc.cjs create mode 100644 .vscode/extensions.json create mode 100644 README.md create mode 100644 backup-config/.eslintrc.js create mode 100644 backup-config/.prettierrc.js create mode 100644 backup-config/settings.json create mode 100644 commitlint.config.cjs create mode 100644 index.html create mode 100644 package.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 public/logo.svg create mode 100644 src/App.vue create mode 100644 src/api/chat.ts create mode 100644 src/api/classroomInteraction.ts create mode 100644 src/api/global.ts create mode 100644 src/api/http.ts create mode 100644 src/api/log.ts create mode 100644 src/api/login.ts create mode 100644 src/api/only-last.ts create mode 100644 src/api/order.ts create mode 100644 src/api/ranking.ts create mode 100644 src/api/request.ts create mode 100644 src/api/service/basic.ts create mode 100644 src/api/service/coin-transaction.ts create mode 100644 src/api/service/self-coin-detail.ts create mode 100644 src/api/service/task.ts create mode 100644 src/api/service/user-task.ts create mode 100644 src/api/service/word-table.ts create mode 100644 src/api/service/word-test.ts create mode 100644 src/api/studentManage.ts create mode 100644 src/api/studyAnalysis.ts create mode 100644 src/api/subject/config.ts create mode 100644 src/api/subject/dictionaries.ts create mode 100644 src/api/subject/doWork.ts create mode 100644 src/api/subject/happyRead.ts create mode 100644 src/api/subject/homework/index.ts create mode 100644 src/api/subject/homework/type.ts create mode 100644 src/api/subject/languageSense.ts create mode 100644 src/api/subject/learnWord.ts create mode 100644 src/api/subject/questionExplain.ts create mode 100644 src/api/subject/sentenceCollect.ts create mode 100644 src/api/subject/subject.ts create mode 100644 src/api/subject/wordBook.ts create mode 100644 src/api/subject/wordDetail.ts create mode 100644 src/api/subject/wordTable.ts create mode 100644 src/api/subject/wordTest.ts create mode 100644 src/api/subject/wrongQuestion.ts create mode 100644 src/api/system/activity.ts create mode 100644 src/api/system/announcement.ts create mode 100644 src/api/system/homeWork.ts create mode 100644 src/api/system/mailbox.ts create mode 100644 src/api/system/setting.ts create mode 100644 src/api/system/user.ts create mode 100644 src/api/task.ts create mode 100644 src/api/urge.ts create mode 100644 src/components/AbbrImg/index.vue create mode 100644 src/components/Accent/index.vue create mode 100644 src/components/AiText/index.scss create mode 100644 src/components/AiText/index.vue create mode 100644 src/components/AiText/languages.json create mode 100644 src/components/BackBar/index.vue create mode 100644 src/components/BigTitle/index.vue create mode 100644 src/components/Btn/index.vue create mode 100644 src/components/ClozeTest/index.vue create mode 100644 src/components/ConfirmDia/index.vue create mode 100644 src/components/DifficultyStart/index.vue create mode 100644 src/components/Empty/index.vue create mode 100644 src/components/EnlargePicture/index.vue create mode 100644 src/components/Horn/index.vue create mode 100644 src/components/HornC.vue create mode 100644 src/components/Icon/index.vue create mode 100644 src/components/ImageCropper/index.vue create mode 100644 src/components/ImgBg/index.vue create mode 100644 src/components/ImgView/index.vue create mode 100644 src/components/ItemPopover/index.vue create mode 100644 src/components/LazyLoad.vue create mode 100644 src/components/LineFont/index.vue create mode 100644 src/components/PostLoad/index.vue create mode 100644 src/components/ProgressBar/index.vue create mode 100644 src/components/RewardDia/index.vue create mode 100644 src/components/Select/index.vue create mode 100644 src/components/SelectTab/index.vue create mode 100644 src/components/ShowLottie/ShowLottie.vue create mode 100644 src/components/ShowLottie/type.ts create mode 100644 src/components/Sidebar/index.vue create mode 100644 src/components/SignaturePad/index.vue create mode 100644 src/components/SimpleTable/index.vue create mode 100644 src/components/Table/column/index.vue create mode 100644 src/components/Table/index.vue create mode 100644 src/components/Table/render/index.vue create mode 100644 src/components/UrmLoad/index.vue create mode 100644 src/components/UrmLoad/urmUrl.json create mode 100644 src/components/UserCenterDia/components/UserCenterSidebar.vue create mode 100644 src/components/UserCenterDia/index.vue create mode 100644 src/components/UserHead/index.vue create mode 100644 src/components/VideoPlayer/index.vue create mode 100644 src/components/WinningStreakAnimation.vue create mode 100644 src/components/WrongQuesItem/OptionsList.vue create mode 100644 src/components/WrongQuesItem/index.vue create mode 100644 src/components/XAe/index.vue create mode 100644 src/components/XDia/index.vue create mode 100644 src/components/XLDia/index.vue create mode 100644 src/components/XStatusDia/index.vue create mode 100644 src/components/XTree/index.ts create mode 100644 src/components/XTree/index.vue create mode 100644 src/components/XTree/item.vue create mode 100644 src/components/board-bg/index.vue create mode 100644 src/components/book-select/index.ts create mode 100644 src/components/book-select/index.vue create mode 100644 src/components/book-shelf/index.vue create mode 100644 src/components/card/number-card/index.vue create mode 100644 src/components/card/right-rate-card/index.vue create mode 100644 src/components/chapter-list/index.vue create mode 100644 src/components/heart-bg/index.vue create mode 100644 src/components/keyboard/index.ts create mode 100644 src/components/keyboard/index.vue create mode 100644 src/components/keyboard/keyboard-item.vue create mode 100644 src/components/latex-text/index.vue create mode 100644 src/components/memory-tips/index.vue create mode 100644 src/components/mj/mj-button/index.vue create mode 100644 src/components/mj/mj-check-group/index.vue create mode 100644 src/components/mj/mj-check/index.vue create mode 100644 src/components/mj/mj-date-picker/index.vue create mode 100644 src/components/mj/mj-dialog/index.ts create mode 100644 src/components/mj/mj-dialog/index.vue create mode 100644 src/components/mj/mj-grid/index.vue create mode 100644 src/components/mj/mj-loading/index.ts create mode 100644 src/components/mj/mj-loading/index.vue create mode 100644 src/components/mj/mj-radio/index.vue create mode 100644 src/components/mj/mj-table/const.ts create mode 100644 src/components/mj/mj-table/fmt.ts create mode 100644 src/components/mj/mj-table/index.scss create mode 100644 src/components/mj/mj-table/index.ts create mode 100644 src/components/mj/mj-table/index.vue create mode 100644 src/components/new-progress-bar/index.vue create mode 100644 src/components/pagination/index.vue create mode 100644 src/components/question/Question.vue create mode 100644 src/components/question/answer/CameraPreview.vue create mode 100644 src/components/question/answer/ClozeTest.vue create mode 100644 src/components/question/answer/CompositeStem.vue create mode 100644 src/components/question/answer/HandDrawn.vue create mode 100644 src/components/question/answer/Input.vue create mode 100644 src/components/question/answer/Judgment.vue create mode 100644 src/components/question/answer/JudgmentCloze.vue create mode 100644 src/components/question/answer/MultipleChoice.vue create mode 100644 src/components/question/answer/Other.vue create mode 100644 src/components/question/answer/SingleChoice.vue create mode 100644 src/components/school-class-select/index.vue create mode 100644 src/components/user-asset-item/index.vue create mode 100644 src/components/user-figure-big/index.vue create mode 100644 src/components/user-figure/index.vue create mode 100644 src/components/user-profile-card/index.vue create mode 100644 src/components/user-task-list/index.vue create mode 100644 src/components/word-book-select/index.vue create mode 100644 src/components/word-book-select/store.ts create mode 100644 src/components/word-book-selector/index.ts create mode 100644 src/components/word-book-selector/index.vue create mode 100644 src/components/word-game/hooks/main.ts create mode 100644 src/components/word-game/index.scss create mode 100644 src/components/word-game/index.ts create mode 100644 src/components/word-game/index.vue create mode 100644 src/components/word-game/word-single-choice/index.vue create mode 100644 src/components/word-game/word-spelling-bee/index.vue create mode 100644 src/components/word-print/index.vue create mode 100644 src/directive/auth.ts create mode 100644 src/directive/index.ts create mode 100644 src/directive/longpress.ts create mode 100644 src/directive/notice-btn-auth.ts create mode 100644 src/hooks/index.ts create mode 100644 src/hooks/useAudio.ts create mode 100644 src/hooks/useBindQrCode.ts create mode 100644 src/hooks/useCommonAudio.ts create mode 100644 src/hooks/useCopy.ts create mode 100644 src/hooks/useDict.ts create mode 100644 src/hooks/useLoad.ts create mode 100644 src/hooks/useLog.ts create mode 100644 src/hooks/useMathJax.ts create mode 100644 src/hooks/useMessage.ts create mode 100644 src/hooks/usePay.ts create mode 100644 src/hooks/useReward.ts create mode 100644 src/hooks/useSocket.ts create mode 100644 src/hooks/useSound.ts create mode 100644 src/hooks/useSubject.ts create mode 100644 src/hooks/useTeacherExplain.ts create mode 100644 src/hooks/useTips.ts create mode 100644 src/hooks/useTools.ts create mode 100644 src/layouts/android.json create mode 100644 src/layouts/app.json create mode 100644 src/layouts/index.vue create mode 100644 src/layouts/tool.vue create mode 100644 src/main.ts create mode 100644 src/page/app/app.ts create mode 100644 src/page/app/index.vue create mode 100644 src/page/app/link.vue create mode 100644 src/page/app/routes.ts create mode 100644 src/page/chat/components/AiText/index.scss create mode 100644 src/page/chat/components/AiText/index.vue create mode 100644 src/page/chat/components/AiText/languages.json create mode 100644 src/page/chat/components/Message.vue create mode 100644 src/page/chat/components/MessageList.vue create mode 100644 src/page/chat/components/Sender.vue create mode 100644 src/page/chat/components/SessionItem.vue create mode 100644 src/page/chat/components/SessionList.vue create mode 100644 src/page/chat/components/Text/test.json create mode 100644 src/page/chat/index.scss create mode 100644 src/page/chat/index.ts create mode 100644 src/page/chat/index.vue create mode 100644 src/page/chat/routes.ts create mode 100644 src/page/classroomInteraction/index.vue create mode 100644 src/page/classroomInteraction/routes.ts create mode 100644 src/page/home/index.vue create mode 100644 src/page/home/routes.ts create mode 100644 src/page/home/self-coin-detail/index.vue create mode 100644 src/page/login/components/Option.vue create mode 100644 src/page/login/index.vue create mode 100644 src/page/login/init.vue create mode 100644 src/page/login/routes.ts create mode 100644 src/page/positive/goodThings/index.vue create mode 100644 src/page/positive/routes.ts create mode 100644 src/page/positive/smileSign/index.vue create mode 100644 src/page/ranking/components/AsideList.vue create mode 100644 src/page/ranking/components/SelectTab.vue create mode 100644 src/page/ranking/components/VirtualList.vue create mode 100644 src/page/ranking/index.vue create mode 100644 src/page/ranking/interface.ts create mode 100644 src/page/ranking/other/index.vue create mode 100644 src/page/ranking/routes.ts create mode 100644 src/page/sfxzy/index.vue create mode 100644 src/page/sfxzy/routes.ts create mode 100644 src/page/student-mgr/basic-info/batch-operation.vue create mode 100644 src/page/student-mgr/basic-info/batch-send.vue create mode 100644 src/page/student-mgr/basic-info/dialog.scss create mode 100644 src/page/student-mgr/basic-info/index.ts create mode 100644 src/page/student-mgr/basic-info/index.vue create mode 100644 src/page/student-mgr/basic-info/user-detail.vue create mode 100644 src/page/student-mgr/coin-detail/index.vue create mode 100644 src/page/student-mgr/index.scss create mode 100644 src/page/student-mgr/index.ts create mode 100644 src/page/student-mgr/index.vue create mode 100644 src/page/student-mgr/routes.ts create mode 100644 src/page/student-mgr/set-book/index.vue create mode 100644 src/page/student-mgr/set-task/add-task/index.scss create mode 100644 src/page/student-mgr/set-task/add-task/index.vue create mode 100644 src/page/student-mgr/set-task/add-task/reward-item/index.vue create mode 100644 src/page/student-mgr/set-task/add-task/target-item/index.vue create mode 100644 src/page/student-mgr/set-task/add-task/target-item/set-target.vue create mode 100644 src/page/student-mgr/set-task/add-task/task-cfg-item/index.vue create mode 100644 src/page/student-mgr/set-task/add-task/task-cfg-item/task-free-learn/index.vue create mode 100644 src/page/student-mgr/set-task/add-task/task-cfg-item/task-sentence/index.vue create mode 100644 src/page/student-mgr/set-task/add-task/task-cfg-item/task-word-quest/index.vue create mode 100644 src/page/student-mgr/set-task/add-task/task-cfg-item/task-word-table/index.vue create mode 100644 src/page/student-mgr/set-task/index.ts create mode 100644 src/page/student-mgr/set-task/index.vue create mode 100644 src/page/student-mgr/set-task/store.ts create mode 100644 src/page/student-mgr/set-task/task-detail/index.vue create mode 100644 src/page/student-mgr/set-task/task-detail/task-basic-info.vue create mode 100644 src/page/student-mgr/store/index.ts create mode 100644 src/page/student-mgr/study-data/chinese-data.vue create mode 100644 src/page/student-mgr/study-data/column.tsx create mode 100644 src/page/student-mgr/study-data/english-data.vue create mode 100644 src/page/student-mgr/study-data/english-word-data.vue create mode 100644 src/page/student-mgr/study-data/hooks/auto-update.ts create mode 100644 src/page/student-mgr/study-data/hooks/index.ts create mode 100644 src/page/student-mgr/study-data/hooks/table.ts create mode 100644 src/page/student-mgr/study-data/index.scss create mode 100644 src/page/student-mgr/study-data/math-data.vue create mode 100644 src/page/student-mgr/study-data/rank.vue create mode 100644 src/page/student-mgr/study-data/subject-data.vue create mode 100644 src/page/study-analysis/components/KnowledgeChart.vue create mode 100644 src/page/study-analysis/components/KnowledgeList.vue create mode 100644 src/page/study-analysis/components/NumberCard.vue create mode 100644 src/page/study-analysis/components/ReadData.vue create mode 100644 src/page/study-analysis/components/SelectTime.vue create mode 100644 src/page/study-analysis/components/StudyTime.vue create mode 100644 src/page/study-analysis/components/TopicChart.vue create mode 100644 src/page/study-analysis/components/VideoTime.vue create mode 100644 src/page/study-analysis/components/WordChart.vue create mode 100644 src/page/study-analysis/hooks.ts create mode 100644 src/page/study-analysis/index.vue create mode 100644 src/page/study-analysis/interface.ts create mode 100644 src/page/study-analysis/routes.ts create mode 100644 src/page/subject/SubjectDia.vue create mode 100644 src/page/subject/aiStudy/index.vue create mode 100644 src/page/subject/components/Book.vue create mode 100644 src/page/subject/components/Card.vue create mode 100644 src/page/subject/components/MapRegion.vue create mode 100644 src/page/subject/components/VideoFullBox/index.vue create mode 100644 src/page/subject/dictionaries/components/TopSearch.vue create mode 100644 src/page/subject/dictionaries/components/seekWords.vue create mode 100644 src/page/subject/dictionaries/index.vue create mode 100644 src/page/subject/dictionaries/interface/index.ts create mode 100644 src/page/subject/doWork/components/AiReplyDia.vue create mode 100644 src/page/subject/doWork/components/Feedback.vue create mode 100644 src/page/subject/doWork/components/reportDia/KnowledgeList.vue create mode 100644 src/page/subject/doWork/components/reportDia/index.vue create mode 100644 src/page/subject/doWork/index.ts create mode 100644 src/page/subject/doWork/index.vue create mode 100644 src/page/subject/doWork/parent.vue create mode 100644 src/page/subject/doWork/titles.ts create mode 100644 src/page/subject/englishBasic/english_basic_categories.json create mode 100644 src/page/subject/englishBasic/index.vue create mode 100644 src/page/subject/explain/index.vue create mode 100644 src/page/subject/explain/parent.vue create mode 100644 src/page/subject/freeStudy/views/home/index.vue create mode 100644 src/page/subject/freeStudy/views/knowledgePoints/Empty.vue create mode 100644 src/page/subject/freeStudy/views/knowledgePoints/KnowledgeCard.vue create mode 100644 src/page/subject/freeStudy/views/knowledgePoints/KnowledgeVideo.vue create mode 100644 src/page/subject/freeStudy/views/knowledgePoints/TrainRecord.vue create mode 100644 src/page/subject/freeStudy/views/knowledgePoints/index.vue create mode 100644 src/page/subject/freeStudy/views/textbookDetail/ChapterTree/index.vue create mode 100644 src/page/subject/freeStudy/views/textbookDetail/ChapterTree/item.vue create mode 100644 src/page/subject/freeStudy/views/textbookDetail/RoundSplit.vue create mode 100644 src/page/subject/freeStudy/views/textbookDetail/TrainList/index.vue create mode 100644 src/page/subject/freeStudy/views/textbookDetail/VideoList/index.vue create mode 100644 src/page/subject/freeStudy/views/textbookDetail/index.vue create mode 100644 src/page/subject/groupPaper/combination/ChapterTree/index.vue create mode 100644 src/page/subject/groupPaper/combination/ChapterTree/item.vue create mode 100644 src/page/subject/groupPaper/combination/TextbookDia/Chapter.vue create mode 100644 src/page/subject/groupPaper/combination/TextbookDia/XTree/index.vue create mode 100644 src/page/subject/groupPaper/combination/TextbookDia/XTree/item.vue create mode 100644 src/page/subject/groupPaper/combination/TextbookDia/index.vue create mode 100644 src/page/subject/groupPaper/combination/index.vue create mode 100644 src/page/subject/groupPaper/history/Card.vue create mode 100644 src/page/subject/groupPaper/history/index.vue create mode 100644 src/page/subject/groupPaper/historyDetail/AnalysisTable.vue create mode 100644 src/page/subject/groupPaper/historyDetail/index.vue create mode 100644 src/page/subject/groupPaper/home/index.vue create mode 100644 src/page/subject/happyRead/classicReading/read/components/NavList.vue create mode 100644 src/page/subject/happyRead/classicReading/read/components/ReadBook.vue create mode 100644 src/page/subject/happyRead/classicReading/read/interface/index.ts create mode 100644 src/page/subject/happyRead/classicReading/read/read.vue create mode 100644 src/page/subject/happyRead/classicReading/readDetail/PlayBooks.vue create mode 100644 src/page/subject/happyRead/classicReading/readDetail/components/playBooksDetails.vue create mode 100644 src/page/subject/happyRead/classicReading/readDetail/components/sentence.vue create mode 100644 src/page/subject/happyRead/classicReading/readDetail/interface/index.ts create mode 100644 src/page/subject/happyRead/classicReading/singleBookIntroduction/components/Introduce.vue create mode 100644 src/page/subject/happyRead/classicReading/singleBookIntroduction/interface/index.ts create mode 100644 src/page/subject/happyRead/classicReading/singleBookIntroduction/singleBookIntroduction.vue create mode 100644 src/page/subject/happyRead/index.vue create mode 100644 src/page/subject/happyRead/phonics/ReportDia.vue create mode 100644 src/page/subject/happyRead/phonics/blankFill/components/ChooseTitle.vue create mode 100644 src/page/subject/happyRead/phonics/blankFill/components/Title.vue create mode 100644 src/page/subject/happyRead/phonics/blankFill/components/WordCard.vue create mode 100644 src/page/subject/happyRead/phonics/blankFill/index.vue create mode 100644 src/page/subject/happyRead/phonics/index.vue create mode 100644 src/page/subject/happyRead/phonics/load.vue create mode 100644 src/page/subject/happyRead/shortReading/index.vue create mode 100644 src/page/subject/happyRead/shortReading/readRecord/index.vue create mode 100644 src/page/subject/happyRead/shortReading/readTopic/components/ReadMeaningSentence.vue create mode 100644 src/page/subject/happyRead/shortReading/readTopic/components/WordChoose.vue create mode 100644 src/page/subject/happyRead/shortReading/readTopic/index.vue create mode 100644 src/page/subject/happyRead/shortReading/readTopic/interface/interface.ts create mode 100644 src/page/subject/index.vue create mode 100644 src/page/subject/languageSense/home/components/ProgressBar.vue create mode 100644 src/page/subject/languageSense/home/index.vue create mode 100644 src/page/subject/languageSense/sentenceCollect/index.vue create mode 100644 src/page/subject/languageSense/sentenceSort/component/Answer.vue create mode 100644 src/page/subject/languageSense/sentenceSort/component/CurrentTopic.vue create mode 100644 src/page/subject/languageSense/sentenceSort/component/Tools.vue create mode 100644 src/page/subject/languageSense/sentenceSort/component/TopicItem.vue create mode 100644 src/page/subject/languageSense/sentenceSort/component/WordCard.vue create mode 100644 src/page/subject/languageSense/sentenceSort/component/topic.scss create mode 100644 src/page/subject/languageSense/sentenceSort/index.vue create mode 100644 src/page/subject/languageSense/sentenceSort/tool.ts create mode 100644 src/page/subject/languageSense/sentenceSortStatistics/index.vue create mode 100644 src/page/subject/learnWord/components/DataBar.vue create mode 100644 src/page/subject/learnWord/components/LevelItem.vue create mode 100644 src/page/subject/learnWord/components/LevelList.vue create mode 100644 src/page/subject/learnWord/components/Road.vue create mode 100644 src/page/subject/learnWord/components/Select.vue create mode 100644 src/page/subject/learnWord/components/UserList.vue create mode 100644 src/page/subject/learnWord/components/medal.vue create mode 100644 src/page/subject/learnWord/hardMode/components/FailPop.vue create mode 100644 src/page/subject/learnWord/hardMode/components/HardRound-1.vue create mode 100644 src/page/subject/learnWord/hardMode/components/Keyboard.vue create mode 100644 src/page/subject/learnWord/hardMode/components/ResultTable.vue create mode 100644 src/page/subject/learnWord/hardMode/components/SuccessPop.vue create mode 100644 src/page/subject/learnWord/hardMode/components/confirmPop.vue create mode 100644 src/page/subject/learnWord/hardMode/hardMode.vue create mode 100644 src/page/subject/learnWord/hardMode/hooks/useAnimate.ts create mode 100644 src/page/subject/learnWord/hardMode/hooks/useAnswer.ts create mode 100644 src/page/subject/learnWord/hardMode/hooks/useAudio.ts create mode 100644 src/page/subject/learnWord/hardMode/hooks/useNextStage.ts create mode 100644 src/page/subject/learnWord/hardMode/hooks/usePopup.ts create mode 100644 src/page/subject/learnWord/hardMode/interface/index.ts create mode 100644 src/page/subject/learnWord/hardMode/styles/animate.scss create mode 100644 src/page/subject/learnWord/hardMode/styles/page.scss create mode 100644 src/page/subject/learnWord/hooks/useInfiniteScroll.ts create mode 100644 src/page/subject/learnWord/index.ts create mode 100644 src/page/subject/learnWord/index.vue create mode 100644 src/page/subject/learnWord/interface/index.ts create mode 100644 src/page/subject/learnWord/normalMode/components/FailPop.vue create mode 100644 src/page/subject/learnWord/normalMode/components/PictureOptions.vue create mode 100644 src/page/subject/learnWord/normalMode/components/ProgressBar.vue create mode 100644 src/page/subject/learnWord/normalMode/components/ResultTable.vue create mode 100644 src/page/subject/learnWord/normalMode/components/SemanticReview.vue create mode 100644 src/page/subject/learnWord/normalMode/components/SingleChoice.vue create mode 100644 src/page/subject/learnWord/normalMode/components/SuccessPop.vue create mode 100644 src/page/subject/learnWord/normalMode/components/TestBtn.vue create mode 100644 src/page/subject/learnWord/normalMode/components/TextOptions.vue create mode 100644 src/page/subject/learnWord/normalMode/hooks/useAnswer.ts create mode 100644 src/page/subject/learnWord/normalMode/hooks/useLoad.ts create mode 100644 src/page/subject/learnWord/normalMode/hooks/usePopup.ts create mode 100644 src/page/subject/learnWord/normalMode/hooks/useStarAnimate.ts create mode 100644 src/page/subject/learnWord/normalMode/interface/index.ts create mode 100644 src/page/subject/learnWord/normalMode/normalMode.vue create mode 100644 src/page/subject/learnWord/normalMode/styles/common.scss create mode 100644 src/page/subject/learnWord/word-review/index.vue create mode 100644 src/page/subject/learnWord/word-table/components/AllBookSeleton.vue create mode 100644 src/page/subject/learnWord/word-table/components/Dropdown.vue create mode 100644 src/page/subject/learnWord/word-table/components/Select.vue create mode 100644 src/page/subject/learnWord/word-table/components/WordPopup.vue create mode 100644 src/page/subject/learnWord/word-table/components/swiper.vue create mode 100644 src/page/subject/learnWord/word-table/hooks/useReadLoading.ts create mode 100644 src/page/subject/learnWord/word-table/index.ts create mode 100644 src/page/subject/learnWord/word-table/index.vue create mode 100644 src/page/subject/learnWord/word-table/interface/index.ts create mode 100644 src/page/subject/learnWord/word-table/style/familiarityColor.scss create mode 100644 src/page/subject/learnWord/word-table/test/components/AdaptiveText.vue create mode 100644 src/page/subject/learnWord/word-table/test/components/Card.vue create mode 100644 src/page/subject/learnWord/word-table/test/components/RecordDetailPop.vue create mode 100644 src/page/subject/learnWord/word-table/test/components/question-box.scss create mode 100644 src/page/subject/learnWord/word-table/test/components/single-choice/index.ts create mode 100644 src/page/subject/learnWord/word-table/test/components/single-choice/index.vue create mode 100644 src/page/subject/learnWord/word-table/test/components/spelling-bee/index.vue create mode 100644 src/page/subject/learnWord/word-table/test/hooks/useExam.ts create mode 100644 src/page/subject/learnWord/word-table/test/index.vue create mode 100644 src/page/subject/learnWord/word-table/test/testList.vue create mode 100644 src/page/subject/learnWord/word-table/test/testRecords.vue create mode 100644 src/page/subject/learnWord/word-table/test/type.ts create mode 100644 src/page/subject/learnWord/word-test-class-records/index.vue create mode 100644 src/page/subject/learnWord/word-test-records/index.ts create mode 100644 src/page/subject/learnWord/word-test-records/index.vue create mode 100644 src/page/subject/learnWord/word-test-records/new-test-dialog/index.vue create mode 100644 src/page/subject/learnWord/word-test/index.vue create mode 100644 src/page/subject/learnWord/word-test/report/index.vue create mode 100644 src/page/subject/learningArtifact/app.ts create mode 100644 src/page/subject/learningArtifact/index.vue create mode 100644 src/page/subject/phoneticTranscription/detail/components/WordCard.vue create mode 100644 src/page/subject/phoneticTranscription/detail/index.vue create mode 100644 src/page/subject/phoneticTranscription/index.vue create mode 100644 src/page/subject/routes.ts create mode 100644 src/page/subject/strangeBook/components/SearchWordPup.vue create mode 100644 src/page/subject/strangeBook/components/WordCard.vue create mode 100644 src/page/subject/strangeBook/index.vue create mode 100644 src/page/subject/strangeBook/interface/index.ts create mode 100644 src/page/subject/studyVideo/index.vue create mode 100644 src/page/subject/textbook/index.vue create mode 100644 src/page/subject/user-word-book/hooks/main.ts create mode 100644 src/page/subject/user-word-book/hooks/word-print.ts create mode 100644 src/page/subject/user-word-book/index.vue create mode 100644 src/page/subject/wordDetails/components/MeaningHighLight.vue create mode 100644 src/page/subject/wordDetails/components/XgVideo.vue create mode 100644 src/page/subject/wordDetails/details/hook.ts create mode 100644 src/page/subject/wordDetails/details/swiperPage.vue create mode 100644 src/page/subject/wordDetails/details/wordForm.vue create mode 100644 src/page/subject/wordDetails/details/wordGist.vue create mode 100644 src/page/subject/wordDetails/details/wordMeaning.vue create mode 100644 src/page/subject/wordDetails/details/wordUnderstand.vue create mode 100644 src/page/subject/wordDetails/index.vue create mode 100644 src/page/subject/wordDetails/skeleton/listSkeleton.vue create mode 100644 src/page/subject/wordDetails/skeleton/wordSkeleton.vue create mode 100644 src/page/subject/wrongBook/index.vue create mode 100644 src/page/system/activity/checkIn.vue create mode 100644 src/page/system/activity/englishEnhance.vue create mode 100644 src/page/system/activity/index.vue create mode 100644 src/page/system/announcement/index.vue create mode 100644 src/page/system/homeWork/history/index.vue create mode 100644 src/page/system/homeWork/index.vue create mode 100644 src/page/system/homeWork/reports/components/Analyse.vue create mode 100644 src/page/system/homeWork/reports/components/Detail.vue create mode 100644 src/page/system/homeWork/reports/components/EchartsBar.vue create mode 100644 src/page/system/homeWork/reports/components/EchartsPie.vue create mode 100644 src/page/system/homeWork/reports/components/Knowledge.vue create mode 100644 src/page/system/homeWork/reports/components/hooks.ts create mode 100644 src/page/system/homeWork/reports/index.vue create mode 100644 src/page/system/homeWork/statistics/SingleAnalysis.vue create mode 100644 src/page/system/homeWork/statistics/Whole.vue create mode 100644 src/page/system/homeWork/statistics/index.vue create mode 100644 src/page/system/homeWork/temporary/index.vue create mode 100644 src/page/system/homeWork/temporary/singleDetail.vue create mode 100644 src/page/system/homeWork/wrong/index.vue create mode 100644 src/page/system/homeWork/wrongQuestion/index.vue create mode 100644 src/page/system/homework copy/do-work/components/Question.vue create mode 100644 src/page/system/homework copy/do-work/index.vue create mode 100644 src/page/system/homework copy/history/index.vue create mode 100644 src/page/system/homework copy/index.vue create mode 100644 src/page/system/homework copy/reports/components/Analyse.vue create mode 100644 src/page/system/homework copy/reports/components/Detail.vue create mode 100644 src/page/system/homework copy/reports/components/EchartsBar.vue create mode 100644 src/page/system/homework copy/reports/components/EchartsPie.vue create mode 100644 src/page/system/homework copy/reports/components/Knowledge.vue create mode 100644 src/page/system/homework copy/reports/components/hooks.ts create mode 100644 src/page/system/homework copy/reports/index.vue create mode 100644 src/page/system/homework copy/statistics/SingleAnalysis.vue create mode 100644 src/page/system/homework copy/statistics/Whole.vue create mode 100644 src/page/system/homework copy/statistics/index.vue create mode 100644 src/page/system/homework copy/temporary/index.vue create mode 100644 src/page/system/homework copy/temporary/singleDetail.vue create mode 100644 src/page/system/homework copy/wrong/index.vue create mode 100644 src/page/system/interface.ts create mode 100644 src/page/system/mailbox/components/LoadIcon.vue create mode 100644 src/page/system/mailbox/index.vue create mode 100644 src/page/system/routes.ts create mode 100644 src/page/system/setting/account.vue create mode 100644 src/page/system/setting/changePassword.vue create mode 100644 src/page/system/setting/equipment.vue create mode 100644 src/page/system/setting/index.vue create mode 100644 src/page/system/setting/voice.vue create mode 100644 src/page/system/user/PayDia.vue create mode 100644 src/page/system/user/basicInfo.vue create mode 100644 src/page/system/user/index.vue create mode 100644 src/page/system/user/medal.vue create mode 100644 src/page/system/user/orderRecord.vue create mode 100644 src/page/system/user/setting.vue create mode 100644 src/page/system/user/vip-center/index.vue create mode 100644 src/page/task/components/Achievement.vue create mode 100644 src/page/task/components/Popover.vue create mode 100644 src/page/task/components/RewardDia.vue create mode 100644 src/page/task/components/dynamic-list.vue create mode 100644 src/page/task/components/show-rewards.vue create mode 100644 src/page/task/components/task-item.vue create mode 100644 src/page/task/components/task-list.vue create mode 100644 src/page/task/index.ts create mode 100644 src/page/task/index.vue create mode 100644 src/page/task/routes.ts create mode 100644 src/page/task/user-task-records/index.vue create mode 100644 src/page/urge/assets/bg-mesh.svg create mode 100644 src/page/urge/assets/bg-stamp.svg create mode 100644 src/page/urge/assets/empty-tip.svg create mode 100644 src/page/urge/assets/hole-purple.svg create mode 100644 src/page/urge/assets/hole.svg create mode 100644 src/page/urge/assets/leaf.svg create mode 100644 src/page/urge/assets/learning/avatar-self.png create mode 100644 src/page/urge/assets/learning/avatar-teacher.png create mode 100644 src/page/urge/assets/learning/bg-im-content.svg create mode 100644 src/page/urge/assets/learning/bg-mesh.svg create mode 100644 src/page/urge/assets/learning/bg-stamp.svg create mode 100644 src/page/urge/assets/learning/icon-failed.svg create mode 100644 src/page/urge/assets/learning/icon-image.svg create mode 100644 src/page/urge/assets/learning/icon-loading.svg create mode 100644 src/page/urge/assets/learning/icon-send.svg create mode 100644 src/page/urge/assets/learning/icon-voice.svg create mode 100644 src/page/urge/assets/nav-next.svg create mode 100644 src/page/urge/assets/nav-prev.svg create mode 100644 src/page/urge/assets/panel-nail.svg create mode 100644 src/page/urge/assets/pay-dialog/reload.svg create mode 100644 src/page/urge/assets/report/panel-stamp.svg create mode 100644 src/page/urge/assets/report/subject-bg-completed.svg create mode 100644 src/page/urge/assets/report/subject-bg.svg create mode 100644 src/page/urge/assets/report/task-heart-completed.svg create mode 100644 src/page/urge/assets/report/task-heart.svg create mode 100644 src/page/urge/assets/stat-corner.svg create mode 100644 src/page/urge/assets/stat-mesh.svg create mode 100644 src/page/urge/assets/task-modes/1.png create mode 100644 src/page/urge/assets/task-modes/2.png create mode 100644 src/page/urge/assets/task-modes/3.png create mode 100644 src/page/urge/assets/teacher.png create mode 100644 src/page/urge/assets/timetable/icon-table.svg create mode 100644 src/page/urge/assets/timetable/wave.svg create mode 100644 src/page/urge/components/Card.vue create mode 100644 src/page/urge/components/ReportExerciseCount.vue create mode 100644 src/page/urge/components/ReportHistory.vue create mode 100644 src/page/urge/components/ReportKnowledgeMap.vue create mode 100644 src/page/urge/components/ReportPanel.vue create mode 100644 src/page/urge/components/ReportProgress.vue create mode 100644 src/page/urge/components/ReportVideoViews.vue create mode 100644 src/page/urge/components/ScheduleTasks.vue create mode 100644 src/page/urge/components/StatCard.vue create mode 100644 src/page/urge/index.vue create mode 100644 src/page/urge/learning/components/LearningDia/VideoBox.vue create mode 100644 src/page/urge/learning/components/LearningDia/index.vue create mode 100644 src/page/urge/learning/components/LearningIm.vue create mode 100644 src/page/urge/learning/components/LearningReport.vue create mode 100644 src/page/urge/learning/components/LearningToday.vue create mode 100644 src/page/urge/learning/home.vue create mode 100644 src/page/urge/opening/components/PayDialog.vue create mode 100644 src/page/urge/opening/home.vue create mode 100644 src/page/urge/routes.ts create mode 100644 src/page/urge/service/components/Faq.vue create mode 100644 src/page/urge/service/components/LearningCases.vue create mode 100644 src/page/urge/service/components/ServiceIntro.vue create mode 100644 src/page/urge/service/components/TeachingStaff.vue create mode 100644 src/page/urge/service/home.vue create mode 100644 src/page/urge/timetable/components/Order.vue create mode 100644 src/page/urge/timetable/components/Report.vue create mode 100644 src/page/urge/timetable/components/Timetable.vue create mode 100644 src/page/urge/timetable/components/TimetableCalendar.vue create mode 100644 src/page/urge/timetable/components/TimetableClass.vue create mode 100644 src/page/urge/timetable/components/TimetableSchedule.vue create mode 100644 src/page/urge/timetable/components/TimetableScheduleDialog.vue create mode 100644 src/page/urge/timetable/components/TimetableTeacher.vue create mode 100644 src/page/urge/timetable/home.vue create mode 100644 src/plugins/dayjs/dayjs.d.ts create mode 100644 src/plugins/dayjs/index.ts create mode 100644 src/plugins/encryptor/index.ts create mode 100644 src/plugins/pinia-plugin-persist/index.ts create mode 100644 src/router/index.ts create mode 100644 src/stores/chat.ts create mode 100644 src/stores/global.ts create mode 100644 src/stores/home-red-point.ts create mode 100644 src/stores/index.ts create mode 100644 src/stores/lead-task.ts create mode 100644 src/stores/learnWord/language-sense.ts create mode 100644 src/stores/learnWord/useLearnWordStore.ts create mode 100644 src/stores/share.ts create mode 100644 src/stores/student-access.ts create mode 100644 src/stores/subject.ts create mode 100644 src/stores/taskJump.ts create mode 100644 src/stores/urge.ts create mode 100644 src/stores/useReviewWordStore.ts create mode 100644 src/stores/user.ts create mode 100644 src/stores/wordDetail.ts create mode 100644 src/stores/wordSort.ts create mode 100644 src/styles/element-plus.scss create mode 100644 src/styles/global.scss create mode 100644 src/styles/homeWorkCSS/point.png create mode 100644 src/styles/homeWorkCSS/style.css create mode 100644 src/styles/homeWorkCSS/style.scss create mode 100644 src/styles/homeWorkCSS/wave.png create mode 100644 src/styles/nprogress.scss create mode 100644 src/styles/qml-preview.css create mode 100644 src/styles/variate.scss create mode 100644 src/styles/variate.ts create mode 100644 src/styles/vxe.scss create mode 100644 src/types/enum.ts create mode 100644 src/types/global.d.ts create mode 100644 src/types/index.ts create mode 100644 src/types/postcss-px-to-viewport.d.ts create mode 100644 src/types/question.ts create mode 100644 src/utils/android.ts create mode 100644 src/utils/const.ts create mode 100644 src/utils/copy.ts create mode 100644 src/utils/dict.ts create mode 100644 src/utils/hud.ts create mode 100644 src/utils/index.ts create mode 100644 src/utils/loading.ts create mode 100644 src/utils/mathjax.ts create mode 100644 src/utils/num.ts create mode 100644 src/utils/obj.ts create mode 100644 src/utils/polling.ts create mode 100644 src/utils/random.ts create mode 100644 src/utils/sass.ts create mode 100644 src/utils/scroll.ts create mode 100644 src/utils/sse.ts create mode 100644 src/utils/store.ts create mode 100644 src/utils/str.ts create mode 100644 src/utils/time.ts create mode 100644 src/utils/tool.ts create mode 100644 src/utils/xbTable.ts create mode 100644 src/vite-env.d.ts create mode 100644 tsconfig.app.json create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 tsconfig.node.tsbuildinfo create mode 100644 type-check-errors.txt create mode 100644 vite.config.ts create mode 100644 web.html diff --git a/.env b/.env new file mode 100644 index 0000000..35c474f --- /dev/null +++ b/.env @@ -0,0 +1,7 @@ +VITE_WS_URL = wss://ai.xuexiaole.com/ws/device +VITE_OSS_URL = https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com +VITE_CDN_URL = https://dmgcdn-1313840333.cos.ap-guangzhou.myqcloud.com +VITE_SERVER_URL = https://ai.xuexiaole.com/api/main +VITE_XXL_VERSION = 2.13.2 +VITE_INIT_VCONSOLE = 0 +VITE_TEACHER_ADMIN_URL = https://edu.xuexiaole.com diff --git a/.env.test b/.env.test new file mode 100644 index 0000000..d6a8ef5 --- /dev/null +++ b/.env.test @@ -0,0 +1,9 @@ +VITE_WS_URL = ws://43.136.52.196:27001/device +# VITE_WS_URL = ws://ai.xuexiaole.com/ws/device +VITE_OSS_URL = https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com +VITE_CDN_URL = https://dmgcdn-1313840333.cos.ap-guangzhou.myqcloud.com +VITE_SERVER_URL = http://127.0.0.1:9053/api/main +# VITE_SERVER_URL = http://test.web.xuexiaole.com/api/main +VITE_XXL_VERSION = 2.13.2 +VITE_INIT_VCONSOLE = 0 +VITE_TEACHER_ADMIN_URL = https://test.edu.xuexiaole.com diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..9aaf0bb --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +node_modules/ +dist/ +build/ +!.prettierrc.js \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 0000000..ac095a8 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,68 @@ +module.exports = { + extends: [ + 'alloy', + 'alloy/vue', + 'alloy/typescript', + 'plugin:@typescript-eslint/recommended', + './.auto-import.json', + ], + parser: 'vue-eslint-parser', + parserOptions: { + parser: { + js: '@babel/eslint-parser', + jsx: '@babel/eslint-parser', + ts: '@typescript-eslint/parser', + tsx: '@typescript-eslint/parser', + }, + }, + rules: { + // 'vue/html-indent': ['error', 4], + // 'vue/max-attributes-per-line': 'off', + // 'vue/html-self-closing': 'off', + // no-duplicate-attr-inheritance 禁止重复属性继承 + '@typescript-eslint/consistent-type-imports': 'off', + '@typescript-eslint/consistent-type-assertions': 'off', + '@typescript-eslint/prefer-optional-chain': 'off', + '@typescript-eslint/explicit-member-accessibility': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/consistent-type-definitions': 'off', + '@typescript-eslint/method-signature-style': 'off', + 'no-return-assign': 'off', + 'guard-for-in': 'off', + 'vue/custom-event-name-casing': 'off', + 'vue/no-duplicate-attributes': 'off', + 'no-param-reassign': 'off', + 'no-inner-declarations': 'off', + + 'vue/no-setup-props-destructure': 'off', + 'vue/no-duplicate-attr-inheritance': 'off', + 'vue/prefer-true-attribute-shorthand': 'off', + 'no-eq-null': 'off', // 允许 == 用于 null + + 'vue/v-on-event-hyphenation': 'off', // 关闭 vue 中 @ 使用短横线命名 + 'vue/require-toggle-inside-transition': 'off', + 'no-duplicate-imports': 'off', // 使用ts-eslint的重复导入规则 + 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'vue/multi-word-component-names': 'off', + 'max-params': ['error', { max: 4 }], + // 圈复杂度 每个函数的最高圈复杂度 + complexity: [ + 'error', + { + max: 30, + }, + ], + }, + globals: { + defineProps: 'readonly', + defineEmits: 'readonly', + defineExpose: 'readonly', + withDefaults: 'readonly', + anyObj: true, + __VERSION__: true, + }, + plugins: ['@typescript-eslint'], +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b11ed96 --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* +yarn.lock + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +.auto-import.d.ts +.auto-import.json +.components.d.ts + +dist* + +/*.gz +/build.sh +.temp \ No newline at end of file diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..70bd3dd --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +npx --no-install commitlint --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..0100eae --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npm run lint-staged diff --git a/.prettierrc.cjs b/.prettierrc.cjs new file mode 100644 index 0000000..15c723d --- /dev/null +++ b/.prettierrc.cjs @@ -0,0 +1,14 @@ +module.exports = { + printWidth: 100, + tabWidth: 2, + useTabs: false, + semi: false, + singleQuote: true, + jsxSingleQuote: true, + bracketSpacing: true, + bracketSameLine: false, + arrowParens: 'avoid', + trailingComma: 'all', + vueIndentScriptAndStyle: false, + endOfLine: 'lf', +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..e8dc9ed --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,30 @@ +{ + "recommendations": [ + // Vue 3 的语言支持 + "Vue.volar", + // 将 ESLint JavaScript 集成到 VS Code 中。 + "dbaeumer.vscode-eslint", + // Visual Studio Code 的官方 Stylelint 扩展 + "stylelint.vscode-stylelint", + // 使用 Prettier 的代码格式化程序 + "esbenp.prettier-vscode", + // 支持 dotenv 文件语法 + "mikestead.dotenv", + // 源代码的拼写检查器 + "streetsidesoftware.code-spell-checker", + // Tailwind CSS 的官方 VS Code 插件 + "bradlc.vscode-tailwindcss", + // iconify 图标插件 + "antfu.iconify", + // i18n 插件 + "Lokalise.i18n-ally", + // CSS 变量提示 + "vunguyentuan.vscode-css-variables", + // 在 package.json 中显示 PNPM catalog 的版本 + "antfu.pnpm-catalog-lens" + ], + "unwantedRecommendations": [ + // 和 volar 冲突 + "octref.vetur" + ] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..33895ab --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..8732364 --- /dev/null +++ b/package.json @@ -0,0 +1,104 @@ +{ + "name": "xuexiaole-web", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite --mode test", + "build": "vue-tsc --noEmit --skipLibCheck && vite build", + "build-test": "vue-tsc --noEmit --skipLibCheck && vite build --mode test", + "preview": "vite preview", + "prepare": "husky", + "type-check": "vue-tsc --build", + "lint": "eslint --config .eslintrc.cjs --fix \"src/**/*.{js,ts,vue}\"", + "lint-staged": "lint-staged", + "format": "prettier --config .prettierrc.cjs --write \"src/**/*.{js,ts,vue,json,css,scss}\"" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "@microsoft/fetch-event-source": "^2.0.1", + "@types/hammerjs": "^2.0.45", + "@types/lodash-es": "^4.17.12", + "@types/nprogress": "^0.2.3", + "@types/qrcode": "^1.5.5", + "@vant/touch-emulator": "^1.4.0", + "@vscode/markdown-it-katex": "^1.1.1", + "@vueuse/core": "^10.11.0", + "animejs": "^3.2.2", + "axios": "^1.7.2", + "chart.js": "^4.4.3", + "compare-versions": "^6.1.1", + "dayjs": "^1.11.12", + "echarts": "^5.5.1", + "element-plus": "^2.7.8", + "hammerjs": "^2.0.8", + "highlight.js": "^11.11.1", + "html2canvas": "^1.4.1", + "jsencrypt": "^3.3.2", + "jslib-html5-camera-photo": "^3.3.4", + "jspdf": "^3.0.1", + "katex": "^0.16.21", + "lodash-es": "^4.17.21", + "lottie-web": "^5.12.2", + "markdown-it": "^14.1.0", + "mathjax": "3.0.1", + "mermaid-it-markdown": "^1.0.8", + "nprogress": "^0.2.0", + "pinia": "^2.2.0", + "postcss": "^8.4.40", + "qrcode": "^1.5.4", + "qs": "^6.12.3", + "signature_pad": "^5.0.4", + "vant": "^4.9.4", + "vconsole": "^3.15.1", + "vue": "^3.4.31", + "vue-cropper": "^1.1.4", + "vue-router": "^4.4.0", + "vxe-pc-ui": "^4.6.20", + "vxe-table": "^4.13.37", + "xe-utils": "^3.7.5", + "xgplayer": "^3.0.19" + }, + "devDependencies": { + "@babel/core": "^7.19.6", + "@babel/eslint-parser": "^7.25.1", + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", + "@types/katex": "^0.16.7", + "@types/markdown-it": "^14.1.2", + "@types/markdown-it-link-attributes": "^3.0.5", + "@types/node": "^22.0.0", + "@types/qs": "^6.9.15", + "@typescript-eslint/eslint-plugin": "^7.17.0", + "@typescript-eslint/parser": "^7.17.0", + "@vitejs/plugin-vue": "^5.0.5", + "@vitejs/plugin-vue-jsx": "^4.0.1", + "@vue/eslint-config-typescript": "^11.0.2", + "@vue/tsconfig": "^0.5.1", + "eslint": "^8.57.0", + "eslint-config-alloy": "^5.1.2", + "eslint-plugin-import": "^2.29.1", + "eslint-plugin-vue": "^9.27.0", + "husky": "^9.1.3", + "lint-staged": "^15.2.7", + "markdown-it-link-attributes": "^4.0.1", + "postcss-px-to-viewport": "^1.1.1", + "prettier": "^3.3.3", + "sass": "^1.77.6", + "typescript": "^5.2.2", + "unplugin-auto-import": "^0.18.2", + "unplugin-vue-components": "^0.27.3", + "vite": "^5.3.4", + "vue-eslint-parser": "^9.1.0", + "vue-tsc": "^2.0.24" + }, + "lint-staged": { + "*.{json,md,css,less}": [ + "prettier --write" + ], + "*.{js,ts,jsx,tsx,vue}": [ + "prettier --write", + "eslint --fix" + ] + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..f1e455e --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,7604 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@element-plus/icons-vue': + specifier: ^2.3.1 + version: 2.3.1(vue@3.5.13(typescript@5.8.2)) + '@microsoft/fetch-event-source': + specifier: ^2.0.1 + version: 2.0.1 + '@types/hammerjs': + specifier: ^2.0.45 + version: 2.0.46 + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 + '@types/nprogress': + specifier: ^0.2.3 + version: 0.2.3 + '@types/qrcode': + specifier: ^1.5.5 + version: 1.5.5 + '@vant/touch-emulator': + specifier: ^1.4.0 + version: 1.4.0 + '@vscode/markdown-it-katex': + specifier: ^1.1.1 + version: 1.1.1 + '@vueuse/core': + specifier: ^10.11.0 + version: 10.11.1(vue@3.5.13(typescript@5.8.2)) + animejs: + specifier: ^3.2.2 + version: 3.2.2 + axios: + specifier: ^1.7.2 + version: 1.8.4 + chart.js: + specifier: ^4.4.3 + version: 4.4.8 + compare-versions: + specifier: ^6.1.1 + version: 6.1.1 + dayjs: + specifier: ^1.11.12 + version: 1.11.13 + echarts: + specifier: ^5.5.1 + version: 5.6.0 + element-plus: + specifier: ^2.7.8 + version: 2.9.7(vue@3.5.13(typescript@5.8.2)) + hammerjs: + specifier: ^2.0.8 + version: 2.0.8 + highlight.js: + specifier: ^11.11.1 + version: 11.11.1 + html2canvas: + specifier: ^1.4.1 + version: 1.4.1 + jsencrypt: + specifier: ^3.3.2 + version: 3.3.2 + jslib-html5-camera-photo: + specifier: ^3.3.4 + version: 3.3.4 + jspdf: + specifier: ^3.0.1 + version: 3.0.1 + katex: + specifier: ^0.16.21 + version: 0.16.21 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + lottie-web: + specifier: ^5.12.2 + version: 5.12.2 + markdown-it: + specifier: ^14.1.0 + version: 14.1.0 + mathjax: + specifier: 3.0.1 + version: 3.0.1 + mermaid-it-markdown: + specifier: ^1.0.8 + version: 1.0.8(mermaid@10.9.3)(typescript@5.8.2) + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + pinia: + specifier: ^2.2.0 + version: 2.3.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2)) + postcss: + specifier: ^8.4.40 + version: 8.5.3 + qrcode: + specifier: ^1.5.4 + version: 1.5.4 + qs: + specifier: ^6.12.3 + version: 6.14.0 + signature_pad: + specifier: ^5.0.4 + version: 5.0.7 + vant: + specifier: ^4.9.4 + version: 4.9.18(vue@3.5.13(typescript@5.8.2)) + vconsole: + specifier: ^3.15.1 + version: 3.15.1 + vue: + specifier: ^3.4.31 + version: 3.5.13(typescript@5.8.2) + vue-cropper: + specifier: ^1.1.4 + version: 1.1.4 + vue-router: + specifier: ^4.4.0 + version: 4.5.0(vue@3.5.13(typescript@5.8.2)) + vxe-pc-ui: + specifier: ^4.6.20 + version: 4.6.20(vue@3.5.13(typescript@5.8.2)) + vxe-table: + specifier: ^4.13.37 + version: 4.13.37(vue@3.5.13(typescript@5.8.2)) + xe-utils: + specifier: ^3.7.5 + version: 3.7.5 + xgplayer: + specifier: ^3.0.19 + version: 3.0.21(core-js@3.41.0) + devDependencies: + '@babel/core': + specifier: ^7.19.6 + version: 7.26.10 + '@babel/eslint-parser': + specifier: ^7.25.1 + version: 7.27.0(@babel/core@7.26.10)(eslint@8.57.1) + '@commitlint/cli': + specifier: ^19.3.0 + version: 19.8.0(@types/node@22.14.0)(typescript@5.8.2) + '@commitlint/config-conventional': + specifier: ^19.2.2 + version: 19.8.0 + '@types/katex': + specifier: ^0.16.7 + version: 0.16.7 + '@types/markdown-it': + specifier: ^14.1.2 + version: 14.1.2 + '@types/markdown-it-link-attributes': + specifier: ^3.0.5 + version: 3.0.5 + '@types/node': + specifier: ^22.0.0 + version: 22.14.0 + '@types/qs': + specifier: ^6.9.15 + version: 6.9.18 + '@typescript-eslint/eslint-plugin': + specifier: ^7.17.0 + version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': + specifier: ^7.17.0 + version: 7.18.0(eslint@8.57.1)(typescript@5.8.2) + '@vitejs/plugin-vue': + specifier: ^5.0.5 + version: 5.2.3(vite@5.4.17(@types/node@22.14.0)(sass@1.86.2)(terser@5.39.0))(vue@3.5.13(typescript@5.8.2)) + '@vitejs/plugin-vue-jsx': + specifier: ^4.0.1 + version: 4.1.2(vite@5.4.17(@types/node@22.14.0)(sass@1.86.2)(terser@5.39.0))(vue@3.5.13(typescript@5.8.2)) + '@vue/eslint-config-typescript': + specifier: ^11.0.2 + version: 11.0.3(eslint-plugin-vue@9.33.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.8.2) + '@vue/tsconfig': + specifier: ^0.5.1 + version: 0.5.1 + eslint: + specifier: ^8.57.0 + version: 8.57.1 + eslint-config-alloy: + specifier: ^5.1.2 + version: 5.1.2(@babel/eslint-parser@7.27.0(@babel/core@7.26.10)(eslint@8.57.1))(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint-plugin-vue@9.33.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.8.2)(vue-eslint-parser@9.4.3(eslint@8.57.1)) + eslint-plugin-import: + specifier: ^2.29.1 + version: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1) + eslint-plugin-vue: + specifier: ^9.27.0 + version: 9.33.0(eslint@8.57.1) + husky: + specifier: ^9.1.3 + version: 9.1.7 + lint-staged: + specifier: ^15.2.7 + version: 15.5.0 + markdown-it-link-attributes: + specifier: ^4.0.1 + version: 4.0.1 + postcss-px-to-viewport: + specifier: ^1.1.1 + version: 1.1.1 + prettier: + specifier: ^3.3.3 + version: 3.5.3 + sass: + specifier: ^1.77.6 + version: 1.86.2 + typescript: + specifier: ^5.2.2 + version: 5.8.2 + unplugin-auto-import: + specifier: ^0.18.2 + version: 0.18.6(@vueuse/core@10.11.1(vue@3.5.13(typescript@5.8.2)))(rollup@4.39.0) + unplugin-vue-components: + specifier: ^0.27.3 + version: 0.27.5(@babel/parser@7.27.0)(rollup@4.39.0)(vue@3.5.13(typescript@5.8.2)) + vite: + specifier: ^5.3.4 + version: 5.4.17(@types/node@22.14.0)(sass@1.86.2)(terser@5.39.0) + vue-eslint-parser: + specifier: ^9.1.0 + version: 9.4.3(eslint@8.57.1) + vue-tsc: + specifier: ^2.0.24 + version: 2.2.8(typescript@5.8.2) + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@antfu/utils@0.7.10': + resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} + + '@babel/eslint-parser@7.27.0': + resolution: {integrity: sha512-dtnzmSjXfgL/HDgMcmsLSzyGbEosi4DrGWoCNfuI+W4IkVJw6izpTe7LtOdwAXnkDqw5yweboYCTkM2rQizCng==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + + '@babel/generator@7.27.0': + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.27.0': + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.27.0': + resolution: {integrity: sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.26.5': + resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.27.0': + resolution: {integrity: sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.27.0': + resolution: {integrity: sha512-fRGGjO2UEGPjvEcyAZXRXAS8AfdaQoq7HnxAbJoAoW10B9xOKesmmndJv+Sym2a+9FHWZ9KbyyLCe9s0Sn5jtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.27.0': + resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@6.0.4': + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + + '@commitlint/cli@19.8.0': + resolution: {integrity: sha512-t/fCrLVu+Ru01h0DtlgHZXbHV2Y8gKocTR5elDOqIRUzQd0/6hpt2VIWOj9b3NDo7y4/gfxeR2zRtXq/qO6iUg==} + engines: {node: '>=v18'} + hasBin: true + + '@commitlint/config-conventional@19.8.0': + resolution: {integrity: sha512-9I2kKJwcAPwMoAj38hwqFXG0CzS2Kj+SAByPUQ0SlHTfb7VUhYVmo7G2w2tBrqmOf7PFd6MpZ/a1GQJo8na8kw==} + engines: {node: '>=v18'} + + '@commitlint/config-validator@19.8.0': + resolution: {integrity: sha512-+r5ZvD/0hQC3w5VOHJhGcCooiAVdynFlCe2d6I9dU+PvXdV3O+fU4vipVg+6hyLbQUuCH82mz3HnT/cBQTYYuA==} + engines: {node: '>=v18'} + + '@commitlint/ensure@19.8.0': + resolution: {integrity: sha512-kNiNU4/bhEQ/wutI1tp1pVW1mQ0QbAjfPRo5v8SaxoVV+ARhkB8Wjg3BSseNYECPzWWfg/WDqQGIfV1RaBFQZg==} + engines: {node: '>=v18'} + + '@commitlint/execute-rule@19.8.0': + resolution: {integrity: sha512-fuLeI+EZ9x2v/+TXKAjplBJWI9CNrHnyi5nvUQGQt4WRkww/d95oVRsc9ajpt4xFrFmqMZkd/xBQHZDvALIY7A==} + engines: {node: '>=v18'} + + '@commitlint/format@19.8.0': + resolution: {integrity: sha512-EOpA8IERpQstxwp/WGnDArA7S+wlZDeTeKi98WMOvaDLKbjptuHWdOYYr790iO7kTCif/z971PKPI2PkWMfOxg==} + engines: {node: '>=v18'} + + '@commitlint/is-ignored@19.8.0': + resolution: {integrity: sha512-L2Jv9yUg/I+jF3zikOV0rdiHUul9X3a/oU5HIXhAJLE2+TXTnEBfqYP9G5yMw/Yb40SnR764g4fyDK6WR2xtpw==} + engines: {node: '>=v18'} + + '@commitlint/lint@19.8.0': + resolution: {integrity: sha512-+/NZKyWKSf39FeNpqhfMebmaLa1P90i1Nrb1SrA7oSU5GNN/lksA4z6+ZTnsft01YfhRZSYMbgGsARXvkr/VLQ==} + engines: {node: '>=v18'} + + '@commitlint/load@19.8.0': + resolution: {integrity: sha512-4rvmm3ff81Sfb+mcWT5WKlyOa+Hd33WSbirTVUer0wjS1Hv/Hzr07Uv1ULIV9DkimZKNyOwXn593c+h8lsDQPQ==} + engines: {node: '>=v18'} + + '@commitlint/message@19.8.0': + resolution: {integrity: sha512-qs/5Vi9bYjf+ZV40bvdCyBn5DvbuelhR6qewLE8Bh476F7KnNyLfdM/ETJ4cp96WgeeHo6tesA2TMXS0sh5X4A==} + engines: {node: '>=v18'} + + '@commitlint/parse@19.8.0': + resolution: {integrity: sha512-YNIKAc4EXvNeAvyeEnzgvm1VyAe0/b3Wax7pjJSwXuhqIQ1/t2hD3OYRXb6D5/GffIvaX82RbjD+nWtMZCLL7Q==} + engines: {node: '>=v18'} + + '@commitlint/read@19.8.0': + resolution: {integrity: sha512-6ywxOGYajcxK1y1MfzrOnwsXO6nnErna88gRWEl3qqOOP8MDu/DTeRkGLXBFIZuRZ7mm5yyxU5BmeUvMpNte5w==} + engines: {node: '>=v18'} + + '@commitlint/resolve-extends@19.8.0': + resolution: {integrity: sha512-CLanRQwuG2LPfFVvrkTrBR/L/DMy3+ETsgBqW1OvRxmzp/bbVJW0Xw23LnnExgYcsaFtos967lul1CsbsnJlzQ==} + engines: {node: '>=v18'} + + '@commitlint/rules@19.8.0': + resolution: {integrity: sha512-IZ5IE90h6DSWNuNK/cwjABLAKdy8tP8OgGVGbXe1noBEX5hSsu00uRlLu6JuruiXjWJz2dZc+YSw3H0UZyl/mA==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@19.8.0': + resolution: {integrity: sha512-3CKLUw41Cur8VMjh16y8LcsOaKbmQjAKCWlXx6B0vOUREplp6em9uIVhI8Cv934qiwkbi2+uv+mVZPnXJi1o9A==} + engines: {node: '>=v18'} + + '@commitlint/top-level@19.8.0': + resolution: {integrity: sha512-Rphgoc/omYZisoNkcfaBRPQr4myZEHhLPx2/vTXNLjiCw4RgfPR1wEgUpJ9OOmDCiv5ZyIExhprNLhteqH4FuQ==} + engines: {node: '>=v18'} + + '@commitlint/types@19.8.0': + resolution: {integrity: sha512-LRjP623jPyf3Poyfb0ohMj8I3ORyBDOwXAgxxVPbSD0unJuW2mJWeiRfaQinjtccMqC5Wy1HOMfa4btKjbNxbg==} + engines: {node: '>=v18'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@element-plus/icons-vue@2.3.1': + resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} + peerDependencies: + vue: ^3.2.0 + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.5.1': + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@kurkle/color@0.3.4': + resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + + '@microsoft/fetch-event-source@2.0.1': + resolution: {integrity: sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==} + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@one-ini/wasm@0.1.1': + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + + '@parcel/watcher-android-arm64@2.5.1': + resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.1': + resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.1': + resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.1': + resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.1': + resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm-musl@2.5.1': + resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-arm64-musl@2.5.1': + resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@parcel/watcher-linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@parcel/watcher-linux-x64-musl@2.5.1': + resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@parcel/watcher-win32-arm64@2.5.1': + resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.1': + resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.1': + resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.1': + resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + engines: {node: '>= 10.0.0'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.39.0': + resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.39.0': + resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.39.0': + resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.39.0': + resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.39.0': + resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.39.0': + resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': + resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm-musleabihf@4.39.0': + resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} + cpu: [arm] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-arm64-gnu@4.39.0': + resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-arm64-musl@4.39.0': + resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': + resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} + cpu: [loong64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': + resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-gnu@4.39.0': + resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-riscv64-musl@4.39.0': + resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@rollup/rollup-linux-s390x-gnu@4.39.0': + resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-gnu@4.39.0': + resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rollup/rollup-linux-x64-musl@4.39.0': + resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rollup/rollup-win32-arm64-msvc@4.39.0': + resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.39.0': + resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.39.0': + resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} + cpu: [x64] + os: [win32] + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + + '@types/conventional-commits-parser@5.0.1': + resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.9': + resolution: {integrity: sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + + '@types/hammerjs@2.0.46': + resolution: {integrity: sha512-ynRvcq6wvqexJ9brDMS4BnBLzmr0e14d6ZJTEShTBWKymQiHwlAyGu0ZPEFI2Fh1U53F7tN9ufClWM5KvqkKOw==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/katex@0.16.7': + resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.16': + resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} + + '@types/markdown-it-link-attributes@3.0.5': + resolution: {integrity: sha512-VZ2BGN3ywUg7mBD8W6PwR8ChpOxaQSBDbLqPgvNI+uIra3zY2af1eG/3XzWTKjEraTWskMKnZqZd6m1fDF67Bg==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + + '@types/node@22.14.0': + resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} + + '@types/nprogress@0.2.3': + resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} + + '@types/qrcode@1.5.5': + resolution: {integrity: sha512-CdfBi/e3Qk+3Z/fXYShipBT13OJ2fDO2Q2w5CIP5anLTLIndQG9z6P1cnm+8zCWSpm5dnxMFd/uREtb0EXuQzg==} + + '@types/qs@6.9.18': + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + + '@types/raf@3.4.3': + resolution: {integrity: sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==} + + '@types/semver@7.7.0': + resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + + '@types/vue@2.0.0': + resolution: {integrity: sha512-WDElkBv/o4lVwu6wYHB06AXs4Xo2fwDjJUpvPRc1QQdzkUSiGFjrYuSCy8raxLE5FObgKq8ND7R5gSZTFLK60w==} + deprecated: This is a stub types definition for vuejs (https://github.com/vuejs/vue). vuejs provides its own type definitions, so you don't need @types/vue installed! + + '@types/web-bluetooth@0.0.16': + resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} + + '@vant/popperjs@1.3.0': + resolution: {integrity: sha512-hB+czUG+aHtjhaEmCJDuXOep0YTZjdlRR+4MSmIFnkCQIxJaXLQdSsR90XWvAI2yvKUI7TCGqR8pQg2RtvkMHw==} + + '@vant/touch-emulator@1.4.0': + resolution: {integrity: sha512-Zt+zISV0+wpOew2S1siOJ3G22y+hapHAKmXM+FhpvWzsRc4qahaYXatCAITuuXt0EcDp7WvEeTO4F7p9AtX/pw==} + + '@vant/use@1.6.0': + resolution: {integrity: sha512-PHHxeAASgiOpSmMjceweIrv2AxDZIkWXyaczksMoWvKV2YAYEhoizRuk/xFnKF+emUIi46TsQ+rvlm/t2BBCfA==} + peerDependencies: + vue: ^3.0.0 + + '@vitejs/plugin-vue-jsx@4.1.2': + resolution: {integrity: sha512-4Rk0GdE0QCdsIkuMmWeg11gmM4x8UmTnZR/LWPm7QJ7+BsK4tq08udrN0isrrWqz5heFy9HLV/7bOLgFS8hUjA==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.0.0 + + '@vitejs/plugin-vue@5.2.3': + resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} + engines: {node: ^18.0.0 || >=20.0.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 + vue: ^3.2.25 + + '@volar/language-core@2.4.12': + resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==} + + '@volar/source-map@2.4.12': + resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==} + + '@volar/typescript@2.4.12': + resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==} + + '@vscode/markdown-it-katex@1.1.1': + resolution: {integrity: sha512-3KTlbsRBPJQLE2YmLL7K6nunTlU+W9T5+FjfNdWuIUKgxSS6HWLQHaO3L4MkJi7z7MpIPpY+g4N+cWNBPE/MSA==} + + '@vue/babel-helper-vue-transform-on@1.4.0': + resolution: {integrity: sha512-mCokbouEQ/ocRce/FpKCRItGo+013tHg7tixg3DUNS+6bmIchPt66012kBMm476vyEIJPafrvOf4E5OYj3shSw==} + + '@vue/babel-plugin-jsx@1.4.0': + resolution: {integrity: sha512-9zAHmwgMWlaN6qRKdrg1uKsBKHvnUU+Py+MOCTuYZBoZsopa90Di10QRjB+YPnVss0BZbG/H5XFwJY1fTxJWhA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + peerDependenciesMeta: + '@babel/core': + optional: true + + '@vue/babel-plugin-resolve-type@1.4.0': + resolution: {integrity: sha512-4xqDRRbQQEWHQyjlYSgZsWj44KfiF6D+ktCuXyZ8EnVDYV3pztmXJDf1HveAjUAXxAnR8daCQT51RneWWxtTyQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + + '@vue/compiler-sfc@3.5.13': + resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + + '@vue/compiler-ssr@3.5.13': + resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/eslint-config-typescript@11.0.3': + resolution: {integrity: sha512-dkt6W0PX6H/4Xuxg/BlFj5xHvksjpSlVjtkQCpaYJBIEuKj2hOVU7r+TIe+ysCwRYFz/lGqvklntRkCAibsbPw==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 + eslint-plugin-vue: ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/language-core@2.2.8': + resolution: {integrity: sha512-rrzB0wPGBvcwaSNRriVWdNAbHQWSf0NlGqgKHK5mEkXpefjUlVRP62u03KvwZpvKVjRnBIQ/Lwre+Mx9N6juUQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@vue/reactivity@3.5.13': + resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + + '@vue/runtime-core@3.5.13': + resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + + '@vue/runtime-dom@3.5.13': + resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + + '@vue/server-renderer@3.5.13': + resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + peerDependencies: + vue: 3.5.13 + + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + + '@vue/tsconfig@0.5.1': + resolution: {integrity: sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==} + + '@vueuse/core@10.11.1': + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + + '@vueuse/core@9.13.0': + resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} + + '@vueuse/metadata@10.11.1': + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + + '@vueuse/metadata@9.13.0': + resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} + + '@vueuse/shared@10.11.1': + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + + '@vueuse/shared@9.13.0': + resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} + + '@vxe-ui/core@4.1.5': + resolution: {integrity: sha512-IgRwVueejOGC5t+bVmBAUkoUplvp1R77pfYX6bb4fcLEPUdBGOdm4I0LCKTDWQ24Mj3Bki7wNpt3sdtEZEzdoA==} + peerDependencies: + vue: ^3.2.0 + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + alien-signals@1.0.13: + resolution: {integrity: sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==} + + animejs@3.2.2: + resolution: {integrity: sha512-Ao95qWLpDPXXM+WrmwcKbl6uNlC5tjnowlaRYtuVDHHoygjtIPfDUoK9NthrlZsQSKjZXlmji2TrBUAVbiH0LQ==} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axios@1.8.4: + resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-arraybuffer@1.0.2: + resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} + engines: {node: '>= 0.6.0'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + btoa@1.2.1: + resolution: {integrity: sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==} + engines: {node: '>= 0.4.0'} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001709: + resolution: {integrity: sha512-NgL3vUTnDrPCZ3zTahp4fsugQ4dc7EKTSzwQDPEel6DMoMnfH2jhry9n2Zm8onbSR+f/QtKHFOA+iAQu4kbtWA==} + + canvg@3.0.11: + resolution: {integrity: sha512-5ON+q7jCTgMp9cjpu4Jo6XbvfYwSB2Ow3kzHKfIyJfaCAOHLbdKPQqGKgfED/R5B+3TFFfe8pegYA+b423SRyA==} + engines: {node: '>=10.0.0'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + chart.js@4.4.8: + resolution: {integrity: sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==} + engines: {pnpm: '>=8'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@13.1.0: + resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + compare-versions@6.1.1: + resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + + confbox@0.2.1: + resolution: {integrity: sha512-hkT3yDPFbs95mNCy1+7qNKC6Pro+/ibzYxtM2iqEigpf0sVw+bg4Zh9/snjsBcf990vfIsg5+1U7VyiyBb3etg==} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-text-to-clipboard@3.2.0: + resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==} + engines: {node: '>=12'} + + core-js@3.41.0: + resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + cosmiconfig-typescript-loader@6.1.0: + resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} + engines: {node: '>=v18'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=9' + typescript: '>=5' + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + css-line-break@2.1.0: + resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.31.2: + resolution: {integrity: sha512-/eOXg2uGdMdpGlEes5Sf6zE+jUG+05f3htFNQIxLxduOH/SsaUZiPBfAwP1btVIVzsnhiNOdi+hvDRLYfMZjGw==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + d@1.0.2: + resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} + engines: {node: '>=0.12'} + + dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + + danmu.js@1.1.13: + resolution: {integrity: sha512-knFd0/cB2HA4FFWiA7eB2suc5vCvoHdqio33FyyCSfP7C+1A+zQcTvnvwfxaZhrxsGj4qaQI2I8XiTqedRaVmg==} + + dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-named-character-reference@1.1.0: + resolution: {integrity: sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegate@3.2.0: + resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dijkstrajs@1.0.3: + resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-zindex@1.0.6: + resolution: {integrity: sha512-FKWIhiU96bi3xpP9ewRMgANsoVmMUBnMnmpCT6dPMZOunVYJQmJhSRruoI0XSPoHeIif3kyEuiHbFrOJwEJaEA==} + + dompurify@3.1.6: + resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==} + + dompurify@3.2.6: + resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + downloadjs@1.4.7: + resolution: {integrity: sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q==} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + echarts@5.6.0: + resolution: {integrity: sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==} + + editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + + electron-to-chromium@1.5.130: + resolution: {integrity: sha512-Ou2u7L9j2XLZbhqzyX0jWDj6gA8D3jIfVzt4rikLf3cGBa0VdReuFimBKS9tQJA4+XpeCxj1NoWlfBXzbMa9IA==} + + element-plus@2.9.7: + resolution: {integrity: sha512-6vjZh5SXBncLhUwJGTVKS5oDljfgGMh6J4zVTeAZK3YdMUN76FgpvHkwwFXocpJpMbii6rDYU3sgie64FyPerQ==} + peerDependencies: + vue: ^3.2.0 + + elkjs@0.9.3: + resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.9: + resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + es5-ext@0.10.64: + resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} + engines: {node: '>=0.10'} + + es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + + es6-symbol@3.1.4: + resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} + engines: {node: '>=0.12'} + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-alloy@5.1.2: + resolution: {integrity: sha512-jppzCxNqlhvMYPgfUzvPq4f9fEu070+m3CRIjWdUx/GJLZ6dXHARzMIrIhFuIvzYI5Qo40ht1gunguLnRhIB7A==} + peerDependencies: + '@babel/eslint-parser': 7.x + '@babel/preset-react': 7.x + '@typescript-eslint/eslint-plugin': '>=5.55.0' + '@typescript-eslint/parser': '>=5.0.0' + eslint: '>=8.24.0' + eslint-plugin-react: '>=7.31.8' + eslint-plugin-vue: '>=9.5.1' + typescript: 5.x + vue-eslint-parser: 9.x + peerDependenciesMeta: + '@babel/eslint-parser': + optional: true + '@babel/preset-react': + optional: true + '@typescript-eslint/eslint-plugin': + optional: true + '@typescript-eslint/parser': + optional: true + eslint-plugin-react: + optional: true + eslint-plugin-vue: + optional: true + typescript: + optional: true + vue-eslint-parser: + optional: true + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-vue@9.33.0: + resolution: {integrity: sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + esniff@2.0.1: + resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} + engines: {node: '>=0.10'} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-emitter@0.3.5: + resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==} + + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exsolve@1.0.4: + resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} + + ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.6: + resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + + form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + hammerjs@2.0.8: + resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} + engines: {node: '>=0.8.0'} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + highlight.js@11.11.1: + resolution: {integrity: sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w==} + engines: {node: '>=12.0.0'} + + html2canvas@1.4.1: + resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} + engines: {node: '>=8.0.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@9.1.7: + resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immutable@5.1.1: + resolution: {integrity: sha512-3jatXi9ObIsPGr3N5hGw/vWWcTkq6hUYhpQz4k0wLC+owqWi/LiugIw9x0EdNZ2yGedKN/HzePiBvaJRXa0Ujg==} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-generator-function@1.1.0: + resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + + js-beautify@1.15.4: + resolution: {integrity: sha512-9/KXeZUKKJwqCXUdBxFJ3vPh467OCckSBmYDwSK/EtV090K+iMJ7zx2S3HLVDIWFQdqMIsZWbnaGiba18aWhaA==} + engines: {node: '>=14'} + hasBin: true + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsencrypt@3.3.2: + resolution: {integrity: sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==} + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + jslib-html5-camera-photo@3.3.4: + resolution: {integrity: sha512-qysjLnP4bud0+g0qs5uA/7i569x+6ID2ufgezf9XQ+BE3EvhYjz177vi9WXLEuq+V6C/WXEv73NUICvHm5VGmQ==} + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jspdf@3.0.1: + resolution: {integrity: sha512-qaGIxqxetdoNnFQQXxTKUD9/Z7AloLaw94fFsOiJMxbfYdBbrBuhWmbzI8TVjrw7s3jBY1PFHofBKMV/wZPapg==} + + katex@0.16.21: + resolution: {integrity: sha512-XvqR7FgOHtWupfMiigNzmh+MgUVmDGU2kXZm899ZkPfcuoPuFxyHmXsgATDpFZDAXCI8tvinaVcDo8PIIJSo4A==} + hasBin: true + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@4.0.1: + resolution: {integrity: sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + lint-staged@15.5.0: + resolution: {integrity: sha512-WyCzSbfYGhK7cU+UuDDkzUiytbfbi0ZdPy2orwtM75P3WTtQBzmG40cCxIa8Ii2+XjfxzLH6Be46tUfWS85Xfg==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.5: + resolution: {integrity: sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ==} + engines: {node: '>=18.0.0'} + + local-pkg@0.5.1: + resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} + engines: {node: '>=14'} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + lottie-web@5.12.2: + resolution: {integrity: sha512-uvhvYPC8kGPjXT3MyKMrL3JitEAmDMp30lVkuq/590Mw9ok6pWcFCwXJveo0t5uqYw1UREQHofD+jVpdjBv8wg==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + + markdown-it-link-attributes@4.0.1: + resolution: {integrity: sha512-pg5OK0jPLg62H4k7M9mRJLT61gUp9nvG0XveKYHMOOluASo9OEF13WlXrpAp2aj35LbedAy3QOCgQCw0tkLKAQ==} + + markdown-it@13.0.2: + resolution: {integrity: sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==} + hasBin: true + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + mathjax@3.0.1: + resolution: {integrity: sha512-hrwOeKm3b1X4zpvLRSX89y3MZLRJTq0bSGIbo5M6BANOeGlL2z8Y8mZaKRFJ/WY4qcIrHp3f+Q9RWIaldOCUVg==} + + mavon-editor@3.0.2: + resolution: {integrity: sha512-QmmsypznEkru3Gj9u/i3OLs7uWOwrAUDyLAiQnl7bj2lvZZ++J7MPA+Al0G26cQZ8GwzyC69T5l6NQjZ2z1Nuw==} + + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + + mdurl@1.0.1: + resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid-it-markdown@1.0.8: + resolution: {integrity: sha512-MIHk2BiPYNQTiMdmI/heKA3+PK+Ite6aoO5FVc9YcYLlW0pGDShAy1798ynyiWVXrxAf5+3vzhlvz3xR0fQ4zg==} + peerDependencies: + mermaid: ^10.7.0 + + mermaid@10.9.3: + resolution: {integrity: sha512-V80X1isSEvAewIL3xhmz/rVmc27CVljcsbWxkxlWJWY/1kQa4XOABqpDl2qQLGKzpKm6WbTfUEKImBlUfFYArw==} + + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + + mutation-observer@1.0.3: + resolution: {integrity: sha512-M/O/4rF2h776hV7qGMZUH3utZLO/jK7p8rnNgGkjKUw8zCGjRQPxB8z6+5l8+VjRUQ3dNYu4vjqXYLr+U8ZVNA==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pinia@2.3.1: + resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} + peerDependencies: + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + pkg-types@2.1.0: + resolution: {integrity: sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==} + + pngjs@5.0.0: + resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} + engines: {node: '>=10.13.0'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss-px-to-viewport@1.1.1: + resolution: {integrity: sha512-2x9oGnBms+e0cYtBJOZdlwrFg/mLR4P1g2IFu7jYKvnqnH/HLhoKyareW2Q/x4sg0BgklHlP1qeWo2oCyPm8FQ==} + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} + engines: {node: '>=14'} + hasBin: true + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qrcode@1.5.4: + resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} + engines: {node: '>=10.13.0'} + hasBin: true + + qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + + quansync@0.2.10: + resolution: {integrity: sha512-t41VRkMYbkHyCYmOvx/6URnN80H7k4X0lLdBMGsz+maAwrJQYB1djpV6vHrQIBE0WBSGqhtEHrK9U3DWWH8v7A==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + raf@3.4.1: + resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rgbcolor@1.0.1: + resolution: {integrity: sha512-9aZLIrhRaD97sgVhtJOW6ckOEh6/GnvQtdVNfdZ6s67+3/XwLS9lBcQYzEEhYVeUowN7pRzMLsyGhK2i/xvWbw==} + engines: {node: '>= 0.8.15'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.39.0: + resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.86.2: + resolution: {integrity: sha512-Rpfn0zAIDqvnSb2DihJTDFjbhqLHu91Wqac9rxontWk7R+2txcPjuujMqu1eeoezh5kAblVCS5EdFdyr0Jmu+w==} + engines: {node: '>=14.0.0'} + hasBin: true + + scule@1.3.0: + resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} + engines: {node: '>=10'} + hasBin: true + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + signature_pad@5.0.7: + resolution: {integrity: sha512-j2C6NTZ3c99G3hvFTsg6oOWy/tmftgwIXrvsr3+99+5SuPW6OdSpo++ZUzLVNfNHYmp2Z2Al76YV/3RhS/nDJg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + stackblur-canvas@2.7.0: + resolution: {integrity: sha512-yf7OENo23AGJhBriGx0QivY5JP6Y1HbrrDI6WLt6C5auYZXlQrheoY8hD4ibekFKz1HOfE48Ww8kMWMnJD/zcQ==} + engines: {node: '>=0.1.14'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.1: + resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==} + + stylis@4.3.6: + resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svg-pathdata@6.0.3: + resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} + engines: {node: '>=12.0.0'} + + terser@5.39.0: + resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + engines: {node: '>=10'} + hasBin: true + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + text-segmentation@1.0.3: + resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type@2.7.3: + resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript@5.8.2: + resolution: {integrity: sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@1.0.6: + resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unimport@3.14.6: + resolution: {integrity: sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unplugin-auto-import@0.18.6: + resolution: {integrity: sha512-LMFzX5DtkTj/3wZuyG5bgKBoJ7WSgzqSGJ8ppDRdlvPh45mx6t6w3OcbExQi53n3xF5MYkNGPNR/HYOL95KL2A==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^3.2.2 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + + unplugin-vue-components@0.27.5: + resolution: {integrity: sha512-m9j4goBeNwXyNN8oZHHxvIIYiG8FQ9UfmKWeNllpDvhU7btKNNELGPt+o3mckQKuPwrE7e0PvCsx+IWuDSD9Vg==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} + + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utrie@1.0.2: + resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + vant@4.9.18: + resolution: {integrity: sha512-1bmWv/G0xz45btPqSasgv4TUdTqCneyFfnrQJ3xgerGvfTC5aP/rpO4wJb5FItCZjaSw5+9FNBj2Tz6n9TLXYA==} + peerDependencies: + vue: ^3.0.0 + + vconsole@3.15.1: + resolution: {integrity: sha512-KH8XLdrq9T5YHJO/ixrjivHfmF2PC2CdVoK6RWZB4yftMykYIaXY1mxZYAic70vADM54kpMQF+dYmvl5NRNy1g==} + + vite@5.4.17: + resolution: {integrity: sha512-5+VqZryDj4wgCs55o9Lp+p8GE78TLVg0lasCH5xFZ4jacZjtqZa6JUw9/p0WeAojaOfncSM6v77InkFPGnvPvg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + + vue-cropper@1.1.4: + resolution: {integrity: sha512-5m98vBsCEI9rbS4JxELxXidtAui3qNyTHLHg67Qbn7g8cg+E6LcnC+hh3SM/p94x6mFh6KRxT1ttnta+wCYqWA==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + vue-router@4.5.0: + resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==} + peerDependencies: + vue: ^3.2.0 + + vue-tsc@2.2.8: + resolution: {integrity: sha512-jBYKBNFADTN+L+MdesNX/TB3XuDSyaWynKMDgR+yCSln0GQ9Tfb7JS2lr46s2LiFUT1WsmfWsSvIElyxzOPqcQ==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + + vue@3.5.13: + resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vxe-pc-ui@4.6.20: + resolution: {integrity: sha512-XUT05luKCb59Eh5v5ic5UeRtZPCgtxYQ9eFmz3Ga4XeAvCkPnHBHwWZYzDkB9t+XXA/SIhjC34D88Qh9r0gLeg==} + + vxe-table@4.13.37: + resolution: {integrity: sha512-0UaN73LPwrWXdt35lcsxchrxkvanDoEChB74Ar8FIDpsCQcDr3PSqc7EdWvK6okufhArbukDdhqNhQAamZr+kw==} + + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xe-utils@3.7.5: + resolution: {integrity: sha512-wDjqnXw02EQxf2jqlE1nhvT9HP3PDVcyrol5whDJN/NOvnMyXIzcwEiPB/H2T3aq07f2QQXsSs4Z8g5L3BVH5A==} + + xgplayer-subtitles@3.0.21: + resolution: {integrity: sha512-Z3EVdFe31c0JUYwuG/C6+T2NKfiGqzzcd0na7FZ9Kx6nIDznGPtLeG6EZOaZXnfW8V35b/WhfsdKSBXYzBOOqw==} + peerDependencies: + core-js: '>=3.12.1' + + xgplayer@3.0.21: + resolution: {integrity: sha512-v4O+qzok994AZ2EeU1yFjWhGa6p6V8mdPpWHmfCL7AE3Bqo+MRsYEhWYIhj3FXPK8aUYO6VWyTFc1MThpLYZJA==} + peerDependencies: + core-js: '>=3.12.1' + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} + hasBin: true + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yaml@2.7.1: + resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.2.1: + resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} + engines: {node: '>=12.20'} + + zrender@5.6.1: + resolution: {integrity: sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@antfu/utils@0.7.10': {} + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} + + '@babel/core@7.26.10': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/eslint-parser@7.27.0(@babel/core@7.26.10)(eslint@8.57.1)': + dependencies: + '@babel/core': 7.26.10 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.57.1 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + + '@babel/generator@7.27.0': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.27.0 + + '@babel/helper-compilation-targets@7.27.0': + dependencies: + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.4 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.27.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.10) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.27.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.25.9': + dependencies: + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.25.9': + dependencies: + '@babel/types': 7.27.0 + + '@babel/helper-plugin-utils@7.26.5': {} + + '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.27.0': + dependencies: + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/parser@7.27.0': + dependencies: + '@babel/types': 7.27.0 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-typescript@7.27.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.27.0(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.10) + transitivePeerDependencies: + - supports-color + + '@babel/runtime@7.27.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/traverse@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.27.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@braintree/sanitize-url@6.0.4': {} + + '@commitlint/cli@19.8.0(@types/node@22.14.0)(typescript@5.8.2)': + dependencies: + '@commitlint/format': 19.8.0 + '@commitlint/lint': 19.8.0 + '@commitlint/load': 19.8.0(@types/node@22.14.0)(typescript@5.8.2) + '@commitlint/read': 19.8.0 + '@commitlint/types': 19.8.0 + tinyexec: 0.3.2 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/config-conventional@19.8.0': + dependencies: + '@commitlint/types': 19.8.0 + conventional-changelog-conventionalcommits: 7.0.2 + + '@commitlint/config-validator@19.8.0': + dependencies: + '@commitlint/types': 19.8.0 + ajv: 8.17.1 + + '@commitlint/ensure@19.8.0': + dependencies: + '@commitlint/types': 19.8.0 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@19.8.0': {} + + '@commitlint/format@19.8.0': + dependencies: + '@commitlint/types': 19.8.0 + chalk: 5.4.1 + + '@commitlint/is-ignored@19.8.0': + dependencies: + '@commitlint/types': 19.8.0 + semver: 7.7.2 + + '@commitlint/lint@19.8.0': + dependencies: + '@commitlint/is-ignored': 19.8.0 + '@commitlint/parse': 19.8.0 + '@commitlint/rules': 19.8.0 + '@commitlint/types': 19.8.0 + + '@commitlint/load@19.8.0(@types/node@22.14.0)(typescript@5.8.2)': + dependencies: + '@commitlint/config-validator': 19.8.0 + '@commitlint/execute-rule': 19.8.0 + '@commitlint/resolve-extends': 19.8.0 + '@commitlint/types': 19.8.0 + chalk: 5.4.1 + cosmiconfig: 9.0.0(typescript@5.8.2) + cosmiconfig-typescript-loader: 6.1.0(@types/node@22.14.0)(cosmiconfig@9.0.0(typescript@5.8.2))(typescript@5.8.2) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@19.8.0': {} + + '@commitlint/parse@19.8.0': + dependencies: + '@commitlint/types': 19.8.0 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + + '@commitlint/read@19.8.0': + dependencies: + '@commitlint/top-level': 19.8.0 + '@commitlint/types': 19.8.0 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + tinyexec: 0.3.2 + + '@commitlint/resolve-extends@19.8.0': + dependencies: + '@commitlint/config-validator': 19.8.0 + '@commitlint/types': 19.8.0 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + + '@commitlint/rules@19.8.0': + dependencies: + '@commitlint/ensure': 19.8.0 + '@commitlint/message': 19.8.0 + '@commitlint/to-lines': 19.8.0 + '@commitlint/types': 19.8.0 + + '@commitlint/to-lines@19.8.0': {} + + '@commitlint/top-level@19.8.0': + dependencies: + find-up: 7.0.0 + + '@commitlint/types@19.8.0': + dependencies: + '@types/conventional-commits-parser': 5.0.1 + chalk: 5.4.1 + + '@ctrl/tinycolor@3.6.1': {} + + '@element-plus/icons-vue@2.3.1(vue@3.5.13(typescript@5.8.2))': + dependencies: + vue: 3.5.13(typescript@5.8.2) + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.5.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.4.0 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/utils@0.2.9': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@kurkle/color@0.3.4': {} + + '@microsoft/fetch-event-source@2.0.1': {} + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@one-ini/wasm@0.1.1': {} + + '@parcel/watcher-android-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.1': + optional: true + + '@parcel/watcher-darwin-x64@2.5.1': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.1': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.1': + optional: true + + '@parcel/watcher-win32-arm64@2.5.1': + optional: true + + '@parcel/watcher-win32-ia32@2.5.1': + optional: true + + '@parcel/watcher-win32-x64@2.5.1': + optional: true + + '@parcel/watcher@2.5.1': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.1 + '@parcel/watcher-darwin-arm64': 2.5.1 + '@parcel/watcher-darwin-x64': 2.5.1 + '@parcel/watcher-freebsd-x64': 2.5.1 + '@parcel/watcher-linux-arm-glibc': 2.5.1 + '@parcel/watcher-linux-arm-musl': 2.5.1 + '@parcel/watcher-linux-arm64-glibc': 2.5.1 + '@parcel/watcher-linux-arm64-musl': 2.5.1 + '@parcel/watcher-linux-x64-glibc': 2.5.1 + '@parcel/watcher-linux-x64-musl': 2.5.1 + '@parcel/watcher-win32-arm64': 2.5.1 + '@parcel/watcher-win32-ia32': 2.5.1 + '@parcel/watcher-win32-x64': 2.5.1 + optional: true + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@rollup/pluginutils@5.1.4(rollup@4.39.0)': + dependencies: + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.2 + optionalDependencies: + rollup: 4.39.0 + + '@rollup/rollup-android-arm-eabi@4.39.0': + optional: true + + '@rollup/rollup-android-arm64@4.39.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.39.0': + optional: true + + '@rollup/rollup-darwin-x64@4.39.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.39.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.39.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.39.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.39.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.39.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.39.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.39.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.39.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.39.0': + optional: true + + '@rtsao/scc@1.1.0': {} + + '@sxzz/popperjs-es@2.11.7': {} + + '@types/conventional-commits-parser@5.0.1': + dependencies: + '@types/node': 22.14.0 + + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.9': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-time@3.0.4': {} + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + + '@types/estree@1.0.7': {} + + '@types/hammerjs@2.0.46': {} + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/katex@0.16.7': {} + + '@types/linkify-it@5.0.0': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.16 + + '@types/lodash@4.17.16': {} + + '@types/markdown-it-link-attributes@3.0.5': + dependencies: + '@types/markdown-it': 14.1.2 + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + + '@types/mdurl@2.0.0': {} + + '@types/ms@2.1.0': {} + + '@types/node@22.14.0': + dependencies: + undici-types: 6.21.0 + + '@types/nprogress@0.2.3': {} + + '@types/qrcode@1.5.5': + dependencies: + '@types/node': 22.14.0 + + '@types/qs@6.9.18': {} + + '@types/raf@3.4.3': + optional: true + + '@types/semver@7.7.0': {} + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@2.0.11': {} + + '@types/vue@2.0.0(typescript@5.8.2)': + dependencies: + vue: 3.5.13(typescript@5.8.2) + transitivePeerDependencies: + - typescript + + '@types/web-bluetooth@0.0.16': {} + + '@types/web-bluetooth@0.0.20': {} + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + debug: 4.4.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) + debug: 4.4.0 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + debug: 4.4.0 + eslint: 8.57.1 + tsutils: 3.21.0(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + debug: 4.4.0 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.2)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.7.2 + tsutils: 3.21.0(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.2)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.4.0 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 1.4.3(typescript@5.8.2) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.7.0 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) + eslint: 8.57.1 + eslint-scope: 5.1.1 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.2) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.3.0': {} + + '@vant/popperjs@1.3.0': {} + + '@vant/touch-emulator@1.4.0': {} + + '@vant/use@1.6.0(vue@3.5.13(typescript@5.8.2))': + dependencies: + vue: 3.5.13(typescript@5.8.2) + + '@vitejs/plugin-vue-jsx@4.1.2(vite@5.4.17(@types/node@22.14.0)(sass@1.86.2)(terser@5.39.0))(vue@3.5.13(typescript@5.8.2))': + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-transform-typescript': 7.27.0(@babel/core@7.26.10) + '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.26.10) + vite: 5.4.17(@types/node@22.14.0)(sass@1.86.2)(terser@5.39.0) + vue: 3.5.13(typescript@5.8.2) + transitivePeerDependencies: + - supports-color + + '@vitejs/plugin-vue@5.2.3(vite@5.4.17(@types/node@22.14.0)(sass@1.86.2)(terser@5.39.0))(vue@3.5.13(typescript@5.8.2))': + dependencies: + vite: 5.4.17(@types/node@22.14.0)(sass@1.86.2)(terser@5.39.0) + vue: 3.5.13(typescript@5.8.2) + + '@volar/language-core@2.4.12': + dependencies: + '@volar/source-map': 2.4.12 + + '@volar/source-map@2.4.12': {} + + '@volar/typescript@2.4.12': + dependencies: + '@volar/language-core': 2.4.12 + path-browserify: 1.0.1 + vscode-uri: 3.1.0 + + '@vscode/markdown-it-katex@1.1.1': + dependencies: + katex: 0.16.21 + + '@vue/babel-helper-vue-transform-on@1.4.0': {} + + '@vue/babel-plugin-jsx@1.4.0(@babel/core@7.26.10)': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.10) + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + '@vue/babel-helper-vue-transform-on': 1.4.0 + '@vue/babel-plugin-resolve-type': 1.4.0(@babel/core@7.26.10) + '@vue/shared': 3.5.13 + optionalDependencies: + '@babel/core': 7.26.10 + transitivePeerDependencies: + - supports-color + + '@vue/babel-plugin-resolve-type@1.4.0(@babel/core@7.26.10)': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/parser': 7.27.0 + '@vue/compiler-sfc': 3.5.13 + transitivePeerDependencies: + - supports-color + + '@vue/compiler-core@3.5.13': + dependencies: + '@babel/parser': 7.27.0 + '@vue/shared': 3.5.13 + entities: 4.5.0 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.13': + dependencies: + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-sfc@3.5.13': + dependencies: + '@babel/parser': 7.27.0 + '@vue/compiler-core': 3.5.13 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + estree-walker: 2.0.2 + magic-string: 0.30.17 + postcss: 8.5.3 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.13': + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + + '@vue/devtools-api@6.6.4': {} + + '@vue/eslint-config-typescript@11.0.3(eslint-plugin-vue@9.33.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.8.2)': + dependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@5.8.2) + eslint: 8.57.1 + eslint-plugin-vue: 9.33.0(eslint@8.57.1) + vue-eslint-parser: 9.4.3(eslint@8.57.1) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - supports-color + + '@vue/language-core@2.2.8(typescript@5.8.2)': + dependencies: + '@volar/language-core': 2.4.12 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.13 + alien-signals: 1.0.13 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.8.2 + + '@vue/reactivity@3.5.13': + dependencies: + '@vue/shared': 3.5.13 + + '@vue/runtime-core@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/shared': 3.5.13 + + '@vue/runtime-dom@3.5.13': + dependencies: + '@vue/reactivity': 3.5.13 + '@vue/runtime-core': 3.5.13 + '@vue/shared': 3.5.13 + csstype: 3.1.3 + + '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.8.2))': + dependencies: + '@vue/compiler-ssr': 3.5.13 + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.8.2) + + '@vue/shared@3.5.13': {} + + '@vue/tsconfig@0.5.1': {} + + '@vueuse/core@10.11.1(vue@3.5.13(typescript@5.8.2))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.13(typescript@5.8.2)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@9.13.0(vue@3.5.13(typescript@5.8.2))': + dependencies: + '@types/web-bluetooth': 0.0.16 + '@vueuse/metadata': 9.13.0 + '@vueuse/shared': 9.13.0(vue@3.5.13(typescript@5.8.2)) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@10.11.1': {} + + '@vueuse/metadata@9.13.0': {} + + '@vueuse/shared@10.11.1(vue@3.5.13(typescript@5.8.2))': + dependencies: + vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/shared@9.13.0(vue@3.5.13(typescript@5.8.2))': + dependencies: + vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vxe-ui/core@4.1.5(vue@3.5.13(typescript@5.8.2))': + dependencies: + dom-zindex: 1.0.6 + vue: 3.5.13(typescript@5.8.2) + xe-utils: 3.7.5 + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + abbrev@2.0.0: {} + + acorn-jsx@5.3.2(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn@8.14.1: {} + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.6 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + alien-signals@1.0.13: {} + + animejs@3.2.2: {} + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-ify@1.0.0: {} + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + + array-union@2.1.0: {} + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + async-function@1.0.0: {} + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + atob@2.1.2: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios@1.8.4: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.2 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base64-arraybuffer@1.0.2: {} + + binary-extensions@2.3.0: {} + + boolbase@1.0.0: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.4: + dependencies: + caniuse-lite: 1.0.30001709 + electron-to-chromium: 1.5.130 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3(browserslist@4.24.4) + + btoa@1.2.1: {} + + buffer-from@1.1.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + camelcase@5.3.1: {} + + caniuse-lite@1.0.30001709: {} + + canvg@3.0.11: + dependencies: + '@babel/runtime': 7.27.0 + '@types/raf': 3.4.3 + core-js: 3.41.0 + raf: 3.4.1 + regenerator-runtime: 0.13.11 + rgbcolor: 1.0.1 + stackblur-canvas: 2.7.0 + svg-pathdata: 6.0.3 + optional: true + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.1: {} + + character-entities@2.0.2: {} + + chart.js@4.4.8: + dependencies: + '@kurkle/color': 0.3.4 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@13.1.0: {} + + commander@2.20.3: {} + + commander@7.2.0: {} + + commander@8.3.0: {} + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + compare-versions@6.1.1: {} + + concat-map@0.0.1: {} + + confbox@0.1.8: {} + + confbox@0.2.1: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + conventional-changelog-angular@7.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-conventionalcommits@7.0.2: + dependencies: + compare-func: 2.0.0 + + conventional-commits-parser@5.0.0: + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + + convert-source-map@2.0.0: {} + + copy-text-to-clipboard@3.2.0: {} + + core-js@3.41.0: {} + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + cosmiconfig-typescript-loader@6.1.0(@types/node@22.14.0)(cosmiconfig@9.0.0(typescript@5.8.2))(typescript@5.8.2): + dependencies: + '@types/node': 22.14.0 + cosmiconfig: 9.0.0(typescript@5.8.2) + jiti: 2.4.2 + typescript: 5.8.2 + + cosmiconfig@9.0.0(typescript@5.8.2): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.8.2 + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-line-break@2.1.0: + dependencies: + utrie: 1.0.2 + + cssesc@3.0.0: {} + + cssfilter@0.0.10: {} + + csstype@3.1.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.2): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.31.2 + + cytoscape@3.31.2: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + d@1.0.2: + dependencies: + es5-ext: 0.10.64 + type: 2.7.3 + + dagre-d3-es@7.0.10: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + + danmu.js@1.1.13: + dependencies: + event-emitter: 0.3.5 + + dargs@8.1.0: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dayjs@1.11.13: {} + + de-indent@1.0.2: {} + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + + decamelize@1.2.0: {} + + decode-named-character-reference@1.1.0: + dependencies: + character-entities: 2.0.2 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + delayed-stream@1.0.0: {} + + delegate@3.2.0: {} + + dequal@2.0.3: {} + + detect-libc@1.0.3: + optional: true + + diff@5.2.0: {} + + dijkstrajs@1.0.3: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-zindex@1.0.6: {} + + dompurify@3.1.6: {} + + dompurify@3.2.6: + optionalDependencies: + '@types/trusted-types': 2.0.7 + optional: true + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + downloadjs@1.4.7: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + eastasianwidth@0.2.0: {} + + echarts@5.6.0: + dependencies: + tslib: 2.3.0 + zrender: 5.6.1 + + editorconfig@1.0.4: + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.7.2 + + electron-to-chromium@1.5.130: {} + + element-plus@2.9.7(vue@3.5.13(typescript@5.8.2)): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.1(vue@3.5.13(typescript@5.8.2)) + '@floating-ui/dom': 1.6.13 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.16 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 9.13.0(vue@3.5.13(typescript@5.8.2)) + async-validator: 4.2.5 + dayjs: 1.11.13 + escape-html: 1.0.3 + lodash: 4.17.21 + lodash-es: 4.17.21 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.13(typescript@5.8.2) + transitivePeerDependencies: + - '@vue/composition-api' + + elkjs@0.9.3: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + entities@3.0.1: {} + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + environment@1.1.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.9: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + es5-ext@0.10.64: + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.4 + esniff: 2.0.1 + next-tick: 1.1.0 + + es6-iterator@2.0.3: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + es6-symbol: 3.1.4 + + es6-symbol@3.1.4: + dependencies: + d: 1.0.2 + ext: 1.7.0 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + escalade@3.2.0: {} + + escape-html@1.0.3: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + eslint-config-alloy@5.1.2(@babel/eslint-parser@7.27.0(@babel/core@7.26.10)(eslint@8.57.1))(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint-plugin-vue@9.33.0(eslint@8.57.1))(eslint@8.57.1)(typescript@5.8.2)(vue-eslint-parser@9.4.3(eslint@8.57.1)): + dependencies: + eslint: 8.57.1 + optionalDependencies: + '@babel/eslint-parser': 7.27.0(@babel/core@7.26.10)(eslint@8.57.1) + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1)(typescript@5.8.2) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + eslint-plugin-vue: 9.33.0(eslint@8.57.1) + typescript: 5.8.2 + vue-eslint-parser: 9.4.3(eslint@8.57.1) + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint@8.57.1): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-vue@9.33.0(eslint@8.57.1): + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + eslint: 8.57.1 + globals: 13.24.0 + natural-compare: 1.4.0 + nth-check: 2.1.1 + postcss-selector-parser: 6.1.2 + semver: 7.7.2 + vue-eslint-parser: 9.4.3(eslint@8.57.1) + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - supports-color + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + esniff@2.0.1: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + event-emitter: 0.3.5 + type: 2.7.3 + + espree@9.6.1: + dependencies: + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.7 + + esutils@2.0.3: {} + + event-emitter@0.3.5: + dependencies: + d: 1.0.2 + es5-ext: 0.10.64 + + eventemitter3@4.0.7: {} + + eventemitter3@5.0.1: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + exsolve@1.0.4: {} + + ext@1.7.0: + dependencies: + type: 2.7.3 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.3: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-uri@3.0.6: {} + + fastq@1.19.1: + dependencies: + reusify: 1.1.0 + + fflate@0.8.2: {} + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.3.3: {} + + follow-redirects@1.15.9: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + + form-data@4.0.2: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.8: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.3.0: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + get-stream@8.0.1: {} + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + git-raw-commits@4.0.0: + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.3 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.2.0: {} + + graphemer@1.4.0: {} + + hammerjs@2.0.8: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + highlight.js@11.11.1: {} + + html2canvas@1.4.1: + dependencies: + css-line-break: 2.1.0 + text-segmentation: 1.0.3 + + human-signals@5.0.0: {} + + husky@9.1.7: {} + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ignore@5.3.2: {} + + immutable@5.1.1: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.1.0: {} + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@4.1.1: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-arrayish@0.2.1: {} + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.3.0 + + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-path-inside@3.0.3: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-stream@3.0.0: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-text-path@2.0.0: + dependencies: + text-extensions: 2.4.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.19 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@2.4.2: {} + + js-beautify@1.15.4: + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.4.5 + js-cookie: 3.0.5 + nopt: 7.2.1 + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.1: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsencrypt@3.3.2: {} + + jsesc@3.1.0: {} + + jslib-html5-camera-photo@3.3.4: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonparse@1.3.1: {} + + jspdf@3.0.1: + dependencies: + '@babel/runtime': 7.27.0 + atob: 2.1.2 + btoa: 1.2.1 + fflate: 0.8.2 + optionalDependencies: + canvg: 3.0.11 + core-js: 3.41.0 + dompurify: 3.2.6 + html2canvas: 1.4.1 + + katex@0.16.21: + dependencies: + commander: 8.3.0 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + khroma@2.1.0: {} + + kleur@4.1.5: {} + + layout-base@1.0.2: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lilconfig@3.1.3: {} + + lines-and-columns@1.2.4: {} + + linkify-it@4.0.1: + dependencies: + uc.micro: 1.0.6 + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + lint-staged@15.5.0: + dependencies: + chalk: 5.4.1 + commander: 13.1.0 + debug: 4.4.0 + execa: 8.0.1 + lilconfig: 3.1.3 + listr2: 8.2.5 + micromatch: 4.0.8 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.7.1 + transitivePeerDependencies: + - supports-color + + listr2@8.2.5: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + local-pkg@0.5.1: + dependencies: + mlly: 1.7.4 + pkg-types: 1.3.1 + + local-pkg@1.1.1: + dependencies: + mlly: 1.7.4 + pkg-types: 2.1.0 + quansync: 0.2.10 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.17.21: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.21 + lodash-es: 4.17.21 + + lodash.camelcase@4.3.0: {} + + lodash.isplainobject@4.0.6: {} + + lodash.kebabcase@4.1.1: {} + + lodash.merge@4.6.2: {} + + lodash.mergewith@4.6.2: {} + + lodash.snakecase@4.1.1: {} + + lodash.startcase@4.4.0: {} + + lodash.uniq@4.5.0: {} + + lodash.upperfirst@4.3.1: {} + + lodash@4.17.21: {} + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + lottie-web@5.12.2: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + markdown-it-link-attributes@4.0.1: {} + + markdown-it@13.0.2: + dependencies: + argparse: 2.0.1 + entities: 3.0.1 + linkify-it: 4.0.1 + mdurl: 1.0.1 + uc.micro: 1.0.6 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + math-intrinsics@1.1.0: {} + + mathjax@3.0.1: {} + + mavon-editor@3.0.2: + dependencies: + xss: 1.0.15 + + mdast-util-from-markdown@1.3.1: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + decode-named-character-reference: 1.1.0 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + mdast-util-to-string@3.2.0: + dependencies: + '@types/mdast': 3.0.15 + + mdurl@1.0.1: {} + + mdurl@2.0.0: {} + + memoize-one@6.0.0: {} + + meow@12.1.1: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + mermaid-it-markdown@1.0.8(mermaid@10.9.3)(typescript@5.8.2): + dependencies: + '@types/vue': 2.0.0(typescript@5.8.2) + highlight.js: 11.11.1 + js-beautify: 1.15.4 + markdown-it: 13.0.2 + mavon-editor: 3.0.2 + mermaid: 10.9.3 + terser: 5.39.0 + uuid: 9.0.1 + vue: 3.5.13(typescript@5.8.2) + transitivePeerDependencies: + - typescript + + mermaid@10.9.3: + dependencies: + '@braintree/sanitize-url': 6.0.4 + '@types/d3-scale': 4.0.9 + '@types/d3-scale-chromatic': 3.1.0 + cytoscape: 3.31.2 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.2) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.10 + dayjs: 1.11.13 + dompurify: 3.1.6 + elkjs: 0.9.3 + katex: 0.16.21 + khroma: 2.1.0 + lodash-es: 4.17.21 + mdast-util-from-markdown: 1.3.1 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.3.6 + ts-dedent: 2.2.0 + uuid: 9.0.1 + web-worker: 1.5.0 + transitivePeerDependencies: + - supports-color + + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-encode@1.1.0: {} + + micromark-util-html-tag-name@1.2.0: {} + + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-util-symbol@1.1.0: {} + + micromark-util-types@1.1.0: {} + + micromark@3.2.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.4.0 + decode-named-character-reference: 1.1.0 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mlly@1.7.4: + dependencies: + acorn: 8.14.1 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.5.4 + + mri@1.2.0: {} + + ms@2.1.3: {} + + muggle-string@0.4.1: {} + + mutation-observer@1.0.3: {} + + nanoid@3.3.11: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + next-tick@1.1.0: {} + + node-addon-api@7.1.1: + optional: true + + node-releases@2.0.19: {} + + non-layered-tidy-tree-layout@2.0.2: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-path@3.0.0: {} + + normalize-wheel-es@1.2.0: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nprogress@0.2.0: {} + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.2.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-try@2.2.0: {} + + package-json-from-dist@1.0.1: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-browserify@1.0.1: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + pathe@2.0.3: {} + + performance-now@2.1.0: + optional: true + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + picomatch@4.0.2: {} + + pidtree@0.6.0: {} + + pinia@2.3.1(typescript@5.8.2)(vue@3.5.13(typescript@5.8.2)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.13(typescript@5.8.2) + vue-demi: 0.14.10(vue@3.5.13(typescript@5.8.2)) + optionalDependencies: + typescript: 5.8.2 + transitivePeerDependencies: + - '@vue/composition-api' + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.3 + + pkg-types@2.1.0: + dependencies: + confbox: 0.2.1 + exsolve: 1.0.4 + pathe: 2.0.3 + + pngjs@5.0.0: {} + + possible-typed-array-names@1.1.0: {} + + postcss-px-to-viewport@1.1.1: + dependencies: + object-assign: 4.1.1 + postcss: 8.5.3 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss@8.5.3: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prettier@3.5.3: {} + + proto-list@1.2.4: {} + + proxy-from-env@1.1.0: {} + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + qrcode@1.5.4: + dependencies: + dijkstrajs: 1.0.3 + pngjs: 5.0.0 + yargs: 15.4.1 + + qs@6.14.0: + dependencies: + side-channel: 1.1.0 + + quansync@0.2.10: {} + + queue-microtask@1.2.3: {} + + raf@3.4.1: + dependencies: + performance-now: 2.1.0 + optional: true + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.1.2: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerator-runtime@0.13.11: + optional: true + + regenerator-runtime@0.14.1: {} + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-main-filename@2.0.0: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + reusify@1.1.0: {} + + rfdc@1.4.1: {} + + rgbcolor@1.0.1: + optional: true + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + robust-predicates@3.0.2: {} + + rollup@4.39.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.39.0 + '@rollup/rollup-android-arm64': 4.39.0 + '@rollup/rollup-darwin-arm64': 4.39.0 + '@rollup/rollup-darwin-x64': 4.39.0 + '@rollup/rollup-freebsd-arm64': 4.39.0 + '@rollup/rollup-freebsd-x64': 4.39.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.39.0 + '@rollup/rollup-linux-arm-musleabihf': 4.39.0 + '@rollup/rollup-linux-arm64-gnu': 4.39.0 + '@rollup/rollup-linux-arm64-musl': 4.39.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.39.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.39.0 + '@rollup/rollup-linux-riscv64-gnu': 4.39.0 + '@rollup/rollup-linux-riscv64-musl': 4.39.0 + '@rollup/rollup-linux-s390x-gnu': 4.39.0 + '@rollup/rollup-linux-x64-gnu': 4.39.0 + '@rollup/rollup-linux-x64-musl': 4.39.0 + '@rollup/rollup-win32-arm64-msvc': 4.39.0 + '@rollup/rollup-win32-ia32-msvc': 4.39.0 + '@rollup/rollup-win32-x64-msvc': 4.39.0 + fsevents: 2.3.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + safer-buffer@2.1.2: {} + + sass@1.86.2: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.1 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.1 + + scule@1.3.0: {} + + semver@6.3.1: {} + + semver@7.7.2: {} + + set-blocking@2.0.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + signature_pad@5.0.7: {} + + slash@3.0.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + source-map-js@1.2.1: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + split2@4.2.0: {} + + stackblur-canvas@2.7.0: + optional: true + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.9 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-json-comments@3.1.1: {} + + strip-literal@2.1.1: + dependencies: + js-tokens: 9.0.1 + + stylis@4.3.6: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svg-pathdata@6.0.3: + optional: true + + terser@5.39.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.1 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-extensions@2.4.0: {} + + text-segmentation@1.0.3: + dependencies: + utrie: 1.0.2 + + text-table@0.2.0: {} + + through@2.3.8: {} + + tinyexec@0.3.2: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@1.4.3(typescript@5.8.2): + dependencies: + typescript: 5.8.2 + + ts-dedent@2.2.0: {} + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.3.0: {} + + tsutils@3.21.0(typescript@5.8.2): + dependencies: + tslib: 1.14.1 + typescript: 5.8.2 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type@2.7.3: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript@5.8.2: {} + + uc.micro@1.0.6: {} + + uc.micro@2.1.0: {} + + ufo@1.5.4: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.21.0: {} + + unicorn-magic@0.1.0: {} + + unimport@3.14.6(rollup@4.39.0): + dependencies: + '@rollup/pluginutils': 5.1.4(rollup@4.39.0) + acorn: 8.14.1 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + fast-glob: 3.3.3 + local-pkg: 1.1.1 + magic-string: 0.30.17 + mlly: 1.7.4 + pathe: 2.0.3 + picomatch: 4.0.2 + pkg-types: 1.3.1 + scule: 1.3.0 + strip-literal: 2.1.1 + unplugin: 1.16.1 + transitivePeerDependencies: + - rollup + + unist-util-stringify-position@3.0.3: + dependencies: + '@types/unist': 2.0.11 + + unplugin-auto-import@0.18.6(@vueuse/core@10.11.1(vue@3.5.13(typescript@5.8.2)))(rollup@4.39.0): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.4(rollup@4.39.0) + fast-glob: 3.3.3 + local-pkg: 0.5.1 + magic-string: 0.30.17 + minimatch: 9.0.5 + unimport: 3.14.6(rollup@4.39.0) + unplugin: 1.16.1 + optionalDependencies: + '@vueuse/core': 10.11.1(vue@3.5.13(typescript@5.8.2)) + transitivePeerDependencies: + - rollup + + unplugin-vue-components@0.27.5(@babel/parser@7.27.0)(rollup@4.39.0)(vue@3.5.13(typescript@5.8.2)): + dependencies: + '@antfu/utils': 0.7.10 + '@rollup/pluginutils': 5.1.4(rollup@4.39.0) + chokidar: 3.6.0 + debug: 4.4.0 + fast-glob: 3.3.3 + local-pkg: 0.5.1 + magic-string: 0.30.17 + minimatch: 9.0.5 + mlly: 1.7.4 + unplugin: 1.16.1 + vue: 3.5.13(typescript@5.8.2) + optionalDependencies: + '@babel/parser': 7.27.0 + transitivePeerDependencies: + - rollup + - supports-color + + unplugin@1.16.1: + dependencies: + acorn: 8.14.1 + webpack-virtual-modules: 0.6.2 + + update-browserslist-db@1.1.3(browserslist@4.24.4): + dependencies: + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + utrie@1.0.2: + dependencies: + base64-arraybuffer: 1.0.2 + + uuid@9.0.1: {} + + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + + vant@4.9.18(vue@3.5.13(typescript@5.8.2)): + dependencies: + '@vant/popperjs': 1.3.0 + '@vant/use': 1.6.0(vue@3.5.13(typescript@5.8.2)) + '@vue/shared': 3.5.13 + vue: 3.5.13(typescript@5.8.2) + + vconsole@3.15.1: + dependencies: + '@babel/runtime': 7.27.0 + copy-text-to-clipboard: 3.2.0 + core-js: 3.41.0 + mutation-observer: 1.0.3 + + vite@5.4.17(@types/node@22.14.0)(sass@1.86.2)(terser@5.39.0): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.3 + rollup: 4.39.0 + optionalDependencies: + '@types/node': 22.14.0 + fsevents: 2.3.3 + sass: 1.86.2 + terser: 5.39.0 + + vscode-uri@3.1.0: {} + + vue-cropper@1.1.4: {} + + vue-demi@0.14.10(vue@3.5.13(typescript@5.8.2)): + dependencies: + vue: 3.5.13(typescript@5.8.2) + + vue-eslint-parser@9.4.3(eslint@8.57.1): + dependencies: + debug: 4.4.0 + eslint: 8.57.1 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.7.2 + transitivePeerDependencies: + - supports-color + + vue-router@4.5.0(vue@3.5.13(typescript@5.8.2)): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.13(typescript@5.8.2) + + vue-tsc@2.2.8(typescript@5.8.2): + dependencies: + '@volar/typescript': 2.4.12 + '@vue/language-core': 2.2.8(typescript@5.8.2) + typescript: 5.8.2 + + vue@3.5.13(typescript@5.8.2): + dependencies: + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-sfc': 3.5.13 + '@vue/runtime-dom': 3.5.13 + '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.8.2)) + '@vue/shared': 3.5.13 + optionalDependencies: + typescript: 5.8.2 + + vxe-pc-ui@4.6.20(vue@3.5.13(typescript@5.8.2)): + dependencies: + '@vxe-ui/core': 4.1.5(vue@3.5.13(typescript@5.8.2)) + transitivePeerDependencies: + - vue + + vxe-table@4.13.37(vue@3.5.13(typescript@5.8.2)): + dependencies: + vxe-pc-ui: 4.6.20(vue@3.5.13(typescript@5.8.2)) + transitivePeerDependencies: + - vue + + web-worker@1.5.0: {} + + webpack-virtual-modules@0.6.2: {} + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-module@2.0.1: {} + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + xe-utils@3.7.5: {} + + xgplayer-subtitles@3.0.21(core-js@3.41.0): + dependencies: + core-js: 3.41.0 + eventemitter3: 4.0.7 + + xgplayer@3.0.21(core-js@3.41.0): + dependencies: + core-js: 3.41.0 + danmu.js: 1.1.13 + delegate: 3.2.0 + downloadjs: 1.4.7 + eventemitter3: 4.0.7 + xgplayer-subtitles: 3.0.21(core-js@3.41.0) + + xml-name-validator@4.0.0: {} + + xss@1.0.15: + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yaml@2.7.1: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@21.1.1: {} + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} + + yocto-queue@1.2.1: {} + + zrender@5.6.1: + dependencies: + tslib: 2.3.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000..68d36a3 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,6 @@ +allowBuilds: + '@parcel/watcher': true + core-js: false + es5-ext: false + esbuild: true + vue-demi: true diff --git a/public/logo.svg b/public/logo.svg new file mode 100644 index 0000000..fc0908c --- /dev/null +++ b/public/logo.svg @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..31fa015 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/api/chat.ts b/src/api/chat.ts new file mode 100644 index 0000000..fe374c4 --- /dev/null +++ b/src/api/chat.ts @@ -0,0 +1,79 @@ +import { request, SseConfig } from '@/utils/sse' +import { get } from './request' + +export interface Session { + id: any + title: string + updateTime: string + num: number + local?: boolean + messages?: Message[] +} + +export interface Message { + id: any + role: 'user' | 'ai' + content: string + createTime: string + reasoning?: string | null +} + +export interface AiReply { + type: number + content: string +} + +export type ChatsConfig = Omit & { + onMessage: (reasoningText: string, normalText: string) => void +} + +const getSessionsApi = async (): Promise => { + return await get('/chats') +} + +const getMessagesApi = async (sessionId: any): Promise => { + return await get(`/chats/${sessionId}`) +} + +const requestChats = async (method: 'GET' | 'POST', config: ChatsConfig) => { + // 思考的文字 + let reasoningText = '' + // 普通文字 + let normalText = '' + // 请求 + await request({ + ...(config as SseConfig), + method, + onMessage: message => { + // 提取并解析 JSON + const json = JSON.parse(message) + if (json.type === 3 || !json.content) return + if (json.type === 1) { + // 思考 + reasoningText += json.content + } else { + // 普通 + normalText += json.content + } + // 更新消息 + config.onMessage(reasoningText, normalText) + }, + }) +} + +const postChats = async (config: ChatsConfig) => { + return await requestChats('POST', config) +} + +const getChats = async (config: ChatsConfig) => { + return await requestChats('GET', config) +} + +const chatApi = { + getSessionsApi, + getMessagesApi, + postChats, + getChats, +} + +export default chatApi diff --git a/src/api/classroomInteraction.ts b/src/api/classroomInteraction.ts new file mode 100644 index 0000000..386f9a4 --- /dev/null +++ b/src/api/classroomInteraction.ts @@ -0,0 +1,32 @@ +import { http } from './http' + +const config = { + baseURL: '/api/campus', +} + +const classroomInteractionApi = { + /** + * 获取学生随堂检测历史 + */ + getClassDetectionRecordList: (params: anyObj) => { + return http.request({ + url: '/sc/classDetectionRecord/list', + params, + ...config, + }) + }, + + /** + * 新增随堂检测记录 + */ + addClassDetectionRecord: (data: anyObj) => { + return http.request({ + url: '/sc/classDetectionRecord', + method: 'POST', + data, + ...config, + }) + }, +} + +export default classroomInteractionApi diff --git a/src/api/global.ts b/src/api/global.ts new file mode 100644 index 0000000..f6bd581 --- /dev/null +++ b/src/api/global.ts @@ -0,0 +1,284 @@ +import str from '@/utils/str' +import { http } from './http' +import { get } from './request' +import { $XXL } from '@/utils' + +export type Option = { + value: any + label: any +} +interface EnglishSubjectExpLevelVo { + currentName: string + currentLevelNum: number + currentExp: number + currentExpStart: number + currentExpEnd: number + nextName: string + nextLevelNum: number + nextExp: number + currentLevelCode: null +} + +interface VipUserInfo { + vipType: number + vipExp: number + currentLevel: string + currentLevelIntVal: number + currentLevelStartExp: number + nextLevelExp: number + nextLevelName: string + nextLevelIntVal: number + vipStartTime: string + vipEndTime: string + vipLengthTime: string +} + +interface PersonInUsePersonalities { + createTime: string + createUser: string + updateTime: string + updateUser: string + id: any + name: string + resourceUrl: string + personalInfoResourceUrl: string + homePageResourceUrl: string + introduction: string + status: number + productCode: string + currencyNum: number + showTag: number + discount: null + discountNum: null + validityTime: number + limitType: number + sort: number + remark: number + delFlag: number + defaultFlag: number + usageFlag: number + unlockId: string + useStatus: number + lockStatus: null + expireTime: null +} + +interface Medal { + medalId: any +} + +export interface UserData { + userId: string + schoolId: any + account: string + name: string + nickName: string + sex: number + schoolName: string + education: number + className: string + experience: number + currency: string + diamond: string + levelPassNum: null + personalImageNum: number + englishSubjectExpLevelVo: EnglishSubjectExpLevelVo + vipUserInfo: VipUserInfo + avatarUrl: string + avatarFrameUrl: null + personInUsePersonalities: PersonInUsePersonalities[] + nickNameChangeCardCount: number + popNotices: any[] + unCheckMedal: Medal[] + learnGradeId: string + learnTargetType: number + weakSubjectIds: string + isShowReading: number + isShowAnimation: number + classId: any + smartUserIdentifier: string + schoolPersonType: number + lockFlag: number + isTeacher: boolean + // 是否为可以接受任务的学员 + isTaskStudent: boolean + taskRewardStatus: any + schoolClass: SchoolClass[] +} + +type SchoolClass = { + schoolName: any + schoolId: any + classList: { + className: any + classId: any + }[] +} + +// 获取用户红点提示 +export type GetUserPointApi = { + messageBox: boolean + activity: boolean + announcement: boolean + config: boolean + knapsack: boolean + homeWork: boolean +} + +const globalApi = { + /** + * 获取字典 + */ + getDictionaries: () => { + return http.request({ + url: '/sysDictType/tree', + headers: { + Authorization: '', + }, + }) + }, + + /** + * 获取用户信息 + */ + getUserInfoApi: async (headers?: anyObj): Promise => { + return (await get('/personal/getHomePage', undefined, { + headers, + })) as UserData + }, + + // 获取用户红点提示 + getUserPointApi: async (): Promise => { + return await get('/personal/getRedPoint') + }, + + // 获取地区下拉列表 + getRegionSelector: () => { + return http.request({ + url: '/sysUser/regionSelector', + }) + }, + + // 获取年级下拉列表 + getClassSelector: () => { + return http.request({ + url: '/intrudeLevel/getSchoolGradeList', + }) + }, + + // 已读弹窗提醒 + closePopWin: (id: any) => + http.request({ + url: `/personal/closePopWin/${id}`, + }), + + // 获取年级列表 + getGradeList: (params?: anyObj) => + http.request({ + url: '/grade/list', + params, + }), + + // 获取学科列表 + getSubjectListById: (id: any) => + http.request({ + url: `/subject/list/${id}`, + }), + + // 生词本-标生标熟 + changeWordType: (data: anyObj) => { + return http.request({ + url: `/word/operate`, + data, + method: 'POST', + }) + }, + + // 上传文件 + uploadFile: (data: any) => + http.request({ + url: '/sysFileInfo/tenUploadAll', + method: 'post', + timeout: 15000, + headers: { + 'content-type': 'multipart/form-data', + }, + data, + }), + + // 用户视频表-id查询 + getUserVideoById: (id: any) => + http.request({ + url: `/userVideo/${id}`, + }), + + // 获取静态资源地址 + getAssetsList: () => + http.request({ + url: '/listFrontStaticFiles', + headers: { + Authorization: '', + }, + }), + + // 检查APK版本 + getVersions: async (params: anyObj) => { + const url = location.href + if ( + url.includes('localhost') || + url.includes('192.168.') || + url.includes('127.0.0.1') || + url.includes('lingxixue.com') + ) { + params = { + magic: str.getMagic(), + ...(params || {}), + } + } + return get('/apkManagement/list', params) + }, + + // 检查版本 + checkVersion: (params: anyObj) => + http.request({ + url: '/apkManagement/queryLatest', + headers: { + Authorization: '', + }, + params, + }), + + // 更新APPs + updateApps: (data: anyObj) => + http.request({ + url: '/userAppRecord/updateApp', + method: 'POST', + data, + }), + + // 获取未记录的APP + updateUnRecordApp: (data: anyObj) => + http.request({ + url: '/appLogoRecord/filterUnLoadedLogo', + method: 'POST', + data, + }), + + // 记录APP信息 + updateAppInfo: (data: anyObj) => + http.request({ + url: '/appLogoRecord/batchSave', + method: 'POST', + data, + }), + + // 更新徽章 + updateMedal: (data: anyObj) => + http.request({ + url: '/userMedal/updateCheck', + method: 'POST', + data, + }), +} + +export default globalApi diff --git a/src/api/http.ts b/src/api/http.ts new file mode 100644 index 0000000..e52d85c --- /dev/null +++ b/src/api/http.ts @@ -0,0 +1,140 @@ +/* eslint-disable */ +import axios, { AxiosInstance } from 'axios' +import qs from 'qs' +import router from '@/router' +import { getCache, delCache } from '@/utils' +import { storeToRefs } from 'pinia' +import { globalStore, userStore } from '@/stores' +import hud from '@/utils/hud' +import onlyLast from './only-last' +import sass from '@/utils/sass' + +// let controller = new AbortController() +const timeout = 90000 +const instance: AxiosInstance = axios.create({ + baseURL: '/api/main', + method: 'get', + headers: { + 'Content-Type': 'application/json', + }, + timeout, +}) + +/** + * 处理请求头 + */ +instance.interceptors.request.use( + (config: any) => { + config.baseURL = config.baseURL || '/api/main' + config.timeout = config.timeout || timeout + if (config.method === 'get') { + config.paramsSerializer = { + serialize: function (params: any) { + return qs.stringify(params, { + arrayFormat: 'repeat', + allowDots: true, + }) + }, + } + } + onlyLast.processRequest(config) + + // 租户id + config.headers['X-Tenant-Id'] = sass.platform.tenantId + + // 自定义token + if (config.headers['Authorization'] || config.headers['Authorization'] === '') { + return config + } + + if (config.baseURL === '/api/campus') { + config.headers['Authorization'] = getCache('workToken') + } else { + config.headers['Authorization'] = getCache('token') + } + return config + }, + error => Promise.reject(error), +) + +const buildError = (response: any, show = true) => { + const { + data: { message, msg }, + } = response + + let errorMsg = message || msg + let showed = false + if (errorMsg) { + if (errorMsg.includes('服务器')) { + errorMsg = '网络不稳定,请稍后再试~' + } + // if (traceId) { + // errorMsg = `${errorMsg}[${traceId}]` + // } + if (show) { + hud.error(errorMsg) + showed = true + } + } + if (errorMsg?.includes('非本平台用户')) { + // 重新登录 + + delCache('token') + delCache('workToken') + router.replace('/login') + } + return { + message: errorMsg, + showed, + } +} + +/** + * 拦截器 + */ +instance.interceptors.response.use( + response => { + const { + data: { code, message }, + } = response + if (!onlyLast.processResponse(response.config)) { + // 过滤请求 + return Promise.reject(response) + } + + // 文件流不拦截 + if (response.headers['content-type']?.indexOf('octet-stream') !== -1 || code == 200) + return response + + return Promise.reject(buildError(response)) + }, + async error => { + const { response } = error + + if (!onlyLast.processResponse(error.config)) { + // 过滤请求 + return Promise.reject(error) + } + + if (response?.status === 401 || response?.status === 403) { + const user = userStore() + const { token } = storeToRefs(user) + if (token.value) { + hud.error('登录已过期,请重新登录') + user.$reset() + } + delCache('token') + delCache('workToken') + router.replace('/login') + // 解锁 + const { system } = storeToRefs(globalStore()) + system.value.isLock = false + } + + console.log('error2', response) + + return Promise.reject(buildError(response, false)) + }, +) + +export const http = instance diff --git a/src/api/log.ts b/src/api/log.ts new file mode 100644 index 0000000..851275a --- /dev/null +++ b/src/api/log.ts @@ -0,0 +1,55 @@ +import { http } from './http' + +// 上报锁定屏幕时间 +export interface LockScreenTime { + simSerialNumber: string + lockFlag: 0 | 1 // 0-解锁 1-锁定 +} + +// 上报视频播放时间 +export interface VideoPlayTime { + resourceType: 0 | 1 | 2 | 3 // 0-自由学 1-AI精准学 2-错题本 3-举一反三 + origin: 1 | 2 // 1-章节 2-知识点 + subjectId: string + playDuration: number // 视频最后播放位置 + userId: string + videoId: string + videoName: string + endTime: number | '' + startTime: number | '' +} + +// 上报学习时长 +export interface StudyTime { + resourceType: 0 | 1 | 2 | 3 // 0-自由学 1-AI精准学 2-错题本 3-举一反三 + studyTime: number + subjectId: string + userId: string + endTime: number + startTime: number +} + +const logApi = { + reportLockScreenTime: (data: LockScreenTime) => + http.request({ + url: '/deviceTimeControl/update/timeStamp', + method: 'post', + data, + }), + + reportVideoPlayTime: (data: VideoPlayTime) => + http.request({ + url: '/userVideo', + method: 'put', + data, + }), + + reportStudyTime: (data: StudyTime) => + http.request({ + url: '/userSubjectReport', + method: 'put', + data, + }), +} + +export default logApi diff --git a/src/api/login.ts b/src/api/login.ts new file mode 100644 index 0000000..76f5da3 --- /dev/null +++ b/src/api/login.ts @@ -0,0 +1,84 @@ +import { http } from './http' +import { isWebEvn } from '@/utils' +import { post } from './request' + +interface accountLoginType { + account: string + password: string + simSerialNumber?: string + model?: string +} + +interface smsLoginType { + phone: string + verifyCode: string +} +/** + * 密码登录 + * @param account 手机号 + * @param password 密码 + * @param clientType 客户端类型 默认客服登录 + */ +const psdLogin = async (data: accountLoginType) => { + return await post('/login', { + clientType: isWebEvn ? 'PC' : 'PAD', + ...data, + }) +} + +// 退出登录 +const logout = () => { + return http.request({ + url: '/logout', + }) +} + +// 获取是否首次绑定 +const getFirstBind = (sn: string) => { + return http.request({ + url: `/sysVisLog/getBindRelationByDeviceAndAccount/${sn}`, + }) +} + +// 获取机器绑定码 +const getBindQrCode = (data: anyObj) => { + return http.request({ + url: '/sysFileInfo/generateQrCodeAndUpload', + method: 'post', + data, + }) +} + +// 获取作业TOKEN +const workLogin = (data: anyObj) => { + return http.request({ + baseURL: '/api/campus', + url: '/sc/stu/stuLogin', + headers: { + Authorization: '', + }, + method: 'POST', + data, + }) +} + +// 作业服务退出登录 +const workLogout = () => { + return http.request({ + baseURL: '/api/campus', + url: '/logout', + method: 'POST', + }) +} + +const loginApi = { + psdLogin, + logout, + getFirstBind, + getBindQrCode, + workLogin, + workLogout, +} + +export default loginApi +export type { accountLoginType, smsLoginType } diff --git a/src/api/only-last.ts b/src/api/only-last.ts new file mode 100644 index 0000000..c00fcfc --- /dev/null +++ b/src/api/only-last.ts @@ -0,0 +1,65 @@ +import type { AxiosRequestConfig } from 'axios' + +import obj from '@/utils/obj' + +// 同时有多个请求时,只有最后一个请求生效 +export const only_last_id = 'on_last_id' +const only_last_req_id = 'only_last_req_id' +const controllers = {} as Record +const reqIds = {} as Record + +export type RequestConfig = AxiosRequestConfig & { + [only_last_id]?: any + [only_last_req_id]?: any +} + +function processRequest(config: RequestConfig) { + if (!config) return + + const onlyLastId = config[only_last_id] + if (!onlyLastId) return + + // 取消上一个请求 + let ctl = controllers[onlyLastId] + if (ctl) { + ctl.abort() + // console.log('❌取消❌', onlyLastId, reqIds[onlyLastId], config.url) + } + + // 重新赋值 + ctl = new AbortController() + config.signal = ctl.signal + controllers[onlyLastId] = ctl + // 赋值一个请求的唯一id + const reqId = obj.snowflakeId() + reqIds[onlyLastId] = reqId + config[only_last_req_id] = reqId + // console.log('💪🏻开启💪🏻', onlyLastId, reqId, config.url) +} + +function processResponse(config: RequestConfig) { + if (!config) return true + const onlyLastId = config[only_last_id] + // 忽略 + if (!onlyLastId) return true + + const reqId = config[only_last_req_id] + if (reqId === reqIds[onlyLastId]) { + // console.log('✅选用✅', onlyLastId, reqId, config.url) + delete reqIds[onlyLastId] + delete controllers[onlyLastId] + // 忽略 + return true + } else { + // console.log('⭕️抛弃⭕️', onlyLastId, reqId, config.url) + // 过滤请求 + return false + } +} + +const onlyLastApi = { + processRequest, + processResponse, +} + +export default onlyLastApi diff --git a/src/api/order.ts b/src/api/order.ts new file mode 100644 index 0000000..308c6a6 --- /dev/null +++ b/src/api/order.ts @@ -0,0 +1,40 @@ +import { http } from './http' + +const orderApi = { + // 订单支付状态 + getPayStatus: (id: any) => + http.request({ + url: `/orderManagement/${id}`, + }), + + // 订单-VIP续费 + createVipRenewPrepayOrder: (data: anyObj) => + http.request({ + url: '/orderManagement/createVipRenewPrepayOrder', + method: 'post', + data, + }), + + // 订单-督学 + createInspectorPrepayOrder: (data: anyObj) => + http.request({ + url: '/orderManagement/createInspectorPrepayOrder', + method: 'post', + data, + }), + + // VIP订单记录 + getVipOrderRecord: (params: anyObj) => + http.request({ + url: '/orderManagement/vipPayRecord', + params, + }), + + // 查询是否是督学中 + getIsInspectorIng: () => + http.request({ + url: '/inspectorStudent/inspectorButtonData', + }), +} + +export default orderApi diff --git a/src/api/ranking.ts b/src/api/ranking.ts new file mode 100644 index 0000000..4a66fbf --- /dev/null +++ b/src/api/ranking.ts @@ -0,0 +1,34 @@ +import { http } from './http' +import { only_last_id } from './only-last' +import { get } from './request' + +const rankingApi = { + /** + * 获取排行榜情况 + */ + getRankList: async (params: anyObj) => { + return await get('/intrudeLevel/rankList', params, { + [only_last_id]: 'ranking_getRankList', + }) + }, + + /** + * 查看个人信息 + */ + queryTargetUserIdInfo: async (id: any): Promise => { + return await get(`/personal/queryTargetUserIdInfo/${id}`) + }, + + /** + * 操作点赞或取消点赞 + */ + operateLikeOrUnLike: (data: anyObj) => { + return http.request({ + url: `/userLikeInfo/operateLikeOrUnLike`, + data, + method: 'POST', + }) + }, +} + +export default rankingApi diff --git a/src/api/request.ts b/src/api/request.ts new file mode 100644 index 0000000..507de8c --- /dev/null +++ b/src/api/request.ts @@ -0,0 +1,90 @@ +import { http } from './http' +import type { RequestConfig } from './only-last' + +export type PageResponse = { + current: number + size: number + totalPage: number + totalRows: number + rows: T[] +} + +// 发送get请求 +export async function get( + uri: string, + params?: Record, + config?: RequestConfig, +): Promise { + if (params) { + config = config ? { ...config, params } : { params } + } + return (await http.get(uri, config)).data['data'] as T +} + +// 发送delete请求 +export async function remove( + uri: string, + params?: Record, + config?: RequestConfig, +): Promise { + if (params) { + config = config ? { ...config, params } : { params } + } + return (await http.delete(uri, config)).data['data'] as T +} + +// 处理请求data(可能有文件) +const processFormData = (data: any): any => { + if (!data) return data + const vs = Object.values(data) + let hasFile = false + for (const v of vs) { + if (v instanceof File) { + hasFile = true + break + } + } + if (!hasFile) return data + + // 如果有文件 + const form = new FormData() + const ks = Object.keys(data) + for (const k_ of ks) { + const k = k_ as string + const v = data[k] + if (v) { + form.append(k, v) + } + } + return form +} + +// 发送post请求(JSON格式) +export async function post(url: string, data?: any, config?: RequestConfig): Promise { + return (await http.post(url, data, config)).data['data'] as T +} + +// 发送put请求(JSON格式) +export async function put(url: string, data?: any, config?: RequestConfig): Promise { + return (await http.put(url, data, config)).data['data'] as T +} + +// 发送post请求(表单格式) +export async function postForm(url: string, data?: any, config?: RequestConfig): Promise { + data = processFormData(data) + if (data) { + let type = 'application/x-www-form-urlencoded' + if (data instanceof FormData) { + // 文件上传 + type = 'multipart/form-data' + } + const headers = { 'Content-Type': type } + config = config + ? { + ...config, + headers, + } + : { headers } + } + return (await http.post(url, data, config)).data['data'] as T +} diff --git a/src/api/service/basic.ts b/src/api/service/basic.ts new file mode 100644 index 0000000..7915f7d --- /dev/null +++ b/src/api/service/basic.ts @@ -0,0 +1,30 @@ +/* eslint-disable @typescript-eslint/member-ordering */ +import { get, post } from '../request' +import type { PageResponse } from '../request' + +export abstract class BasicService { + protected abstract findPageUrl(): string + protected abstract saveOrUpdateUrl(): string + protected abstract removeUrl(): string + // 增/改(自动根据id判断) + async saveOrUpdate(entity: T) { + return await post(this.saveOrUpdateUrl(), entity) + } + + // id、id[] + async remove(ids: any): Promise { + if (!Array.isArray(ids)) { + ids = [ids] + } + return await post(this.removeUrl(), ids) + } + + // 分页查询 + async findPage(current: number, size: number, condition: any): Promise> { + return await get>(this.findPageUrl(), { + size, + current, + ...(condition || {}), + }) + } +} diff --git a/src/api/service/coin-transaction.ts b/src/api/service/coin-transaction.ts new file mode 100644 index 0000000..fb18b40 --- /dev/null +++ b/src/api/service/coin-transaction.ts @@ -0,0 +1,17 @@ +import { BasicService } from './basic' + +class CoinTransactionService extends BasicService { + protected saveOrUpdateUrl(): string { + return '/org/school/recharge' + } + + protected removeUrl(): string { + throw new Error('Method not implemented.') + } + + protected findPageUrl(): string { + return '/org/school/transaction/list' + } +} + +export const coinTransactionService = new CoinTransactionService() diff --git a/src/api/service/self-coin-detail.ts b/src/api/service/self-coin-detail.ts new file mode 100644 index 0000000..944bf85 --- /dev/null +++ b/src/api/service/self-coin-detail.ts @@ -0,0 +1,17 @@ +import { BasicService } from './basic' + +class SelfCoinDetailService extends BasicService { + protected saveOrUpdateUrl(): string { + throw new Error('Method not implemented.') + } + + protected removeUrl(): string { + throw new Error('Method not implemented.') + } + + protected findPageUrl(): string { + return '/reward/coin/list' + } +} + +export const selfCoinDetailService = new SelfCoinDetailService() diff --git a/src/api/service/task.ts b/src/api/service/task.ts new file mode 100644 index 0000000..7e2ccf3 --- /dev/null +++ b/src/api/service/task.ts @@ -0,0 +1,172 @@ +/* eslint-disable @typescript-eslint/member-ordering */ +import { get, post } from '../request' +import { getSubjectById } from '../subject/config' +import { BasicService } from './basic' + +// 任务配置 +type TaskConfig = { + id?: any + taskId?: any +} + +export type TaskWordTableConfig = { + bookId: any // 教材 + stageId: any // 阶段 + amount: any // 复习数量 +} & TaskConfig + +export type TaskWordQuestConfig = { + level: any // 入门、进阶 + amount: any // 满星关卡数 +} & TaskConfig + +export type TaskSentenceConfig = { + level: any // 第几阶 + amount: any // 句子数量 +} & TaskConfig + +export type TaskFreeLearnConfig = { + bookId: any // 教材id + chapterIds: any // 章节id + amount: any // 通关次数 +} & TaskConfig + +type Config = { + gradeId: any + subjectId: any + chapters: any + + stageId: any // 阶段 + stageName: string + versionId: any // 版本 + versionName: string + bookName: string + bookId: any // 教材 + + levelName: string +} + +export type Task = { + id: any + schoolId: string + objTypeCode: string + personCount: number + completedPersonCount: number + objTypeList: { + id: any + taskId: string + objectId: string + }[] + startTime: string + endTime: string + delFlag: number + priority: number + createTime: string + createUserId: string + createUserName: string + taskExtraRewardList: { + id: any + taskId: string + amount: number + startRank: number + endRank: number + }[] + taskFreeLearnConfig: TaskFreeLearnConfig // null 使用 any 类型 + taskWordMasteryConfig: TaskWordTableConfig // null 使用 any 类型 + taskWordQuestConfig: TaskWordQuestConfig // null 使用 any 类型 + taskSentenceConfig: TaskSentenceConfig // null 使用 any 类型 + taskWordReviewConfig: TaskWordTableConfig + topicTypeCode: string + status: number + target: string + reward: number + punish: number + remark: string + config: any +} + +class TaskService extends BasicService { + protected saveOrUpdateUrl(): string { + return '/supervisor/task' + } + + protected removeUrl(): string { + throw new Error('Method not implemented.') + } + + protected findPageUrl(): string { + return '/supervisor/task/list' + } + + /** + * 获取自己正在执行的任务 + */ + async getProcessingTasks(config?: any): Promise { + return await get('/supervisor/usertask/process/list', undefined, config) + } + + async claimReward(data: any): Promise { + return await post('/supervisor/usertask/receive/reward', data) + } + + /** + * + * @param 一键领取 + * @returns + */ + async batchClaimReward(): Promise { + return await post('/supervisor/usertask/receive/rewards/all') + } + + /** + * 取消 + */ + async cancel(taskId: any) { + await post(`/supervisor/task/cancel/${taskId}`) + } + + /** 获得任务详情 */ + async getDetail(taskId: any): Promise { + return await get(`/supervisor/task/get/${taskId}`) + } + + // 获得额外奖励 + getExtraRewardList(task: Task) { + const list = task.taskExtraRewardList + if (!list?.length) return undefined + list.sort((a: any, b: any) => { + const res = a.startRank - b.startRank + return res ? res : a.endRank - b.endRank + }) + return list + } + + // 获得书本的名称 + getBookName(task: Task) { + let cfg = task.config as Config + if (typeof cfg === 'string') { + try { + cfg = JSON.stringify(cfg) as any + } catch { + return + } + } + if (!cfg) return + if (cfg.bookName) { + if (cfg.subjectId) { + // 有学科 + return `[${getSubjectById(cfg.subjectId).name}]${cfg.bookName}` + } else if (cfg.stageName) { + // 有阶段 + return cfg.stageName + '-' + cfg.versionName + '-' + cfg.bookName + } else { + return cfg.bookName + } + } else if (cfg.stageName) { + // 只有阶段 + return cfg.stageName + } + } +} + +export const taskService = new TaskService() diff --git a/src/api/service/user-task.ts b/src/api/service/user-task.ts new file mode 100644 index 0000000..f94f782 --- /dev/null +++ b/src/api/service/user-task.ts @@ -0,0 +1,17 @@ +import { BasicService } from './basic' + +class UserTaskService extends BasicService { + protected saveOrUpdateUrl(): string { + throw new Error('Method not implemented.') + } + + protected removeUrl(): string { + throw new Error('Method not implemented.') + } + + protected findPageUrl(): string { + return '/supervisor/usertask/list' + } +} + +export const userTaskService = new UserTaskService() diff --git a/src/api/service/word-table.ts b/src/api/service/word-table.ts new file mode 100644 index 0000000..0063c8f --- /dev/null +++ b/src/api/service/word-table.ts @@ -0,0 +1,48 @@ +import { only_last_id } from '../only-last' +import { get, type PageResponse } from '../request' +import { BasicService } from './basic' + +type FindParams = { + current: any + size: any + grasp: any + userId: any + startTime: any + endTime: any +} + +class WordTableService extends BasicService { + async findStage( + data: FindParams & { + vocabularyId: any + }, + ) { + return await get>('/wordTable/wordTableStage', data, { + [only_last_id]: 'word-table-list', + }) + } + + async findBook( + data: FindParams & { + textbookId: any + }, + ) { + return await get>('/wordTable/wordTableTextbook', data, { + [only_last_id]: 'word-table-list', + }) + } + + protected saveOrUpdateUrl(): string { + throw new Error('Method not implemented.') + } + + protected removeUrl(): string { + throw new Error('Method not implemented.') + } + + protected findPageUrl(): string { + throw new Error('Method not implemented.') + } +} + +export const wordTableService = new WordTableService() diff --git a/src/api/service/word-test.ts b/src/api/service/word-test.ts new file mode 100644 index 0000000..acc6553 --- /dev/null +++ b/src/api/service/word-test.ts @@ -0,0 +1,126 @@ +/* eslint-disable @typescript-eslint/member-ordering */ +import str from '@/utils/str' +import { get, post, type PageResponse } from '../request' +import wordTestApi from '../subject/wordTest' +import { BasicService } from './basic' + +function getGraspText(val: any, total: any) { + if (val === 0) return '0' + return `${val}(${Math.round((val / total) * 100)}%)` +} + +class WordTestService extends BasicService { + private parseJsonItem(item: any) { + if (typeof item.extra === 'string') { + item.extra = JSON.parse(item.extra) + } + if (typeof item.bonus === 'string') { + item.bonus = JSON.parse(item.bonus) + } + if (typeof item.graspInfo === 'string') { + const info = JSON.parse(item.graspInfo) + info.strangeText = getGraspText(info.predictStrangeWordNum, info.totalNum) + info.knowText = getGraspText(info.predictKnowWordNum, info.totalNum) + info.knowWellText = getGraspText(info.predictKnowWellWordNum, info.totalNum) + info.graspText = getGraspText(info.predictGraspWordNum, info.totalNum) + item.graspInfo = info + + if (typeof item.lastExamWordGraspInfo === 'string') { + const lastInfo = JSON.parse(item.lastExamWordGraspInfo) + item.lastExamWordGraspInfo = lastInfo + info.strangeChange = info.predictStrangeWordNum - lastInfo.predictStrangeWordNum + if (info.strangeChange > 0) { + info.strangeChange = `+${info.strangeChange}` + } + info.knowChange = info.predictKnowWordNum - lastInfo.predictKnowWordNum + if (info.knowChange > 0) { + info.knowChange = `+${info.knowChange}` + } + info.knowWellChange = info.predictKnowWellWordNum - lastInfo.predictKnowWellWordNum + if (info.knowWellChange > 0) { + info.knowWellChange = `+${info.knowWellChange}` + } + info.graspChange = info.predictGraspWordNum - lastInfo.predictGraspWordNum + if (info.graspChange > 0) { + info.graspChange = `+${info.graspChange}` + } + } + } + + // 展示的名字 + item.displayName = item.nickName || item.name + // 打码 + item.redactionDisplayName = str.redaction(item.displayName) + // 学习的范围 + const stageName = item.extra?.stageName + if (stageName) { + item.studyRange = stageName + } else { + const book = item.extra?.book + if (book) { + item.studyRange = `${book.versionName}-${book.bookName}` + } + } + } + + async getWords(data: any) { + return await wordTestApi.getWordTestWordsV2(data) + } + + async getRecordDetail(sessionId: any) { + const data = await get('/wordExamRecord/getTotalInfoWordsBySessionId', { sessionId }) + this.parseJsonItem(data) + return data + } + + // 分页查询 + async findPage(current: number, size: number, condition: any): Promise> { + const data = (await super.findPage(current, size, condition)) as PageResponse + for (const item of data.rows as any) { + this.parseJsonItem(item) + } + return data + } + + async saveWordRecord(data: any) { + return await post('/wordExamRecord/saveRecord', data) + } + + async saveTotalRecords(data: any) { + const res = await post('/wordExamRecord/saveTotalRecord', data) + this.parseJsonItem(res) + return res + } + + /** + * 获取最近的记录 + */ + async getLatestRecords() { + const res = await get('/wordExamTotalRecord/getRecentRecords') + for (const item of res) { + this.parseJsonItem(item) + } + return res + } + + /** + * 获得乐贝消耗 + */ + async getConsumeCoin(data: any) { + return await get('/wordExamRecord/getUserConsume', data) + } + + protected saveOrUpdateUrl(): string { + throw new Error('Method not implemented.') + } + + protected removeUrl(): string { + throw new Error('Method not implemented.') + } + + protected findPageUrl(): string { + return '/wordExamTotalRecord/list' + } +} + +export const wordTestService = new WordTestService() diff --git a/src/api/studentManage.ts b/src/api/studentManage.ts new file mode 100644 index 0000000..e868c14 --- /dev/null +++ b/src/api/studentManage.ts @@ -0,0 +1,330 @@ +import dayjs from 'dayjs' +import { get, post, remove } from './request' +import type { PageResponse } from './request' +import type { TextBook } from './subject/subject' +import obj from '@/utils/obj' +import type { RequestConfig } from './only-last' + +interface Personality { + name: string + resourceUrl: string + personalInfoResourceUrl: string + productCode: string + remark: number +} + +export type Group = { + id: any + name: any + label: any + students: Student[] +} + +export interface Student { + id: any + account: string + nickName: string + name: string + sex: number + avatarUrl: string + lastLoginTime: string + className: string + classId: string + groupName: string + groupId: string + cumulativeTimeDuration: number + currentName: string + currentLevelNum: number + currentExp: number + currentExpStart: number + currentExpEnd: number + nextName: string + nextLevelNum: number + nextExp: number + personInUsePersonalities: Personality[] + englishSubjectExpLevelVo: any // null in JSON + learnGradeId: string + currency: string + diamond: string + status: number +} + +export type Class = { + classId: any + className: any +} + +export type School = { + schoolId: any + schoolName: any + schoolCurrency: any + classList: Class[] +} + +export type ClassStudent = { + students: { + list: Student[] + map: Record + } + groups: { + list: Group[] + map: Record + } +} + +const studentManageApi = { + // 获取学生列表 + getClassStudent: async (classId: any, config?: RequestConfig): Promise => { + const data = ( + (await get( + '/schoolUser/list', + { + classId, + size: -1, + }, + config, + )) as any + )?.rows + if (!data?.length) return undefined as any + const classStudent = { students: {}, groups: {} } as ClassStudent + // 学员 + classStudent.students.list = data + classStudent.students.map = obj.list2map(data, 'id') + // 分组 + const groupMap = {} as Record + classStudent.groups.map = groupMap + const groupList = [] as Group[] + classStudent.groups.list = groupList + const defaultGroup = { + id: 0, + name: '未分组', + students: [] as Student[], + } as Group + for (const student of data) { + if (student.groupId) { + // 有分组 + let group = groupMap[student.groupId] + if (!group) { + group = { + id: student.groupId, + name: student.groupName, + label: student.groupName, + students: [], + } + groupMap[student.groupId] = group + groupList.push(group) + } + group.students.push(student) + } else { + // 无分组 + defaultGroup.students.push(student) + } + } + // 按照组名排序分组 + groupList.sort((a, b) => a.name.localeCompare(b.name)) + return classStudent + }, + + // 获取学校列表 + getSchoolList: async (): Promise => { + return await get('/schoolUser/schoolClassList') + }, + + // 获取班级列表 + getClassListBySchoolId: async (id: any): Promise => { + return await get(`/schoolUser/classListBySchoolId/${id}`) + }, + + // 获取班级汇总数据 + getClassTotalLearnData: async (params: anyObj, config?: RequestConfig) => { + return await get('/sysUser/queryClassTotalLearnData', params, config) + }, + + // 获取班级每日数据 + getClassTodayLearnData: async (params: anyObj, config?: RequestConfig) => { + return await get('/sysUser/queryClassTodayLearnData', params, config) + }, + + // 获取综合排名 + getClassRankingData: async (params: anyObj, config?: RequestConfig) => { + return await get('/sysUser/queryClassRankingData', params, config) + }, + + // 获取学科数据 + getSubjectStudyData: async (params: anyObj, config?: RequestConfig) => { + const data = (await get('/sysUser/queryClassSubjectLearnData', params, config)) as any + // learnTime转为整数 + data?.forEach((item: anyObj) => { + item.learnTime = Number(item.learnTime) + }) + return data + }, + + // 重置密码 + resetPassword: async (ids: any) => { + if (!Array.isArray(ids)) { + ids = [ids] + } + return await post('/sysUser/resetPwdFront', { ids }) + }, + + // 教师查询教材列表 + getClassBookList: async (data: GetBookListApi, config?: RequestConfig): Promise => { + return await get('/teacherTextBook/list', data, config) + }, + + // 教师删除教材 + removeClassBook: async (id: any) => { + return await remove(`/teacherTextBook/${id}`) + }, + + // 教师添加教材 + addClassBook: async (data: AddBookApi) => { + return await post('/teacherTextBook', data) + }, + + // 增加乐贝 + addCoin: async (data: CoinDiamondApi) => { + processCoinDiamondApi(data, true) + return await post('/reward/coin/reward', data) + }, + + // 减少乐贝 + subCoin: async (data: CoinDiamondApi) => { + processCoinDiamondApi(data, false) + return await post('/reward/coin/reduce', data) + }, + + // 批量操作乐贝 + coinBatch: async (data: CoinDiamondBatchApi) => { + data = processedCoinDiamondBatchApi(data) + return await post('/reward/coin/rewardBatch', data) + }, + + // 增加钻石 + addDiamond: async (data: CoinDiamondApi) => { + processCoinDiamondApi(data, true) + return await post('/reward/diamond/reward', data) + }, + + // 减少钻石 + subDiamond: async (data: CoinDiamondApi) => { + processCoinDiamondApi(data, false) + return await post('/reward/diamond/reduce', data) + }, + + // 批量操作钻石 + diamondBatch: async (data: CoinDiamondBatchApi) => { + data = processedCoinDiamondBatchApi(data) + return await post('/reward/diamond/rewardBatch', data) + }, + + // 修改学员状态 + changeStatus: async (data: ChangeStatusApi) => { + return await post('/sysUser/changeStatusFront', data) + }, + + changeStatusBatch: async (data: ChangeStatusBatchApi) => { + return await post('/sysUser/changeStatusFrontBatch', data) + }, + + // 获取乐币流水 + getCoinTransaction: async ( + data: GetCoinTransactionApi, + ): Promise> => { + return await get('/org/school/transaction/list', data) + }, +} + +function processCoinDiamondApi(data: CoinDiamondApi, add: boolean) { + const amount = Number(data.amount) + if (isNaN(amount) || amount <= 0) { + throw '请输入正确的数量' + } + if (!data.bizDate) { + data.bizDate = dayjs().format('YYYY-MM-DD HH:mm:ss') + } + if (!data.reason) { + data.reason = add ? '手动奖励' : '手动扣除' + } +} + +function processedCoinDiamondBatchApi(data: CoinDiamondBatchApi) { + const arr = [] as CoinDiamondBatchApi + for (const item of data) { + try { + processCoinDiamondApi(item, item.operation === operation_add) + arr.push(item) + } catch (e) {} + } + if (arr.length === 0) { + throw '没有需要操作的数据' + } + return arr +} + +type GetBookListApi = { + classId: any + subjectId: any +} + +type AddBookApi = { + classId: any + textBookId: any +} + +export const type_coin = 1 +export const type_diamond = 2 +export type CoinDiamondApi = { + reason?: string + amount: any + userId: any + bizDate?: string + remark?: string + typeId?: any +} + +export const operation_add = 1 +export const operation_sub = 2 +export type CoinDiamondBatchApi = (CoinDiamondApi & { + operation: any +})[] + +type ChangeStatusApi = { + id?: any + classId?: any + status: any +} + +type ChangeStatusBatchApi = { + id: any + status: any +}[] + +// 获取乐币流水 +type GetCoinTransactionApi = { + schoolId: any + typeCode: any + keyword?: any + current: any + size: any +} + +export type CoinTransaction = { + id: any + schoolId: any + schoolName: string + operation: any + typeCode: any + amount: any + userId: any + transactionId: string + bizDate: string + remark: string + record: any +} + +export const status_enabled = 0 +export const status_disabled = 1 + +export default studentManageApi diff --git a/src/api/studyAnalysis.ts b/src/api/studyAnalysis.ts new file mode 100644 index 0000000..407b017 --- /dev/null +++ b/src/api/studyAnalysis.ts @@ -0,0 +1,80 @@ +import { http } from './http' +import { get } from './request' + +const studyAnalysisApi = { + /** + * 获取统计数据-学习时长统计 + */ + getReportDuration: (params: anyObj) => { + return http.request({ + url: `/userSubjectReport/study/duration`, + params, + }) + }, + + /** + * 获取统计数据-错题本统计 + */ + getReportError: (params: anyObj) => { + return http.request({ + url: `/userSubjectReport/study/error`, + params, + }) + }, + + /** + * 获取统计数据-知识图谱统计 + */ + getReportKnowledge: (params: anyObj) => { + return http.request({ + url: `/userSubjectReport/study/knowledge`, + params, + }) + }, + + /** + * 获取统计数据-视频学习统计 + */ + getReportvideo: (params: anyObj) => { + return http.request({ + url: `/userSubjectReport/study/video`, + params, + }) + }, + + /** + * 获取统计数据-英语语感练习 + */ + getStatListByTimeFlag: (data: anyObj) => { + return http.request({ + url: `/userSentenceLearn/queryStatListByTimeFlag`, + data, + method: 'post', + }) + }, + + /** + * 获取统计数据-单词学习统计 + */ + getWordReportData: (params: anyObj) => { + return http.request({ + url: `/userSubjectReport/eng/word`, + params, + }) + }, + + // 获取学员信息 + getUserInfoById: async (stuId: any): Promise => { + return await get(`/schoolUser/getInfo`, { stuId }) + }, + + // 练习统计 + getTrainRecord: (params: anyObj) => { + return http.request({ + url: `/userSubjectReport/study/trainRecord`, + params, + }) + }, +} + +export default studyAnalysisApi diff --git a/src/api/subject/config.ts b/src/api/subject/config.ts new file mode 100644 index 0000000..bf5f402 --- /dev/null +++ b/src/api/subject/config.ts @@ -0,0 +1,879 @@ +/* eslint-disable @typescript-eslint/prefer-for-of */ +import type { BookVersion, Clean, TextBook } from './subject' + +const _getBookColor = (bookName: string) => { + let index = bookVersionNames.length - 1 + let stop = false + // 看一下bookName包含bookVersionNames的哪一个 + for (let i = 0; i < bookVersionNames.length; i++) { + for (let j = 0; j < bookVersionNames[i].length; j++) { + if (bookName.indexOf(bookVersionNames[i][j]) !== -1) { + index = i + stop = true + break + } + } + if (stop) { + break + } + } + return bookColors[index] +} + +const TAGS = ['五四', '六三', '课改'] +const replaced_tags: any = { + 五四制: '五四', + 六三制: '六三', + '-广州用': '(广州)', + '(北京课改版)': '(课改版)', + '-开心学英语': '(开心学英语)', + 一起: '(一年级起点)', + 三起: '(三年级起点)', + 新启航: '(新启航)', + 新视角: '(新视角)', + 新交际: '(新交际)', +} +// 处理名字,分割成标签、非标签 +const _processName = (name: string) => { + // 先统一括号为英文括号 + name = name.replace(/(/g, '(').replace(/)/g, ')') + + // 替换 + for (const key in replaced_tags) { + name = name.replace(key, replaced_tags[key]) + } + + // 区分 + const data: { + tags: string[] + name: string + } = { + tags: [], + name, + } + + // 如果名字里面带有括号 + const bracket: any = Array.from(name.matchAll(/\(([^\)]*?)\)/g), match => match[1]) + if (bracket) { + data.tags = bracket + for (const b of bracket) { + name = name.replace(`(${b})`, '') + } + data.name = name + } + + // 先处理标签 + for (const tag of TAGS) { + const idx = name.indexOf(tag) + if (idx === -1) continue + data.tags.push(tag) + data.name = name.slice(0, idx) + name.slice(idx + tag.length) + break + } + + // 有些标签包含了/ + if (data.tags) { + let newTags: any = [] + for (const tag of data.tags) { + newTags = [...newTags, ...tag.split('/')] + } + newTags.sort() + data.tags = newTags + } + + // // 去掉括号 + // if (data.tag.startsWith('(')) { + // data.tag = data.tag.slice(1, -1) + // } + return data +} + +const _processObj = (obj: any) => { + const sourceName = obj?.clean?.name || '' + const name = _processName(sourceName) + obj.clean.tags = name.tags || [] + obj.clean.name = name.name || sourceName +} + +const _longest = (...args: string[]) => { + let size = 0 + let longest = '' + for (const arg of args) { + if (!arg) continue + if (arg.length > size) { + size = arg.length + longest = arg + } + } + return longest +} + +// 清洗一下版本数据 +export const cleanVersions = (versions: BookVersion[]) => { + for (const version of versions) { + version.clean = {} as Clean + // 设置名字 + version.clean.name = version.shortName || version.name + // 处理对象 + _processObj(version) + // 处理书本 + for (const book of version.textBookVoList) { + book.clean = {} as Clean + // 设置名字 + if (version.clean.tags?.length) { + book.clean.name = book.displayName || book.shortName || book.name + } else { + book.clean.name = _longest(book.name, book.displayName, book.shortName) + } + // 处理对象 + _processObj(book) + // 全名 + book.clean.fullName = _getBookName(book, version) + // 覆盖颜色 + book.clean.color = _getBookColor(book.clean.fullName!) + version.clean.color = book.clean.color + // 去除不必要的tag + if (book.clean.tags?.length) { + book.clean.tags = book.clean.tags.filter((tag: string) => { + // 如果跟版本名字相同,直接去掉 + return tag !== version.clean.name + }) + } + + // 合并tag + book.clean.all_tags = [ + ...new Set([...(book.clean?.tags || []), ...(version.clean?.tags || [])]), + ] + } + } +} + +// 清洗一下教材数据 +export const cleanBooks = (books: TextBook[]) => { + for (const book of books) { + book.clean = {} as Clean + book.version = { + clean: {} as Clean, + } as BookVersion + // 设置名字 + book.clean.name = book.textBookName + book.version.clean.name = book.bookVersionName || book.versionName + + // 处理对象 + _processObj(book) + _processObj(book.version) + + // 全名 + book.clean.fullName = _getBookName(book, book.version) + book.clean.color = _getBookColor(book.clean.fullName!) + book.version.clean.color = book.clean.color + // 去除不必要的tag + if (book.clean.tags?.length) { + book.clean.tags = book.clean.tags.filter((tag: string) => { + // 如果跟版本名字相同,直接去掉 + return tag !== book.version.clean.name + }) + } + // 合并tag + book.clean.all_tags = [ + ...new Set([...(book.clean.tags || []), ...(book.version.clean.tags || [])]), + ] + } +} + +const _escapeRegExp = (text: string) => { + return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') +} + +const _trimRegex = (source: string, regex: string) => { + const safeRegex = _escapeRegExp(regex || '') + const reg = new RegExp(`\\s*${safeRegex}\\s*`, 'g') + return source.replace(reg, '') +} + +// 需要去掉的名字 +const trim_names = ['人教版数学', '沪教版', '小学', '英语', '少儿'] + +// 获取书本名字 +const _getBookName = (book: any, version: any) => { + // 第1步:去掉书本名字中的教材版本名字 + for (const name of trim_names) { + book.clean.name = _trimRegex(book.clean.name, name) + } + book.clean.name = _trimRegex(book.clean.name, version.clean.name) + + // 第2步 + let name = version.clean.name + const tags = version.clean.tags || [] + const step = '·' + if (tags.length) { + name += step + tags.join(step) + } + name += '·' + book.clean.name + return name +} + +const bookVersionNames = [ + ['人', '编'], + ['辽', '陕', '鲁', '青'], + ['北', '冀', '清', '河'], + ['苏', '浙', '沪', '杭', '上海'], + ['鄂', '湘', '闽', '湖', '福'], + ['重', '渝', '川'], + ['粤', '桂', '琼', '广'], + ['五四', '六三'], + ['大象', '接力', '仁', '译'], + ['外', 'W', '牛津', '剑桥', '朗文'], + ['新', '起点'], + ['大学', '科', '师'], +] + +const bookColors = [ + { + // 深绿 + color: '#21CC18', + bgColor: '#93F28D', + }, + { + // 卡其 + color: '#C7B767', + bgColor: '#DBD5B8', + }, + { + // 深蓝 + color: '#04A6FF', + bgColor: '#20CDFF', + }, + { + // 浅紫 + color: '#967ACC', + bgColor: '#C4B8DB', + }, + { + // 米黄色 + color: '#FF7438', + bgColor: '#FFC49F', + }, + { + // 红褐色 + color: '#FF6363', + bgColor: '#FF9F9F', + }, + { + // 蓝紫色 + color: '#5B5DFF', + bgColor: '#989AFF', + }, + { + // 深紫色 + color: '#AB5CFF', + bgColor: '#D199FF', + }, + { + // 蓝色 + color: '#5C89FF', + bgColor: '#99BBFF', + }, + { + // 黄色 + color: '#E5B000', + bgColor: '#FCEB5B', + }, + { + // 粉灰色 + color: '#CC7A8D', + bgColor: '#DBC1C7', + }, + { + // 粉紫 + color: '#FC5EC9', + bgColor: '#FF99E1', + }, + { + // 紫色 + color: '#FF5CFF', + bgColor: '#FF99FF', + }, + { + // 浅绿 + color: '#6BD600', + bgColor: '#CCF37C', + }, + { + // 天蓝 + color: '#00C7D6', + bgColor: '#45ECF5', + }, +] + +// 年级 +const grade_1 = 1 +const grade_2 = 2 +const grade_3 = 3 +const grade_4 = 4 +const grade_5 = 5 +const grade_6 = 6 +const grade_7 = 7 +const grade_8 = 8 +const grade_9 = 9 +const grade_high_1 = 10 +const grade_high_2 = 11 +const grade_high_3 = 12 +const xiaoxue = [grade_1, grade_2, grade_3, grade_4, grade_5, grade_6] +const chuzhong = [grade_7, grade_8, grade_9] +const gaozhong = [grade_high_1, grade_high_2, grade_high_3] +const grade_map: any = { + [grade_1]: '一年级', + [grade_2]: '二年级', + [grade_3]: '三年级', + [grade_4]: '四年级', + [grade_5]: '五年级', + [grade_6]: '六年级', + [grade_7]: '七年级', + [grade_8]: '八年级', + [grade_9]: '九年级', + [grade_high_1]: '高一', + [grade_high_2]: '高二', + [grade_high_3]: '高三', +} + +const base_grade_1 = 1 +const base_grade_2 = 2 +const base_grade_3 = 3 +const base_grade_4 = 4 +const base_grade_5 = 5 +const base_grade_6 = 6 +const base_grade_7 = 7 +const base_grade_8 = 8 +const base_grade_9 = 9 +const base_grade_high_1 = 10 +const base_grade_high_2 = 11 +const base_grade_high_3 = 12 +const base_grade_map: any = { + [base_grade_1]: grade_1, + [base_grade_2]: grade_2, + [base_grade_3]: grade_3, + [base_grade_4]: grade_4, + [base_grade_5]: grade_5, + [base_grade_6]: grade_6, + [base_grade_7]: grade_7, + [base_grade_8]: grade_8, + [base_grade_9]: grade_9, + [base_grade_high_1]: grade_high_1, + [base_grade_high_2]: grade_high_2, + [base_grade_high_3]: grade_high_3, +} + +export const grades = [ + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '1', + baseId: '1', + name: '一年级', + sort: 0, + delFlag: 0, + }, + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '2', + baseId: '2', + name: '二年级', + sort: 1, + delFlag: 0, + }, + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '3', + baseId: '3', + name: '三年级', + sort: 2, + delFlag: 0, + }, + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '4', + baseId: '4', + name: '四年级', + sort: 3, + delFlag: 0, + }, + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '5', + baseId: '5', + name: '五年级', + sort: 4, + delFlag: 0, + }, + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '6', + baseId: '6', + name: '六年级', + sort: 5, + delFlag: 0, + }, + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '7', + baseId: '7', + name: '七年级', + sort: 7, + delFlag: 0, + }, + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '8', + baseId: '8', + name: '八年级', + sort: 8, + delFlag: 0, + }, + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '9', + baseId: '9', + name: '九年级', + sort: 9, + delFlag: 0, + }, + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '10', + baseId: '10', + name: '高一', + sort: 10, + delFlag: 0, + }, + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '11', + baseId: '11', + name: '高二', + sort: 11, + delFlag: 0, + }, + { + createTime: '2024-08-28 14:57:45', + createUser: '-1', + updateTime: '2024-08-28 14:57:45', + updateUser: '-1', + id: '12', + baseId: '12', + name: '高三', + sort: 12, + delFlag: 0, + }, +] + +// 阶段 +export const stage_xiaoxue = 1 +export const stage_chuzhong = 2 +export const stage_gaozhong = 3 +export const stage_options = [ + { + label: '小学', + value: stage_xiaoxue, + }, + { + label: '初中', + value: stage_chuzhong, + }, + { + label: '高中', + value: stage_gaozhong, + }, +] + +// 类型 +export type SubjectItem = { + subjectId: any + name: string + subject: string + pictureUrl: string + sort: any +} + +// 学科 +const chinese_subject_id = 1 +const math_subject_id = 2 +const english_subject_id = 3 +export const subject_english = { + subjectId: english_subject_id, + name: '英语', + subject: '英语', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_yingyu.png', + sort: null, +} as SubjectItem +export const subject_chinese = { + subjectId: chinese_subject_id, + name: '语文', + subject: '语文', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_yuwen.png', + sort: null, +} as SubjectItem +export const subject_math = { + subjectId: math_subject_id, + name: '数学', + subject: '数学', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_shuxue.png', + sort: null, +} as SubjectItem +const subject_physics = { + subjectId: 4, + name: '物理', + subject: '物理', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_wuli.png', + sort: null, +} as SubjectItem +const subject_chemistry = { + subjectId: 5, + name: '化学', + subject: '化学', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_huaxue.png', + sort: null, +} as SubjectItem +const subject_bio = { + subjectId: 6, + name: '生物学', + subject: '生物学', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_shengwu.png', + sort: null, +} as SubjectItem +const subject_law = { + subjectId: 7, + name: '政治(道法)', + subject: '政治(道法)', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_fazhi.png', + sort: null, +} as SubjectItem +const subject_history = { + subjectId: 8, + name: '历史', + subject: '历史', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_lishi.png', + sort: null, +} as SubjectItem +const subject_geo = { + subjectId: 9, + name: '地理', + subject: '地理', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_dili.png', + sort: null, +} as SubjectItem +const subject_science = { + subjectId: 10, + name: '科学', + subject: '科学', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_kexue.png', + sort: null, +} as SubjectItem +const subject_history_society = { + subjectId: 11, + name: '历史与社会', + subject: '历史与社会', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_lishiyushehui.png', + sort: null, +} as SubjectItem +const subject_it = { + subjectId: 12, + name: '信息技术', + subject: '信息技术', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_xinxi.png', + sort: null, +} as SubjectItem +const subject_music = { + subjectId: 13, + name: '音乐', + subject: '音乐', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_yinyue.png', + sort: null, +} as SubjectItem +const subject_art = { + subjectId: 14, + name: '美术', + subject: '美术', + pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_meishu.png', + sort: null, +} as SubjectItem +const xiaoxue_subjects = [ + subject_english, + subject_chinese, + subject_math, + subject_science, + subject_law, +] +const chuzhong_subjects = [ + subject_english, + subject_chinese, + subject_math, + subject_physics, + subject_chemistry, + subject_history, + subject_geo, + subject_bio, + subject_science, + subject_law, +] +const gaozhong_subjects = [ + subject_english, + subject_chinese, + subject_math, + subject_physics, + subject_chemistry, + subject_history, + subject_geo, + subject_bio, + subject_law, + subject_it, + // { + // subjectId: 14, + // name: '通用', + // subject: '通用', + // pictureUrl: 'https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/subject_tongyong.png', + // sort: null, + // }, +] +export const subjects = [ + { + id: chinese_subject_id, + name: '语文', + subject: '语文', + pictureUrl: null, + tableMark: '1', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: math_subject_id, + name: '数学', + subject: '数学', + pictureUrl: null, + tableMark: '2', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: english_subject_id, + name: '英语', + subject: '英语', + pictureUrl: null, + tableMark: '3', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: 4, + name: '物理', + subject: '物理', + pictureUrl: null, + tableMark: '4', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: 5, + name: '化学', + subject: '化学', + pictureUrl: null, + tableMark: '5', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: 6, + name: '生物学', + subject: '生物学', + pictureUrl: null, + tableMark: '6', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: 7, + name: '政治(道法)', + subject: '政治(道法)', + pictureUrl: null, + tableMark: '7', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: 8, + name: '历史', + subject: '历史', + pictureUrl: null, + tableMark: '8', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: 9, + name: '地理', + subject: '地理', + pictureUrl: null, + tableMark: '9', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: 10, + name: '科学', + subject: '科学', + pictureUrl: null, + tableMark: '10', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: 11, + name: '历史与社会', + subject: '历史与社会', + pictureUrl: null, + tableMark: '11', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: 12, + name: '信息技术', + subject: '信息技术', + pictureUrl: null, + tableMark: '12', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: 13, + name: '音乐', + subject: '音乐', + pictureUrl: null, + tableMark: '13', + status: 0, + createUser: null, + updateUser: null, + }, + { + id: 14, + name: '美术', + subject: '美术', + pictureUrl: null, + tableMark: '14', + status: 0, + createUser: null, + updateUser: null, + }, +] + +export type Subject = { + id?: number + subjectId: number + name: string + subject: string + pictureUrl: string +} + +// 获得真正的年级 +export const getRealGrade = (grade: any) => { + grade = Number(grade) + if (grade <= base_grade_high_3) { + return base_grade_map[grade] + } + return grade +} + +export const getStageByGrade = (grade: any) => { + grade = getRealGrade(grade) + if (gaozhong.includes(grade)) { + return stage_gaozhong + } + if (chuzhong.includes(grade)) { + return stage_chuzhong + } + return stage_xiaoxue +} + +export const getSubjectById = (subjectId: any): Subject => { + subjectId = Number(subjectId) + for (const subject of subjects) { + if (subject.id === subjectId) { + return subject as any + } + } + return undefined as any +} + +export const getSubjectsByStage = (stage: any): Subject[] => { + if (!stage) return [] + stage = Number(stage) + if (stage === stage_xiaoxue) return xiaoxue_subjects + if (stage === stage_chuzhong) return chuzhong_subjects + return gaozhong_subjects +} + +export const getSubjectsByGrade = (grade: any): Subject[] => { + if (!grade) return [] + grade = getRealGrade(grade) + if (xiaoxue.includes(grade)) return xiaoxue_subjects + if (chuzhong.includes(grade)) return chuzhong_subjects + return gaozhong_subjects +} + +// 根据班级名称获得年级 +export const getGradeByClassName = (className: string) => { + for (const grade in grade_map) { + const gradeName = grade_map[grade] + if (className.includes(gradeName)) return grade + } + return undefined +} + +// 根据班级名称获得学科 +export const getSubjectsByClassName = (className: string) => { + return getSubjectsByGrade(getGradeByClassName(className)) +} diff --git a/src/api/subject/dictionaries.ts b/src/api/subject/dictionaries.ts new file mode 100644 index 0000000..ea14888 --- /dev/null +++ b/src/api/subject/dictionaries.ts @@ -0,0 +1,83 @@ +import { http } from '../http' +// 词典 + +interface SearchWordParams { + keyword: string + current?: number + size?: number + [key: string]: any +} + +interface SearchHistoryParams { + current?: number + size?: number + stageState?: number + [key: string]: any +} + +interface AddSearchHistoryData { + wordId: string + searchValue: string + stageState: number + wordSpell: string + wordZnDesc?: string + spell?: string +} + +/** + * @description: 词典搜索 + * @param {SearchWordParams} params:搜索参数 + * @return {*} + */ +const searchWordApi = (params: SearchWordParams) => { + return http.request({ + url: '/word/search', + params, + }) +} + +/** + * @description: 搜索历史 + * @param {SearchHistoryParams} params:查询参数 + * @return {*} + */ +const getSearchHistoryApi = (params: SearchHistoryParams) => { + return http.request({ + url: '/searchLog/list', + params, + }) +} + +/** + * @description: 搜索历史-新增 + * @param {AddSearchHistoryData} data:搜索历史数据 + * @return {*} + */ +const addSearchHistoryApi = (data: AddSearchHistoryData) => { + return http.request({ + url: '/searchLog', + data, + method: 'POST', + }) +} + +/** + * @description: 搜索历史-删除 + * @param {*} params: + * @return {*} + */ +const deleteSearchHistoryApi = () => { + return http.request({ + url: '/searchLog/deleteAll', + method: 'DELETE', + }) +} + +const dictionariesApi = { + searchWordApi, + getSearchHistoryApi, + addSearchHistoryApi, + deleteSearchHistoryApi, +} + +export default dictionariesApi diff --git a/src/api/subject/doWork.ts b/src/api/subject/doWork.ts new file mode 100644 index 0000000..6cf5489 --- /dev/null +++ b/src/api/subject/doWork.ts @@ -0,0 +1,46 @@ +import { http } from '../http' +import { get, post } from '../request' + +const doWorkApi = { + /* + ** 答题 + */ + // 训练记录表-新增 + addTrain: async (data: anyObj) => { + return await post('/userTrainRecord', data) + }, + + // 训练记录表-id查询 + getTrainSingle: async (id: any): Promise => { + return await get('/userTrainRecord/' + id) + }, + + // 训练记录表-查询列表 + getTrainRecordList: async (params: anyObj) => { + return await get('/userTrainRecord/list', params) + }, + + // 训练记录表-查询列表 + submitTrainRecord: async (data: anyObj) => { + return await post('/userTrainRecord/submitTrainRecord', data) + }, + + // 题目反馈表-新增 + submitTitleFeedback: (data: anyObj) => + http.request({ + url: '/titleFeedback', + data, + method: 'POST', + }), + + // 用户组卷表-开始组卷 + startGroupPaper: (data: anyObj) => + http.request({ + url: '/userPaper/start', + data, + method: 'POST', + timeout: 28000, + }), +} + +export default doWorkApi diff --git a/src/api/subject/happyRead.ts b/src/api/subject/happyRead.ts new file mode 100644 index 0000000..53c5129 --- /dev/null +++ b/src/api/subject/happyRead.ts @@ -0,0 +1,71 @@ +import { http } from '../http' + +const happyReadApi = { + /** + * 短片阅读、自然拼读答题结果记录 + */ + readingLearnRecord: (data: anyObj) => + http.request({ + url: '/readingLearnRecord/saveRecord', + method: 'POST', + data, + }), + + // 自然拼读关卡-开始练习(智能选择关卡) + getNaturalLangBeginTrain: () => + http.request({ + url: '/naturalLangLevel/getLevelContentById/beginTrain', + }), + + // 句子单词关联-获取该单词关联关卡练习(若返回空则表示该单词没有相关关卡) + getTestOrWordDetail: (data: anyObj) => + http.request({ + url: '/textSentenceWord/queryThroughLevelTrain', + method: 'POST', + data, + }), + + /** + * 短篇阅读 + */ + // 短篇阅读获取首页数据 + shortQueryFirstPageInfo: () => + http.request({ + url: '/shortTextReadingLevel/queryFirstPageInfo', + }), + + // 短篇阅读开始练习 + shortReadBeginTrain: (params?: anyObj) => + http.request({ + url: '/shortTextReadingLevel/beginTrain', + params, + }), + + // sessionid 生成 + getReadSessionid: () => + http.request({ + url: '/shortTextReadingLevel/sessionIdSender', + }), + + // 阶数选择 + getReadGradeList: () => + http.request({ + url: '/shortTextReadingLevel/gradleSelector', + }), + + // 获取答题列表 + getReadRecoredList: (params?: anyObj) => + http.request({ + url: '/readingLearnRecord/list', + params, + }), + + // 获取答题详情 + getReadRecoredDetail: (params?: anyObj) => + http.request({ + url: '/shortTextReadingLevel/detailRecord', + params, + }), +} + +export default happyReadApi diff --git a/src/api/subject/homework/index.ts b/src/api/subject/homework/index.ts new file mode 100644 index 0000000..973f79b --- /dev/null +++ b/src/api/subject/homework/index.ts @@ -0,0 +1,48 @@ +import { get, post } from '../../request' + +import { PaperRecord, HomeworkExam, SubjectPaperRecord } from './type' +export * from './type' + +const getUnfinishedHomework = async () => { + const records = await get('/school/paper/userRecord/listExamRecord') + // 利用map优化 + const map = new Map() + records.forEach(item => { + const record = map.get(item.subjectId) + if (record) { + record.records.push(item) + } else { + map.set(item.subjectId, { + subjectId: item.subjectId, + subjectName: item.subjectName, + records: [item], + }) + } + }) + return map +} + +const startExam = async (recordId: any) => { + return post(`/school/paper/exam`, { recordId }) +} + +const homeworkApi = { getUnfinishedHomework, startExam } +export default homeworkApi + +// 保存题目 +const saveRecordAnswer = async (data: any) => { + return post(`/school/paper/saveRecordAnswer`, data) +} +export { saveRecordAnswer } + +// 提交作业 +const submitExam = async (data: any) => { + return post(`/school/paper/submit`, data) +} +export { submitExam } + +// 作业记录列表 +const getListCompleteRecord = async (data: any) => { + return get(`/school/paper/userRecord/listCompleteRecord`, data) +} +export { getListCompleteRecord } diff --git a/src/api/subject/homework/type.ts b/src/api/subject/homework/type.ts new file mode 100644 index 0000000..54d9a2b --- /dev/null +++ b/src/api/subject/homework/type.ts @@ -0,0 +1,269 @@ +/** + * 测试类型枚举 + */ +export enum TestTypeEnum { + /** 单元测试 */ + UNIT_TEST = 1, + /** 周测 */ + WEEKLY_TEST = 2, + /** 月测 */ + MONTHLY_TEST = 3, + /** 随堂练习 */ + CLASS_PRACTICE = 4, + /** 课前预习 */ + PRE_CLASS_PREVIEW = 5, +} + +export interface SubjectPaperRecord { + /** 学科id */ + subjectId: string + + /** 学科名称 */ + subjectName: string + + /** 试卷记录列表 */ + records: PaperRecord[] +} + +/** + * 试卷记录类型 + */ +export interface PaperRecord { + /** 主键 */ + id: number + + /** 学校id */ + schoolId: number + + /** 发布人 */ + publisherName: string + + /** 用户id */ + userId: number + + /** 用户名称 */ + userName: string + + /** 试卷id */ + paperId: number + + /** 试卷名称 */ + paperName: string + + /** 学科id */ + subjectId: string + + /** 学科名称 */ + subjectName: string + + /** 总分 */ + totalScore: number + + /** 得分 */ + score: number + + /** 作答时长 */ + costTime: number + + /** 提交时间 */ + submitTime: string + + /** 状态:0-未作答,1-已作答 */ + status: 0 | 1 + + /** 测试类型 1: 单元测试 2: 周测 3 月测, 4 随堂练习 5 课前预习 */ + type: TestTypeEnum + + /** 创建时间 */ + createTime: string + endTime: string + + remark: string +} + +/** + * 题目选项类型 + */ +export type OptionList = string[][] + +/** + * 学科题目类型 + */ +export interface SubjectTitleVo { + /** 题目ID */ + id: string + + /** 学校ID */ + schoolId: string + + /** 教材ID */ + textBookId: string + + /** 教材名称 */ + textBookName: string + + /** 学段父级ID */ + stagePid: string + + /** 学段名称 */ + stageName: string + + /** 学科ID */ + subjectId: string + + /** 学科名称 */ + subjectName: string + + /** 基础ID */ + baseId: string | null + + /** 原始ID */ + originId: string + + /** 题目标题 */ + title: string + + /** 题目类型 */ + titleType: number + + /** 父级ID */ + pid: string | null + + /** 考试类型 */ + examType: number + + /** 来源ID */ + sourceId: string | null + + /** 来源名称 */ + sourceName: string + + /** 题目渠道类型 */ + titleChannelType: string + + /** 题目渠道类型名称 */ + titleChannelTypeName: string + + /** 题目类型基础ID */ + titleTypeBaseId: string + + /** 难度 */ + difficulty: number + + /** 地址ID */ + addrId: string | null + + /** 排序 */ + sort: number + + /** 语音URL */ + voiceUrl: string | null + + /** 图片URL */ + pictureUrl: string | null + + /** 题目解析 */ + titleAnalyze: string + + /** 题目解析图片 */ + titleAnalyzePicture: string | null + + /** 题目解析JSON */ + titleAnalyzeJson: string | null + + /** 答案 */ + answer: string + + /** 年份 */ + years: string + + /** 省份 */ + provinces: string + + /** 题目来源IDs */ + titleSourceIds: string | null + + /** 关联试卷 */ + linkPaper: number + + /** 分组数量 */ + groupCount: number + + /** 简化标题 */ + simpTitle: string | null + + /** 题目数据 */ + titleData: string | null + + /** 解析数据 */ + analyzeData: string | null + + /** 方法 */ + method: string | null + + /** 讨论 */ + discuss: string | null + + /** 序号 */ + seq: number + + /** 状态 */ + status: number + + /** 删除标志 */ + delFlag: number + + /** 选项列表 */ + optionList: OptionList + + /** 项目ID */ + itemId: string + + /** 分数 */ + score: number | null + + /** 提交答案 */ + submitAnswer: string | null + + /** 提交答案图片 */ + submitAnswerPic: string | null + + /** 正确结果 */ + correctResult: string | null + + /** 题干类型: 1原始题 2选择题 3复合题 */ + stemType: number + + /** 题干HTML */ + stemHtml: string | null + + /** 选择题选项HTML */ + optionHtml: string | null + + /** 答案HTML */ + answerHtml: string | null + + /** 子题题干HTML */ + stemSqs: string | null + + /** 小题选项数组JSON */ + optionSqs: string | null + + /** 小题答案 */ + answerSqs: string | null +} + +/** + * 开始考试类型 + */ +export interface HomeworkExam { + /** 试卷ID */ + paperId: string + paperName: string + + /** 记录ID */ + recordId: string + + /** 学科题目列表 */ + titleVoList: SubjectTitleVo[] +} diff --git a/src/api/subject/languageSense.ts b/src/api/subject/languageSense.ts new file mode 100644 index 0000000..ede3411 --- /dev/null +++ b/src/api/subject/languageSense.ts @@ -0,0 +1,67 @@ +import { http } from '../http' +import { get } from '../request' + +const languageSenseApi = { + /** + * 根据教材id查询例句 + */ + getSentenceById: (grade: number) => { + return http.request({ + url: '/userSentenceLearn/sentence', + timeout: 5000, + method: 'POST', + params: { + grade, + }, + }) + }, + + /** + * 根据教材id查询例句 + */ + getSentenceBySessionId: (sessionId: string) => { + return http.request({ + url: `/userSentenceLearn/againLearn/${sessionId}`, + }) + }, + + /** + * 保存每次答题记录 + */ + saveSentenceRecord: (data: anyObj) => { + return http.request({ + url: '/userSentenceRecord/record', + data, + method: 'POST', + }) + }, + + /** + * 保存一次练习的最终记录 + */ + saveSentenceRecordHistory: (data: anyObj) => { + return http.request({ + url: '/userSentenceLearn/history', + data, + method: 'POST', + }) + }, + + /* + **数据统计 + */ + // 根据时间维度获取统计数据 + queryStatByTimeFlag: (data: anyObj) => + http.request({ + url: '/userSentenceLearn/queryStatByTimeFlag', + method: 'POST', + data, + }), + + // 获得语感阶段列表 + getSenseStagesApi: async (): Promise => { + return await get('/sysDictType/listSysDictData/grade_label') + }, +} + +export default languageSenseApi diff --git a/src/api/subject/learnWord.ts b/src/api/subject/learnWord.ts new file mode 100644 index 0000000..8539891 --- /dev/null +++ b/src/api/subject/learnWord.ts @@ -0,0 +1,132 @@ +import { http } from '../http' + +const learnWordApi = { + // 获取阶段 + getStageList: (params: object | any) => { + return http.request({ + url: '/stage/list', + params, + }) + }, + + // 获取混合闯关首页内容 + getMixIntrudeIndex: (stageId: string) => { + return http.request({ + url: `/intrudeLevel/mixIntrudeIndex/${stageId}`, + }) + }, + + // 根据教材id 获取混合闯关首页内容 + getMixIntrudeIndexFromTextBookId: (textbookId: string, params: object) => { + return http.request({ + url: `/intrudeLevel/intrudeIndex/textbook/${textbookId}`, + params, + }) + }, + + // 获取闯关首页内容 + getLearnWordInfo: (params: object | any) => { + return http.request({ + url: `/intrudeLevel/intrudeIndex`, + params, + }) + }, + + /** + * @description: 简单模式--获取四轮题目 + * @return {*} + */ + getSimpleTopic: (levelId: string, params: object | any) => { + return http.request({ + url: `/intrudeLevel/simpleLevelTile/${levelId}`, + params, + }) + }, + + /** + * @description: 普通模式-闯关记录提交,返回是否破纪录 + * @param {*} data + * @return {*} + */ + postSimpleRecord: (data: object | any) => { + // return request('/intrudeLevel/simpleRecord', 'POST', data); + return http.request({ + url: `/intrudeLevel/saveAndReturnSimpleResult`, + method: 'POST', + timeout: 8000, + data, + }) + }, + + /** + * @description: 单词对错情况提交,普通模式返回当前节点的分数与星级 + * @param {*} data + * @return {*} + */ + postWordRecord: (data: object | any) => { + // return request('/intrudeLevel/wordRecord', 'POST', data); + return http.request({ + url: `/intrudeLevel/wordRecordV2`, + method: 'POST', + data, + }) + }, + + /** + * @description: 困难模式--获取两轮题目 + * @return {*} + */ + getHardTopic: (levelId: string, data: object | any) => { + return http.request({ + url: `/intrudeLevel/hardLevelTile/${levelId}`, + data, + }) + }, + + /** + * @description: 困难模式-闯关记录提交,返回是否破纪录 + * @param {*} data + * @return {*} + */ + postHardRecord: (data: object | any) => { + // return request('/intrudeLevel/hardRecord', 'POST', data); + return http.request({ + url: `/intrudeLevel/saveAndReturnHardResult`, + method: 'POST', + timeout: 8000, + data, + }) + }, + + /** + * @description: 使用道具 1使用炸弹 2使用放大镜 + * @param {*} data + * @return {*} + */ + postUseItems: (data: object | any) => { + return http.request({ + url: `/sysUser/useItems`, + method: 'POST', + data, + }) + }, + + /* ----------------------------------------- 测试用 api ----------------------------------------- */ + simpleRecordTest: (data: object | any) => { + return http.request({ + url: `/intrudeLevel/simpleRecordTest`, + method: 'POST', + data, + }) + }, + + hardRecordTest: (data: object | any) => { + return http.request({ + url: `/intrudeLevel/hardRecordTest`, + method: 'POST', + data, + }) + }, +} + +export default learnWordApi diff --git a/src/api/subject/questionExplain.ts b/src/api/subject/questionExplain.ts new file mode 100644 index 0000000..376ca4a --- /dev/null +++ b/src/api/subject/questionExplain.ts @@ -0,0 +1,21 @@ +import { get } from '../request' + +const questionExplainApi = { + /** 获取我的班级信息 */ + myClass: async () => { + return await get('/school/questionExplain/myClass') + }, + /** 根据发布记录ID获取试卷详情(讲解页面使用) */ + getPaperDetailByReleaseRecordId: async (recordId: string) => { + return await get('/school/paper/getPaperDetailByReleaseRecordId', { recordId }) + }, + /** 获取当前班级的讲解状态 */ + current: async (classId: string) => { + return await get<{ explaining: boolean; questionId: string; recordId: number }>( + '/school/questionExplain/current', + { classId }, + ) + }, +} + +export default questionExplainApi diff --git a/src/api/subject/sentenceCollect.ts b/src/api/subject/sentenceCollect.ts new file mode 100644 index 0000000..386fdc7 --- /dev/null +++ b/src/api/subject/sentenceCollect.ts @@ -0,0 +1,29 @@ +import { http } from '../http' + +/* + ** 句子收藏 + */ +const sentenceCollectApi = { + // 获取当前用户收藏的句子 + getLangSenseCollectList: (params: anyObj) => + http.request({ + url: '/langSenseSentenceCollect/queryCurrentUserCollect', + params, + }), + // 收藏句子 + collectSentence: (data: anyObj) => + http.request({ + url: '/langSenseSentenceCollect/collectSentence', + method: 'POST', + data, + }), + // 取消收藏句子 + cancelCollectSentence: (data: anyObj) => + http.request({ + url: '/langSenseSentenceCollect/cancelCollectSentence', + method: 'POST', + data, + }), +} + +export default sentenceCollectApi diff --git a/src/api/subject/subject.ts b/src/api/subject/subject.ts new file mode 100644 index 0000000..08643cd --- /dev/null +++ b/src/api/subject/subject.ts @@ -0,0 +1,328 @@ +import { http } from '../http' +import { get, type PageResponse } from '../request' + +export type GetSubjectTextBookVersionApi = { + subjectId: any + gradeId?: any + stageId?: any + size?: any + resource: any +} + +interface Video { + // 根据实际视频数据结构补充 + [key: string]: any +} + +interface Knowledge { + id: any + baseId: any + pid: any + pids: string + name: string + status: number + createTime: string + childrenList: any[] // 可根据实际数据结构进一步定义 + children: any[] | null + hasVideoFlag: number | null + videoList: Video[] | null +} + +interface ChapterVideo { + // 根据实际章节视频数据结构补充 + [key: string]: any +} + +export interface Chapter { + id: any + subjectId: number + pid: any + pids: string + name: string + sort: number + learnFlag: number + hasVideoFlag: number + chapterVideoVoList: ChapterVideo[] | null + children: Chapter[] // 递归类型,表示子章节 + knowledgeVoList: Knowledge[] + correctCount: any + maxCorrectCount: any + lastCorrectCount: any + + progressText: any + progressClass: any +} + +interface SubjectChapterTreeParams { + textBookId: any + [key: string]: any +} + +interface UserTextBookListParams { + subjectId?: any + gradeId?: any + size?: number + [key: string]: any +} + +interface SaveUserTextBookData { + textBookId: any + subjectId: any + gradeId: any + [key: string]: any +} + +interface UpdateUserTextBookData { + id: any + [key: string]: any +} + +interface SubjectKnowledgeTreeParams { + chapterId: any + [key: string]: any +} + +interface SubjectChapterVideosParams { + chapterId: any + [key: string]: any +} + +interface SubjectKnowledgeVideosParams { + knowledgeId: any + [key: string]: any +} +export interface Color { + color: string + bgColor: string +} + +export interface Clean { + name: string + tags: string[] + all_tags: string[] + fullName?: string + color: Color +} + +export interface TextBook { + id: any + textBookId: any + baseId: any + gradeId: any + subjectId: any + bookVersionId: any + name: string + shortName: string + textBookName: string + displayName: string + businessFlag: string + addFlag: number + progress: any + bookVersionName: any + versionName: any + currentChapterId: any + chapterBaseId: any + chapterTreeNodeList: any + clean: Clean + locked: boolean + syncFlag: number + version: BookVersion + bookType: number + currentChapterIds: any +} + +// 学校教材 +export const book_type_school = 1 +// 其他教材 +export const book_type_other = 2 +export const book_sync_locked = 1 +export const book_sync_unlocked = 0 + +export interface BookVersion { + id: any + baseId: any + name: string + shortName: string + delFlag: number + textBookVoList: TextBook[] + clean: Clean +} + +export interface PracticeModule { + /** + * 主键 + */ + id: number + + /** + * 学校id + */ + schoolId: number + + /** + * 排序,由小到大 + */ + sort: number + + /** + * 模块名称 + */ + name: string + + /** + * 状态(字典 0正常 1停用) + */ + status: 0 | 1 + + /** + * 删除状态(0正常,1已删除) + */ + delFlag: 0 | 1 +} + +export const subjectApi = { + // 获取教材出版社 + getSubjectTextBookVersion: async (params: GetSubjectTextBookVersionApi) => { + const res = (await get('/subjectTextBookVersion/list', { + size: -1, + ...params, + })) as any + if (Array.isArray(res?.rows)) return res.rows + if (Array.isArray(res?.data?.rows)) return res.data.rows + if (Array.isArray(res)) return res + return [] + }, + + // 获取章节 + getSubjectChapterTree: (params: SubjectChapterTreeParams) => { + return http.request({ + url: '/subjectChapter/tree', + params, + }) + }, + + // 获取用户教材 + getUserTextBookList: async (params: UserTextBookListParams) => { + if (!params.size) { + params.size = -1 + } + return await get('/userTextBook/list', params) + }, + + // 添加用户教材 + saveUserTextBook: (data: SaveUserTextBookData) => { + return http.request({ + url: '/userTextBook', + method: 'post', + data, + }) + }, + + // 更新用户教材 + updateUserTextBook: (data: UpdateUserTextBookData) => { + return http.request({ + url: '/userTextBook', + method: 'put', + data, + }) + }, + + // 删除用户教材 + delUserTextBookToId: (id: any) => { + return http.request({ + url: `/userTextBook/${id}`, + method: 'delete', + }) + }, + + // 学科知识点-查询章节下的知识点树 + getSubjectKnowledgeTree: (params: SubjectKnowledgeTreeParams) => { + return http.request({ + url: `/subjectKnowledge/tree`, + params, + }) + }, + + // 学科章节-视频表-查询列表 + getSubjectChapterVideos: (params: SubjectChapterVideosParams) => + http.request({ + url: '/subjectChapterVideo/list', + params, + }), + + // 学科知识点-视频表-查询列表 + getSubjectKnowledgeVideos: (params: SubjectKnowledgeVideosParams) => + http.request({ + url: '/subjectKnowledgeVideo/list', + params, + }), + + // 用户教材表-修改当前所处章节 + updateCurrentChapter: (data: anyObj) => + http.request({ + url: '/userTextBook/updateCurrentChapter', + method: 'post', + data, + }), + + /** + * 教材查询 + * @param id + * @returns + */ + getTextBookById: async (id: string) => { + return await get(`/userTextBook/${id}`) + }, + + /** + * + * @param params + * @returns + */ + getPracticeModuleList: async (params: any) => { + return await get>('/school/practiceModule/list', params) + }, + + /* + ** 错题本 + */ + // 用户错题本表-查询列表 + getWrongQuesList: (params: anyObj) => + http.request({ + url: '/userErrorEdition/list', + params, + }), + + // 用户错题本表-查询列表 + getUserErrorInfo: (params: anyObj) => + http.request({ + url: '/userErrorEdition/getUserErrorInfo', + params, + }), + + /* + ** ai精准学 + */ + + // 用户知识点表-id查询 + getSujectKnowledgeStatistics: (params: anyObj) => + http.request({ + url: '/userKnowledge/getSujectKnowledgeStatistics', + params, + }), + + // 用户组卷表-查询列表 + getGroupPaperList: (params: anyObj) => + http.request({ + url: '/userPaper/list', + params, + }), + + // 用户组卷表-id查询 + getGroupPaperDetail: (id: any) => + http.request({ + url: '/userPaper/' + id, + }), +} + +export default subjectApi diff --git a/src/api/subject/wordBook.ts b/src/api/subject/wordBook.ts new file mode 100644 index 0000000..f823749 --- /dev/null +++ b/src/api/subject/wordBook.ts @@ -0,0 +1,31 @@ +import { http } from '../http' + +interface StrangeWordParams { + current?: number + size?: number + textbookId?: string + [key: string]: any +} + +/* + ** 生词本 + */ +const wordBookApi = { + // 获取生词本 + getStrangeWord: (params: StrangeWordParams) => + http.request({ + url: '/userStrangeWord/list', + params, + }), + + // 生词本删除 + deleteStrangeWord: (id: any) => + http.request({ + url: `/userStrangeWord/deleteBatch?ids=${id}`, + method: 'DELETE', + }), +} + +export default wordBookApi + +export type { StrangeWordParams } diff --git a/src/api/subject/wordDetail.ts b/src/api/subject/wordDetail.ts new file mode 100644 index 0000000..7713443 --- /dev/null +++ b/src/api/subject/wordDetail.ts @@ -0,0 +1,39 @@ +import { http } from '../http' + +interface GetWordParams { + spell?: string + id?: any + wordId?: string + [key: string]: any +} + +interface OperateTagData { + id: any + meaningId?: string + levelId?: string + knowFlag?: number | null + strangeFlag?: number + wordId?: string +} + +// 获取单词详情 +const getWord = (params: GetWordParams) => + http.request({ + url: '/word/get', + params, + }) + +const operateTag = (data: OperateTagData) => + http.request({ + url: '/word/operate', + method: 'POST', + data, + }) + +const wordDetailApi = { + getWord, + operateTag, +} + +export default wordDetailApi +export type { GetWordParams, OperateTagData } diff --git a/src/api/subject/wordTable.ts b/src/api/subject/wordTable.ts new file mode 100644 index 0000000..117e93d --- /dev/null +++ b/src/api/subject/wordTable.ts @@ -0,0 +1,230 @@ +import { http } from '../http' +import { only_last_id } from '../only-last' +import { get } from '../request' + +const extractList = (res: any): any[] => { + if (Array.isArray(res)) return res + if (res && typeof res === 'object') { + return res.records || res.rows || res.list || [] + } + return [] +} + +const processMemoryTips = (tips: any) => { + if (!tips) { + return [] + } + if (typeof tips === 'string') { + try { + const parsedTips = JSON.parse(tips) + if (Array.isArray(parsedTips)) { + return _processMemoryTipsArray(parsedTips) + } else { + return [parsedTips] + } + } catch (e) { + return [tips] + } + } else if (Array.isArray(tips)) { + return _processMemoryTipsArray(tips) + } else { + return [tips] + } +} + +const _processMemoryTipsArray = (memoryTips: any[]) => { + return memoryTips.map(tip => { + if (typeof tip === 'string') { + return tip + } + return tip + }) +} + +const wordTableApi = { + /** + * @description: 获取阶段筛选项 + * @param {*} params: + * @return {*} + */ + getWordTableStage: () => { + return http.request({ + url: `/vocabulary/helpVocabulary`, + }) + }, + + /** + * @description: 获取单词熟悉程度枚举 + * @param {*} params: + * @return {*} + */ + getWordTableFamiliarity: () => { + return http.request({ + url: `/wordTable/graspEnum`, + }) + }, + + /** + * @description: 获取阶段单词表 + * @param {WordTableStageParams} params:查询参数 + * @return {*} + */ + getWordTableStageList: (params: WordTableStageParams) => { + return http.request({ + url: `/wordTable/wordTableStage`, + params, + [only_last_id]: 'word-table-list', + }) + }, + + /** + * @description: 获取教材单词表可用阶段 + * @param {*} params: + * @return {*} + */ + getTextbookStage: () => { + return http.request({ + url: `/textbookStage/wordTableUseList`, + }) + }, + + /** + * @description: 获取教材单词表版本 + * @param {*} params: + * @return {*} + */ + getTextbookVersion: async (stageId: any): Promise => { + return await get(`/textbookVersion/list/${stageId}`) + }, + + /** + * @description: 获取教材单词表教材 + * @param {*} params: + * @return {*} + */ + getTextbookList: async (versionId: any): Promise => { + return await get(`/textbook/list?versionId=${versionId ?? ''}`) + }, + + getXkwStageList: async (): Promise => { + const res = await get(`/xkw/stage/list`, { size: -1, status: 0 }) + return extractList(res) + }, + + getXkwCourseList: async (stageId: any): Promise => { + const res = await get(`/xkw/course/list`, { size: -1, status: 0, stageId }) + return extractList(res) + }, + + getXkwTextbookVersionList: async (courseId: any): Promise => { + const res = await get(`/xkw/textbookVersion/list`, { size: -1, status: 0, courseId }) + return extractList(res) + }, + + getXkwTextbookList: async (versionId: any): Promise => { + const res = await get(`/xkw/textbook/list`, { size: -1, status: 0, versionId }) + return extractList(res) + }, + + getXkwTextbookCatalogList: async (textbookId: any): Promise => { + const res = await get(`/xkw/textbookCatalog/list`, { parentId: 0, textbookId, size: -1 }) + return extractList(res) + }, + + /** + * @description: 获取教材单词表章节 + * @param {*} params: + * @return {*} + */ + getChapterList: async (textbookId: any): Promise => { + return await get(`/textbookChapter/data/list`, { textbookId }) + }, + + /** + * @description: 获取教材单词表教材 + * @param {TextbookWordParams} params: + * @return {*} + */ + getTextbookWord: (params: TextbookWordParams) => { + return http.request({ + url: `/wordTable/wordTableTextbook`, + params, + [only_last_id]: 'word-table-list', + }) + }, + + /** + * @description: 获取教材单词表教材 + * @param {WordCardDetailParams} params: + * @return {*} + */ + getWordCardDetail: async (params: WordCardDetailParams): Promise => { + const data = (await get(`/wordTable/wordDetail`, params)) as any + data.memoryTips = JSON.parse(data.memoryTips) + processMemoryTips(data.memoryTips) + return data + }, + + /** + * @description: 记录用户单词书筛选条件 + * @param {UserWordFilterData} data: + * @return {*} + */ + saveUserWordFilterRecord: (data: UserWordFilterData) => { + return http.request({ + url: `/sysUser/setConfigInfo`, + data, + method: 'POST', + }) + }, + + /** + * @description: 获取用户单词书筛选条件 + * @param {UserWordFilterParams} params: + * @return {*} + */ + getUserWordFilterRecord: (params: UserWordFilterParams) => { + return http.request({ + url: `/sysUser/getConfigInfo`, + params, + }) + }, +} + +interface WordTableStageParams { + current?: number + size?: number + [key: string]: any +} + +interface TextbookWordParams { + textbookId?: string + chapterId?: string + [key: string]: any +} + +interface WordCardDetailParams { + wordId: string + [key: string]: any +} + +interface UserWordFilterData { + textbookId?: string + chapterId?: string + familiarityId?: string + [key: string]: any +} + +interface UserWordFilterParams { + textbookId?: string + [key: string]: any +} + +export default wordTableApi +export type { + WordTableStageParams, + TextbookWordParams, + WordCardDetailParams, + UserWordFilterData, + UserWordFilterParams, +} diff --git a/src/api/subject/wordTest.ts b/src/api/subject/wordTest.ts new file mode 100644 index 0000000..b7dc1d0 --- /dev/null +++ b/src/api/subject/wordTest.ts @@ -0,0 +1,150 @@ +import { http } from '../http' +import { get, post, put } from '../request' + +/** + * @description: 单词测试-保存单词测试结果 + * @param {*} params: + * @return {*} + */ +interface SaveWordTestData { + testType?: number + textbookId?: string + chapterId?: string + [key: string]: any +} + +interface CompleteWordTestData { + id: any + score?: number + [key: string]: any +} + +interface GetWordTestData { + textbookId?: string + chapterId?: string + testType?: number + questionCount?: number + [key: string]: any +} + +interface WordTestRecordParams { + current?: number + size?: number + [key: string]: any +} + +const processMemoryTips = (tips: any) => { + if (!tips) return + for (const tip of tips) { + if (!tip.details) continue + let text = '' + let begin = false + for (const char of tip.details) { + if (char === "'") { + if (begin) { + begin = false + text += '' + text += char + } else { + begin = true + text += char + text += '' + } + } else { + text += char + } + } + tip.details = text + } +} + +const _processMemoryTipsArray = (memoryTips: any[]) => { + if (!memoryTips?.length) return + for (const item of memoryTips) { + item.memoryTips = JSON.parse(item.memoryTips) + processMemoryTips(item.memoryTips) + } +} + +const wordTestApi = { + /** + * @description: 单词测试-保存单词测试结果 + * @param {*} params: + * @return {*} + */ + saveWordTest: (data: SaveWordTestData) => { + return http.request({ + url: `/wordTestRecord/saveWordTest`, + method: 'POST', + data, + }) + }, + + /** + * @description: 单词测试-结束单词测试 + * @param {*} params: + * @return {*} + */ + completeWordTest: async (data: CompleteWordTestData) => { + return await put(`/wordTestRecord/completeWordTest`, data) + }, + + /** + * @description: 单词测试-获取题目 + * @param {GetWordTestData} data:测试参数 + * @return {*} + */ + getWordTestWordsV2: async (data: GetWordTestData): Promise => { + const res = (await get('/wordExamRecord/getWords', data)) as any + _processMemoryTipsArray(res.chooseTitle) + _processMemoryTipsArray(res.spellTitle) + return res + }, + + /** + * @description: 单词测试-获取题目 + * @param {GetWordTestData} data:测试参数 + * @return {*} + */ + getWordTestWords: async (data: GetWordTestData): Promise => { + const res = (await post('/wordTestRecord/getWordTestWords2', data)) as any + _processMemoryTipsArray(res.chooseTitle) + _processMemoryTipsArray(res.spellTitle) + return res + }, + + /** + * @description: 单词测试-测试记录表-查询列表 + * @param {WordTestRecordParams} params:查询参数 + * @return {*} + */ + getWordTestRecordList: (params: WordTestRecordParams) => { + return http.request({ + url: `/wordTestRecord/list`, + params, + }) + }, + + /** + * @description: 单词测试-测试记录表-详情 + * @param {*} params: + * @return {*} + */ + getWordTestRecordDetail: (id: any) => { + return http.request({ + url: `/wordTestRecord/${id}`, + }) + }, + + checkMedalStatus: (data: { checkFlag: 0 | 1; ids: string }) => { + return http.request({ + url: `/userMedal/updateCheck`, + method: 'POST', + data, + }) + }, +} + +export default wordTestApi + +export type { SaveWordTestData, CompleteWordTestData, GetWordTestData, WordTestRecordParams } diff --git a/src/api/subject/wrongQuestion.ts b/src/api/subject/wrongQuestion.ts new file mode 100644 index 0000000..bc0b0bf --- /dev/null +++ b/src/api/subject/wrongQuestion.ts @@ -0,0 +1,136 @@ +import { get, post } from '../request' +import type { PageResponse } from '../request' + +export interface QuestionTitle { + actualScore: number + aiAnalyze: string + aiAnswer: string + answer: string + answerHtml: string + answerSqs: string + correctResult: number + courseId: number + delFlag: number + difficulty: number + difficultyCode: number + difficultyLevel: string + explanation: string + id: string + itemId: number + media: number + optionHtml: string + optionSqs: string + point: string + schoolId: number + score: number + sort: number + status: number + stem: string + stemHtml: string + stemSqs: string + stemType: number + submitAnswer: string + submitAnswerPic: string + textBookId: number + typeId: string + typeName: string + year: number +} + +export interface WrongQuestionItem { + id: number + questionId: string + userId: number + subjectId: number + textbookId: number + chapterId: number + courseId: number + errorCount: number + errorType: number + masteryLevel: number + status: number + delFlag: number + firstErrorTime: string + lastErrorTime: string + lastCorrectTime: string + questionTitle: QuestionTitle +} + +export interface WrongQuestionParams { + current: number + size: number + chapterId?: number + courseId?: number + startTime?: string + endTime?: string + subjectId?: number +} + +export interface RetryStartParams { + chapterId?: number + courseId?: number + questionCount?: number + subjectId?: number + textbookId?: number +} + +export interface RetryStartResult { + costTime: number + paperId: number + paperName: string + recordId: number + remark: string + titleVoList: QuestionTitle[] +} + +export interface FilterSubject { + id: number + name: string +} + +export interface FilterTextbook { + id: number + name: string +} + +export interface FilterChapter { + id: number + name: string + parentId: number + textbookId: number + type: string +} + +const wrongQuestionApi = { + getList: async (params: WrongQuestionParams): Promise> => { + return await get>('/xkw/wrong/question/filter/page', params) + }, + retryStart: async (params: RetryStartParams): Promise => { + return await post('/xkw/wrong/question/retry/start', params) + }, + similarRecommend: async (params: { questionId: string }): Promise => { + return await post('/school/paper/similarPractice/start', params) + }, + getFilterSubjects: async (): Promise => { + return await get('/xkw/wrong/question/filter/subjects') + }, + getFilterTextbooks: async (params: { subjectId: number }): Promise => { + return await get('/xkw/wrong/question/filter/textbooks', params) + }, + getTextbookCatalogList: async (params: { + textbookId: number + size?: number + }): Promise => { + const res = await get('/xkw/textbookCatalog/list', { + textbookId: params.textbookId, + size: params.size ?? -1, + }) + if (Array.isArray(res)) return res + if (res && typeof res === 'object') { + return res.rows || res.records || res.list || [] + } + return [] + }, +} + +export default wrongQuestionApi diff --git a/src/api/system/activity.ts b/src/api/system/activity.ts new file mode 100644 index 0000000..5563a1e --- /dev/null +++ b/src/api/system/activity.ts @@ -0,0 +1,21 @@ +import { http } from '../http' + +const activityApi = { + // 获取用户活动列表 + getUserActivityList: (params?: anyObj) => { + return http.request({ + url: '/personal/getUserActivityTask', + params, + }) + }, + + // 打开活动奖励 + openActivityReward: (params?: anyObj) => { + return http.request({ + url: '/personal/openActivityReward', + params, + }) + }, +} + +export default activityApi diff --git a/src/api/system/announcement.ts b/src/api/system/announcement.ts new file mode 100644 index 0000000..332e327 --- /dev/null +++ b/src/api/system/announcement.ts @@ -0,0 +1,26 @@ +import { http } from '../http' + +const announcementApi = { + /** + * 分页获取公告标题 + */ + getAnnouncementListApi: (data: anyObj) => { + return http.request({ + url: '/userAnnouncement/getAnnouncementTitleByPage', + method: 'POST', + data, + }) + }, + + /** + * 修改未读状态公告 + */ + updateAnnouncemenStatusApi: (id: any) => { + return http.request({ + url: `/userAnnouncement/updateReadStatusByAnnounceId/${id}`, + method: 'POST', + }) + }, +} + +export default announcementApi diff --git a/src/api/system/homeWork.ts b/src/api/system/homeWork.ts new file mode 100644 index 0000000..6ec4170 --- /dev/null +++ b/src/api/system/homeWork.ts @@ -0,0 +1,324 @@ +import { http } from '../http' +import { get, post } from '../request' +// import { getCache } from '@/utils'; + +const config = { + baseURL: '/api/main', +} + +const homeWorkApi = { + /** + * @description: 查询作业的学科列表 + * @param {*} params: + * @return {*} + */ + getSubjectList: (params: object) => + http.request({ + url: '/sc/job/getSubjectList', + params, + ...config, + }), + + /** + * @description: 查询作业列表 + * @param {*} params: + * @return {*} + */ + getJobList: async (params: object) => await get('/sc/job/list', params), + + // /** + // * @description: 客户端学生作业 + // * @param {*} params: + // * @return {*} + // */ + // getJobTittle: async (params: object) => + // ( + // await http.request({ + // url: '/sc/job/getJobTittle', + // params, + // ...config, + // }) + // ).data, + + /** + * @description: 客户端学生作业详情新 + * @param {*} data + * @return {*} + */ + getPaperRecordDetail: async (data: object) => + ( + await http.request({ + url: '/school/paper/getPaperRecordDetail', + data, + method: 'POST', + ...config, + }) + ).data, + + /** + * @description: 提交当前题目id + * @param {*} params + * @return {*} + */ + submitCurrentTitleId: (data: anyObj) => + http.request({ + url: `/sc/jobStu/submitCurrentTitleId?jobStuId=${data.jobStuId}¤tTitleId=${data.currentTitleId}&costTime=${data.costTime}`, + method: 'POST', + ...config, + }), + + /** + * @description: 提交作业答案-学生试题 + * @param {*} params: + * @return {*} + */ + submitAnswer: (data: anyObj) => + http.request({ + url: '/sc/jobStuTitle/submitAnswer', + method: 'POST', + data, + ...config, + }), + + /** + * @description: 提交作业 + * @param {*} params: + * @return {*} + */ + submitPaper: async (data: anyObj) => + await http.request({ + url: '/sc/jobStu/submit', + method: 'POST', + data, + ...config, + }), + + /** + * @description: 查询整体分析的学科列表 + * @param {*} params: + * @return {*} + */ + getAnalyseSubjectList: (params: object) => + http.request({ + url: '/sc/job/statisticalSubject', + params, + ...config, + }), + + /** + * @description: 获取作业的整体分析 + * @param {*} id: + * @return {*} + */ + getJobAnalyse: ({ id, stuId }: anyObj) => + http.request({ + url: `/sc/job/getJobAnalyse/${id}?stuId=${stuId}`, + ...config, + }), + + /** + * @description: 新获取作业的整体分析 + * @param {*} id: + * @return {*} + */ + getJobAnalyseNew: (params: anyObj) => + http.request({ + url: `/sc/job/getJobAnalyse`, + ...config, + params, + }), + + // /** + // * @description: 获取作业的知识点分析 + // * @param {*} id: + // * @return {*} + // */ + // getKnowledgeAnalyse: ({ id, stuId }: anyObj) => + // http.request({ + // url: `/sc/jobStu/knowledgeAnalyse?jobId=${id}&stuId=${stuId}`, + // ...config, + // }), + /** + * @description: 新获取作业的知识点分析 + * @param {*} id: + * @return {*} + */ + getKnowledgeAnalyse: ({ recordId }: anyObj) => + http.request({ + url: `/sc/job/statisticalKnowledge?recordId=${recordId}`, + ...config, + }), + + /** + * @description: 获取作业题目的知识点分析 + * @param {*} id: + * @return {*} + */ + getJobStatistics: (params: anyObj) => + http.request({ + url: '/sc/jobStu/title/statistics', + ...config, + params, + }), + + /** + * @description: 获取学科列表 + */ + getSubjectAll: () => + http.request({ + url: '/sc/subject/getList', + ...config, + }), + + /** + * @description: 获取错题本 + */ + getWrongList: (params: anyObj) => + http.request({ + url: '/sc/userErrorEdition/list', + params, + ...config, + }), + + /** + * @description: 获取错题本数量 + */ + getWrongNum: (params: anyObj) => + http.request({ + url: '/sc/userErrorEdition/getNum', + params, + ...config, + }), + + /** + * @description: 举一反三 + */ + homeWorkInferences: (params: anyObj) => + http.request({ + url: '/sc/userDrawInferences/generated', + params, + ...config, + timeout: 28000, + }), + + /** + * @description: 举一反三提交 + */ + submitHomeWorkInferences: async (data: anyObj) => { + return await post('/sc/userDrawInferences/summit', data, { ...config, timeout: 28000 }) + }, + + /** + * @description: 主观题订正错题 + */ + errorEdition: (id: any) => + http.request({ + url: '/sc/userErrorEdition/correct/' + id, + method: 'POST', + ...config, + }), + + /** + * @description: 客观题订正错题 + */ + errorEditionObjective: (params: anyObj) => + http.request({ + url: '/sc/userErrorEdition/generated', + params, + ...config, + timeout: 28000, + }), + + /** + * @description: 客观题订正错题提交 + */ + submitErrorEditionObjective: async (data: anyObj) => { + return await post('/sc/userErrorEdition/summit', data, { + ...config, + timeout: 28000, + }) + }, + + /** + * @description: 获取统计分析 + */ + getStatisticalAnalysis: (params: anyObj) => + http.request({ + url: '/sc/job/statisticalAnalysis', + params, + ...config, + }), + + /** + * @description: 获取各个学科统计分析 + */ + getStatisticalSubject: (params: anyObj) => + http.request({ + url: '/sc/job/scoringAbility', + params, + ...config, + }), + + /** + * @description: 获取各个学科知识点分析 + */ + getKnowledgeSubject: (params: anyObj) => + http.request({ + url: '/sc/job/statisticalKnowledge', + params, + ...config, + }), + + /** + * @description: 学生新增临时作业答案 + */ + uploadTemporaryJob: (data: anyObj) => + http.request({ + url: '/sc/temporaryJob', + method: 'POST', + data, + ...config, + }), + + /** + * @description: 临时作业列表 + */ + temporaryJobList: (params: anyObj) => + http.request({ + url: '/sc/temporaryJob/list', + params, + ...config, + }), + + /** + * @description: 临时作业详情 + */ + temporaryJobDetail: (id: any) => + http.request({ + url: `/sc/temporaryJob/${id}`, + ...config, + }), + + /** + * @description: 获取学科列表 + */ + getTemporarySubjectList: () => + http.request({ + url: '/sc/subject/list', + ...config, + }), + + /** + * @description: AI智能批改 + * @param {*} id 题目id + * @return {*} + */ + gradeQuestionTitleByAI: (id: string) => + http.request({ + url: `/school/paper/userRecord/gradeQuestionTitleByAI/${id}`, + method: 'POST', + ...config, + }), +} + +export default homeWorkApi diff --git a/src/api/system/mailbox.ts b/src/api/system/mailbox.ts new file mode 100644 index 0000000..24780c9 --- /dev/null +++ b/src/api/system/mailbox.ts @@ -0,0 +1,63 @@ +import { http } from '../http' + +const mailboxApi = { + // 信箱表-查询列表 + getMailList: (data: anyObj) => + http.request({ + url: '/userMessageBox/getMessageBoxListByMessageTypePage', + method: 'POST', + data, + }), + + // 信箱表-id查询 + getMailDetail: (id: any) => + http.request({ + url: '/userMessageBox/' + id, + }), + + // 根据信箱id一键领取信箱礼物 + delMail: (id: any) => + http.request({ + url: '/userMessageBox/' + id, + method: 'DELETE', + }), + + // 根据信箱id一键领取信箱礼物 + pickMail: (id: any) => + http.request({ + url: '/userMessageBox/pickUpAll/' + id, + method: 'POST', + }), + + // 一键已读-全部奖励聚合查询 + pickMailAllRewards: (data?: anyObj) => + http.request({ + url: '/userMessageBox/readWithOneButton/allRewards', + method: 'POST', + data, + }), + + // 一键已读-确认录取 + pickMailAll: (data?: anyObj) => + http.request({ + url: '/userMessageBox/readWithOneButton', + method: 'POST', + data, + }), + + // 删除已读的邮件 + delMailAll: (data?: anyObj) => + http.request({ + url: '/userMessageBox/removeReadMessageByMessageFlag', + method: 'POST', + data, + }), + + // 信箱未读提示 + getMsgRedPoint: () => + http.request({ + url: '/userMessageBox/getMsgRedPoint', + }), +} + +export default mailboxApi diff --git a/src/api/system/setting.ts b/src/api/system/setting.ts new file mode 100644 index 0000000..40e8df8 --- /dev/null +++ b/src/api/system/setting.ts @@ -0,0 +1,87 @@ +import { http } from '../http' + +interface PersonalConfigData { + oldPassword?: string + newPassword?: string + confirmPassword?: string + [key: string]: any +} + +interface CheckPasswordData { + oldPassword: string +} + +interface ChangeLoginAccData { + account: string +} + +interface DeleteDeviceRelateAccData { + id?: any + [key: string]: any +} + +const settingApi = { + /** + * 获取个人设置 + */ + getPersonalConfigApi: () => { + return http.request({ + url: '/personal/getPersonalConfig', + }) + }, + + /** + * 修改个人设置 + */ + modifyPersonalConfigApi: (data: PersonalConfigData) => { + return http.request({ + url: '/personal/modifyPersonalConfig', + method: 'PUT', + data, + }) + }, + + /** + * 检验旧密码是否输入正确 + */ + checkPasswordApi: (data: CheckPasswordData) => { + return http.request({ + url: '/personal/checkPassword', + method: 'POST', + data, + }) + }, + + /** + * 当前设备登录过的账号 + */ + getCurrentDeviceRelateAccApi: () => { + return http.request({ + url: '/personal/queryCurrentDeviceRelateAcc', + }) + }, + + /** + * 切换账号 + */ + changeLoginAccApi: (data: ChangeLoginAccData) => { + return http.request({ + url: '/personal/changeLoginAcc', + method: 'POST', + data, + }) + }, + + /** + * 删除设备关联账号 + */ + deleteDeviceRelateAccApi: (data: DeleteDeviceRelateAccData) => { + return http.request({ + url: '/userDeviceAccountRecord', + method: 'PUT', + data, + }) + }, +} + +export default settingApi diff --git a/src/api/system/user.ts b/src/api/system/user.ts new file mode 100644 index 0000000..a96dc09 --- /dev/null +++ b/src/api/system/user.ts @@ -0,0 +1,81 @@ +import { http } from '../http' + +const userApi = { + // 个人信息调整-根据标识查询用户解锁和正在使用的头像、头像框、昵称框 + getUnlockInfoByRemark: (remark: number) => + http.request({ + url: '/personal/getUnlockInfoByRemark/' + remark, + }), + + // 个人信息调整-修改个性化配置 + updatePersonalConfig: (data: anyObj) => + http.request({ + url: '/personal/updatePersonalConfig', + method: 'POST', + data, + }), + + // 个人信息调整-修改个性化配置 + updateUserSex: (data: anyObj) => + http.request({ + url: '/personal/updateUserSex', + method: 'POST', + data, + }), + + // 昵称校验检查 + nickNameCheck: (data: anyObj) => + http.request({ + url: '/userProperty/nickNameCheck', + method: 'POST', + data, + }), + + // 使用昵称修改卡道具 + useNickNameCard: (data: anyObj) => + http.request({ + url: '/userProperty/useNickNameCard', + method: 'POST', + data, + }), + + // 砖石修改昵称 + useDiamondChangeNickName: (data: anyObj) => + http.request({ + url: '/personal/useNickNameDiamond', + method: 'POST', + data, + }), + + // 兑换虚拟物品 + exchangeVirtualItem: (params: anyObj) => + http.request({ + url: '/personal/updateUnlockInfoById', + method: 'POST', + params, + }), + + // 获取成就勋章 + getPersonalMedalV2Api: () => + http.request({ + url: '/personal/getPersonalMedalV2', + }), + + // 更新学习情况 + updateUserLearn: (data: anyObj) => + http.request({ + url: '/personal/updateUserLearn', + method: 'POST', + data, + }), + + // 切换账号 + switchUser: (data: anyObj) => + http.request({ + url: '/personal/changeLoginAcc', + method: 'POST', + data, + }), +} + +export default userApi diff --git a/src/api/task.ts b/src/api/task.ts new file mode 100644 index 0000000..74e8f50 --- /dev/null +++ b/src/api/task.ts @@ -0,0 +1,75 @@ +import { get, post } from './request' + +const taskApi = { + /** + * 获取日常任务 + */ + getUserDailyTask: async (config: any): Promise => { + return await get('/taskConfig/getUserDailyTask', undefined, config) + }, + + /** + * 获取周长任务 + */ + getUserWeekTask: async (config: any): Promise => { + return await get('/taskConfig/getUserWeekTask', undefined, config) + }, + + /** + * 获取家长任务 + */ + getParentOrTeacherTask: async (config: any): Promise => { + return await get('/taskConfig/getParentOrTeacherTask/parent', undefined, config) + }, + + /** + * 获取新手任务 + */ + getNewbieTask: async (config: any): Promise => { + return await get('/taskConfig/getUserNewbieTask', undefined, config) + }, + + /** + * 获取成就任务 + */ + getUserAchievementTask: async (config: any): Promise => { + return await get('/taskConfig/getUserAchievementTask', undefined, config) + }, + + /** + * 领取每日、每周、成就任务奖品 + */ + openReward: async (data: anyObj): Promise => { + return await post('/taskConfig/openReward', data) + }, + + /** + * 领取每日、每周、成就活跃度奖品 + */ + openDynamicReward: async (data: anyObj): Promise => { + return await post('/taskConfig/openDynamicReward', data) + }, + + /** + * 领取家长、老师奖品 + */ + openParentOrTeacherReward: async (data: anyObj): Promise => { + return await post('/taskConfig/openParentOrTeacherReward', data) + }, + + /** + * 一键领取所有奖品 + */ + openAllReward: async (data: anyObj): Promise => { + return await post('/taskConfig/openAllReward', data) + }, + + /** + * 获取首页任务红点提示 + */ + getTaskRewardStatus: async (): Promise => { + return await get('/taskConfig/getTaskRewardStatus') + }, +} + +export default taskApi diff --git a/src/api/urge.ts b/src/api/urge.ts new file mode 100644 index 0000000..8147a88 --- /dev/null +++ b/src/api/urge.ts @@ -0,0 +1,166 @@ +import { http } from './http' + +const urgeApi = { + /** + * 查询督学模式列表 + */ + getInspectorModeList: () => { + return http.request({ + url: '/inspectorStudent/inspectorModeList', + }) + }, + + /** + * 查询督学服务课表信息 + */ + getUserInspectorCourseList: () => { + return http.request({ + url: '/inspectorStudent/userInspectorCourseList', + }) + }, + + /** + * 查询督学订单列表 + */ + getUserInspectorOrderList: () => { + return http.request({ + url: '/inspectorStudent/userInspectorOrderList', + }) + }, + + /* + * 查询当前学生最后一次课时信息 + */ + getLastInspectorCourseInfo: () => { + return http.request({ + url: '/inspectorStudent/lastInspectorCourseInfo', + }) + }, + + /* + * 根据督学计划id查询学习计划信息 + */ + getInspectorPlanInfo: (inspectorPlanId: number) => { + return http.request({ + url: '/inspectorStudent/inspectorPlanInfo', + params: { inspectorPlanId }, + }) + }, + + /** + * 根据订单id查询最近或最后一次课时督学师和同学信息 + */ + getInspectorTeacherStudentInfo: (orderId: number) => { + return http.request({ + url: '/inspectorStudent/inspectorTeacherStudentInfo', + params: { orderId }, + }) + }, + + /** + * 查询当前学生督学课程报告列表 + */ + getUserInspectorCourseReportList: () => { + return http.request({ + url: '/inspectorStudent/userInspectorCourseReportList', + }) + }, + + /** + * 查询历史统计报告信息 + */ + getUserHistoryStatisticsReportInfo: () => { + return http.request({ + url: '/inspectorStudent/userHistoryStatisticsReportInfo', + }) + }, + + /** + * 根据督学课时id查询督学师和同学信息 + */ + getInspectorTeacherStudentInfoByInspectorCourseId: (inspectorCourseId: number) => { + return http.request({ + url: '/inspectorStudent/inspectorTeacherStudentInfoByInspectorCourseId', + params: { inspectorCourseId }, + }) + }, + + /** + * 根据课时id查询学生督学课程报告信息 + */ + getUserInspectorCourseReportInfo: (inspectorCourseId: number) => { + return http.request({ + url: '/inspectorStudent/userInspectorCourseReportInfo', + params: { inspectorCourseId }, + }) + }, + + /** + * 查询学生今日督学计划 + */ + getUserTodayInspectorPlanInfo: () => { + return http.request({ + url: '/inspectorStudent/userTodayInspectorPlanInfo', + }) + }, + + /** + * 发送沟通消息 + */ + sendInspectorTalkRecord: (params: anyObj) => { + return http.request({ + url: '/inspectorStudent/sendInspectorTalkRecord', + method: 'post', + data: params, + }) + }, + + /** + * 根据督学计划id查询沟通记录(分页) + */ + getInspectorTalkRecordPage: (params: anyObj) => { + return http.request({ + url: '/inspectorStudent/inspectorTalkRecordPage', + params, + }) + }, + + /** + * 已读消息 + */ + readTalkRecord: (params: anyObj) => { + return http.request({ + url: '/inspectorStudent/readTalkRecord', + method: 'post', + data: params, + }) + }, + + /** + * 查询督学模式按钮数据 + */ + getInspectorButtonData: () => { + return http.request({ + url: '/inspectorStudent/inspectorButtonData', + }) + }, + + /** + * 云督学计划任务表-id查询 + */ + getInspectorPlanTask: (id: any) => { + return http.request({ + url: `/inspectorPlanTask/${id}`, + }) + }, + + // 学科章节-视频表-id查询 + getChapterVideoById: (params: anyObj) => { + return http.request({ + url: `/subjectChapterVideo/getInfo`, + params, + }) + }, +} + +export default urgeApi diff --git a/src/components/AbbrImg/index.vue b/src/components/AbbrImg/index.vue new file mode 100644 index 0000000..c7f8de1 --- /dev/null +++ b/src/components/AbbrImg/index.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/Accent/index.vue b/src/components/Accent/index.vue new file mode 100644 index 0000000..d9247ee --- /dev/null +++ b/src/components/Accent/index.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/src/components/AiText/index.scss b/src/components/AiText/index.scss new file mode 100644 index 0000000..bedaccb --- /dev/null +++ b/src/components/AiText/index.scss @@ -0,0 +1,352 @@ +$font_size: 2vh; +$margin_h: 0.83vh; +$code_bg: rgb(40, 44, 52); +$corner_radius: 4px; +$theme: #009874; +$shadow: + 0 2px 5px 0 rgba(220, 220, 220, 0.6), + 0 2px 10px 0 rgba(220, 220, 220, 0.2); +$font: Menlo, Monaco, 'Courier New', monospace; + +.markdown-body { + background-color: transparent; + font-size: $font_size; + margin-top: -1.25vh; + margin-bottom: -1.25vh; + + p, + h1, + h2, + h3, + h4, + h5, + h6, + ul, + ol, + dl, + dd, + blockquote, + pre, + code, + hr, + table, + figure { + margin: $margin_h 0; + } + + p { + white-space: pre-wrap; + } + + ol { + list-style-type: decimal; + } + + ul { + list-style-type: disc; + } + + pre code, + pre tt { + line-height: 1.65; + } + + .highlight pre, + pre { + background-color: $code_bg; + border-radius: $corner_radius; + overflow: hidden; + text-indent: 0; + + code.hljs { + padding: 0 15px; + font-size: $font_size; + color: #fff; + counter-reset: line; + + .hljs-line::before { + counter-increment: line; + content: counter(line); + display: inline-block; + width: 20px; + margin-right: 15px; + color: #999; + text-align: right; + } + } + } + + .hljs-string { + color: rgb(152, 195, 121); + } + + .hljs-keyword { + color: rgb(249, 38, 114); + } + + .hljs-comment { + color: #7f8c99; + font-style: normal; + } + + .code-block-wrapper { + position: relative; + padding-top: 3.75vh; + } + + .code-block-header { + position: absolute; + top: 0; + right: 0; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 0.01vh dashed #888; + color: #fff; + background-color: $code_bg; + + &__lang { + background-color: #424242; + padding: 0.42vh 15px; + display: inline-block; + } + + &__copy { + cursor: pointer; + margin-left: 0.5rem; + user-select: none; + background-color: #424242; + padding: 0.42vh 15px; + display: inline-block; + + &:hover { + color: $theme; + } + } + } + + div[id^='mermaid-container'] { + padding: 0.33vh; + // border-radius: 0.33vh; + margin: $margin_h 0; + // text-align: center; + overflow-x: auto !important; + // background-color: #fff; + // border: 1px solid #e5e5e5; + } + + a { + color: #576b95; + } + + h1 { + text-align: center; + line-height: 1.75; + font-family: $font; + font-size: $font_size; + display: table; + padding: 0.5em 1em; + border-bottom: 0.17vh solid $theme; + margin: 2em auto 1em; + color: hsl(var(--foreground)); + font-weight: bold; + text-shadow: 0.17vh 0.17vh 0.33vh rgba(0, 0, 0, 0.1); + margin-top: 0; + } + + h2 { + text-align: center; + line-height: 1.75; + font-family: $font; + font-size: $font_size; + display: table; + padding: 0.3em 1em; + margin: 4em auto 2em; + color: #fff; + background: $theme; + font-weight: bold; + border-radius: 0.67vh; + box-shadow: $shadow; + } + + h3 { + text-align: left; + line-height: 1.2; + font-family: $font; + font-size: $font_size; + padding-left: 12px; + padding-bottom: 0.42vh; + padding-top: 0.42vh; + border-left: 0.33vh solid $theme; + margin: 2em 8px 1em 0; + color: hsl(var(--foreground)); + font-weight: bold; + border-bottom: 0.08vh solid $theme; + } + + h4 { + display: inline-block; + border: 0.08vh solid $theme; + border-top: 0.33vh solid $theme; + padding-left: 5px; + padding-right: 5px; + } + + strong { + text-align: left; + line-height: 1.75; + font-family: $font; + font-size: inherit; + color: $theme; + font-weight: bold; + } + + ul { + text-align: left; + line-height: 1.75; + list-style: none; + font-family: $font; + padding-left: 1.5em; + margin-left: 0; + color: hsl(var(--foreground)); + + > li::before { + content: '• '; + position: absolute; + left: -27px; + } + } + + li { + text-align: left; + line-height: 1.75; + font-family: $font; + display: block; + margin: 0.5em 8px; + text-indent: 20px; + color: hsl(var(--foreground)); + position: relative; + + pre { + text-indent: 0; + } + } + + ol { + text-align: left; + line-height: 1.75; + font-family: $font; + font-size: $font_size; + padding-left: 1.5em; + margin-left: 0; + color: hsl(var(--foreground)); + counter-reset: section; /* 创建计数器 */ + + > li::before { + counter-increment: section; /* 递增计数器 */ + content: counter(section) '. '; /* 显示数字(如1.、2.) */ + position: absolute; + left: -50px; + } + } + + code { + color: rgb(221, 17, 68); + background-color: rgba(27, 31, 35, 0.05); + border-radius: 0.33vh; + padding: 0.42vh; + } + + p { + text-align: left; + line-height: 1.75; + font-family: $font; + letter-spacing: 0.1em; + color: hsl(var(--foreground)); + } + + img { + text-align: left; + line-height: 1.75; + font-size: 1.17vh; + display: block; + max-width: 100%; + margin: 0.1em auto 0.5em; + border-radius: $corner_radius; + box-shadow: $shadow; + } + + blockquote { + text-align: left; + line-height: 1.5; + font-family: $font; + padding: 1.25vh; + border-left: 0.33vh solid $theme; + border-radius: $corner_radius; + color: rgba(0, 0, 0, 0.6); + background: #e8f2fb; + margin: 1.67vh 0; + box-shadow: $shadow; + + p { + margin: 1.25vh 0; + } + } + + hr { + height: 0.08vh; + border: none; + border-top: 0.08vh solid #eee; + box-shadow: $shadow; + } + + table { + display: table; + border-collapse: separate; + box-sizing: border-box; + text-indent: initial; + unicode-bidi: isolate; + line-height: normal; + font-weight: normal; + font-size: medium; + font-style: normal; + color: -internal-quirk-inherit; + text-align: center; + border-spacing: 2px; + border-color: gray; + white-space: normal; + font-variant: normal; + + thead { + line-height: 1.75; + font-family: $font; + font-size: $font_size; + background: rgba(0, 0, 0, 0.05); + font-weight: bold; + color: #3f3f3f; + + td { + // text-align: left; + line-height: 1.75; + font-family: $font; + font-size: $font_size; + border: 0.08vh solid #dfdfdf; + padding: 0.5em 1em; + color: #3f3f3f; + word-break: keep-all; + } + } + + td { + // text-align: left; + line-height: 1.75; + font-family: $font; + font-size: $font_size; + border: 0.08vh solid #dfdfdf; + padding: 0.5em 1em; + color: #3f3f3f; + word-break: keep-all; + } + } +} diff --git a/src/components/AiText/index.vue b/src/components/AiText/index.vue new file mode 100644 index 0000000..7b469ea --- /dev/null +++ b/src/components/AiText/index.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/src/components/AiText/languages.json b/src/components/AiText/languages.json new file mode 100644 index 0000000..a8ffad0 --- /dev/null +++ b/src/components/AiText/languages.json @@ -0,0 +1,105 @@ +{ + "html": "HTML", + "txt": "TXT", + "xml": "XML", + "svg": "SVG", + "mathml": "MathML", + "css": "CSS", + "clike": "C-like", + "js": "JavaScript", + "javascript": "JavaScript", + "abap": "ABAP", + "apacheconf": "Apache Configuration", + "apl": "APL", + "arff": "ARFF", + "asciidoc": "AsciiDoc", + "adoc": "AsciiDoc", + "asm6502": "6502 Assembly", + "aspnet": "ASP.NET (C#)", + "autohotkey": "AutoHotkey", + "autoit": "AutoIt", + "basic": "BASIC", + "csharp": "C#", + "dotnet": "C#", + "cpp": "C++", + "cil": "CIL", + "csp": "Content-Security-Policy", + "css-extras": "CSS Extras", + "django": "Django/Jinja2", + "jinja2": "Django/Jinja2", + "dockerfile": "Docker", + "erb": "ERB", + "fsharp": "F#", + "gcode": "G-code", + "gedcom": "GEDCOM", + "glsl": "GLSL", + "gml": "GameMaker Language", + "gamemakerlanguage": "GameMaker Language", + "graphql": "GraphQL", + "hcl": "HCL", + "http": "HTTP", + "hpkp": "HTTP Public-Key-Pins", + "hsts": "HTTP Strict-Transport-Security", + "ichigojam": "IchigoJam", + "inform7": "Inform 7", + "javastacktrace": "Java stack trace", + "json": "JSON", + "jsonp": "JSONP", + "latex": "LaTeX", + "emacs": "Lisp", + "elisp": "Lisp", + "emacs-lisp": "Lisp", + "lolcode": "LOLCODE", + "markup-templating": "Markup templating", + "matlab": "MATLAB", + "mel": "MEL", + "n1ql": "N1QL", + "n4js": "N4JS", + "n4jsd": "N4JS", + "nand2tetris-hdl": "Nand To Tetris HDL", + "nasm": "NASM", + "nginx": "Nginx", + "nsis": "NSIS", + "objectivec": "Objective-C", + "ocaml": "OCaml", + "opencl": "OpenCL", + "parigp": "PARI/GP", + "objectpascal": "Object Pascal", + "php": "PHP", + "php-extras": "PHP Extras", + "plsql": "PL/SQL", + "powershell": "PowerShell", + "properties": ".properties", + "protobuf": "Protocol Buffers", + "q": "Q (kdb+ database)", + "jsx": "React JSX", + "tsx": "React TSX", + "renpy": "Ren'py", + "rest": "reST (reStructuredText)", + "sas": "SAS", + "sass": "Sass (Sass)", + "scss": "Sass (Scss)", + "sql": "SQL", + "soy": "Soy (Closure Template)", + "sh": "Shell", + "shell": "Shell", + "tap": "TAP", + "toml": "TOML", + "tt2": "Template Toolkit 2", + "ts": "TypeScript", + "vbnet": "VB.Net", + "vhdl": "VHDL", + "vim": "Vim", + "visual-basic": "Visual Basic", + "vb": "Visual Basic", + "wasm": "WebAssembly", + "wiki": "Wiki markup", + "xeoracube": "XeoraCube", + "xojo": "Xojo (REALbasic)", + "xquery": "XQuery", + "yaml": "YAML", + "oc": "Objective-C", + "objc": "Objective-C", + "object-c": "Objective-C", + "objective-c": "Objective-C" +} diff --git a/src/components/BackBar/index.vue b/src/components/BackBar/index.vue new file mode 100644 index 0000000..9216993 --- /dev/null +++ b/src/components/BackBar/index.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/src/components/BigTitle/index.vue b/src/components/BigTitle/index.vue new file mode 100644 index 0000000..3024c92 --- /dev/null +++ b/src/components/BigTitle/index.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/src/components/Btn/index.vue b/src/components/Btn/index.vue new file mode 100644 index 0000000..ed37509 --- /dev/null +++ b/src/components/Btn/index.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/src/components/ClozeTest/index.vue b/src/components/ClozeTest/index.vue new file mode 100644 index 0000000..4e87ddc --- /dev/null +++ b/src/components/ClozeTest/index.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/src/components/ConfirmDia/index.vue b/src/components/ConfirmDia/index.vue new file mode 100644 index 0000000..a3cfb08 --- /dev/null +++ b/src/components/ConfirmDia/index.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/src/components/DifficultyStart/index.vue b/src/components/DifficultyStart/index.vue new file mode 100644 index 0000000..6d7b021 --- /dev/null +++ b/src/components/DifficultyStart/index.vue @@ -0,0 +1,186 @@ + + + diff --git a/src/components/Empty/index.vue b/src/components/Empty/index.vue new file mode 100644 index 0000000..63348f6 --- /dev/null +++ b/src/components/Empty/index.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/src/components/EnlargePicture/index.vue b/src/components/EnlargePicture/index.vue new file mode 100644 index 0000000..066ffaf --- /dev/null +++ b/src/components/EnlargePicture/index.vue @@ -0,0 +1,213 @@ + + + + + diff --git a/src/components/Horn/index.vue b/src/components/Horn/index.vue new file mode 100644 index 0000000..e834255 --- /dev/null +++ b/src/components/Horn/index.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/components/HornC.vue b/src/components/HornC.vue new file mode 100644 index 0000000..8fa1657 --- /dev/null +++ b/src/components/HornC.vue @@ -0,0 +1,66 @@ + + + diff --git a/src/components/Icon/index.vue b/src/components/Icon/index.vue new file mode 100644 index 0000000..411e2e7 --- /dev/null +++ b/src/components/Icon/index.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/components/ImageCropper/index.vue b/src/components/ImageCropper/index.vue new file mode 100644 index 0000000..1044efa --- /dev/null +++ b/src/components/ImageCropper/index.vue @@ -0,0 +1,261 @@ + + + + + diff --git a/src/components/ImgBg/index.vue b/src/components/ImgBg/index.vue new file mode 100644 index 0000000..5ec3ba4 --- /dev/null +++ b/src/components/ImgBg/index.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/src/components/ImgView/index.vue b/src/components/ImgView/index.vue new file mode 100644 index 0000000..80a4efb --- /dev/null +++ b/src/components/ImgView/index.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/components/ItemPopover/index.vue b/src/components/ItemPopover/index.vue new file mode 100644 index 0000000..3ab4d93 --- /dev/null +++ b/src/components/ItemPopover/index.vue @@ -0,0 +1,178 @@ + + + diff --git a/src/components/LazyLoad.vue b/src/components/LazyLoad.vue new file mode 100644 index 0000000..56f60c8 --- /dev/null +++ b/src/components/LazyLoad.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/components/LineFont/index.vue b/src/components/LineFont/index.vue new file mode 100644 index 0000000..2b850a8 --- /dev/null +++ b/src/components/LineFont/index.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/components/PostLoad/index.vue b/src/components/PostLoad/index.vue new file mode 100644 index 0000000..a2265a4 --- /dev/null +++ b/src/components/PostLoad/index.vue @@ -0,0 +1,85 @@ + + + + diff --git a/src/components/ProgressBar/index.vue b/src/components/ProgressBar/index.vue new file mode 100644 index 0000000..4fd804a --- /dev/null +++ b/src/components/ProgressBar/index.vue @@ -0,0 +1,98 @@ + + + diff --git a/src/components/RewardDia/index.vue b/src/components/RewardDia/index.vue new file mode 100644 index 0000000..f9fbdfa --- /dev/null +++ b/src/components/RewardDia/index.vue @@ -0,0 +1,133 @@ + + + + diff --git a/src/components/Select/index.vue b/src/components/Select/index.vue new file mode 100644 index 0000000..1cc5c7b --- /dev/null +++ b/src/components/Select/index.vue @@ -0,0 +1,243 @@ + + + + + diff --git a/src/components/SelectTab/index.vue b/src/components/SelectTab/index.vue new file mode 100644 index 0000000..b4675a1 --- /dev/null +++ b/src/components/SelectTab/index.vue @@ -0,0 +1,81 @@ + + + + diff --git a/src/components/ShowLottie/ShowLottie.vue b/src/components/ShowLottie/ShowLottie.vue new file mode 100644 index 0000000..1148376 --- /dev/null +++ b/src/components/ShowLottie/ShowLottie.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/src/components/ShowLottie/type.ts b/src/components/ShowLottie/type.ts new file mode 100644 index 0000000..5860e3a --- /dev/null +++ b/src/components/ShowLottie/type.ts @@ -0,0 +1,15 @@ +type Segment = [number, number] + +export interface LottieEvent { + play: () => void // 播放 + stop: () => void // 停止 + setSpeed: (speed: number) => void // 设置播放速度(speed: 1表示正常速度) + setDirection: (direction: 1 | -1) => void // 设置播放方向(direction:1 表示正向,-1 表示反向) + goToAndStop: (value: number, isFrame?: boolean) => void // 跳到某个时刻/帧并停止(value:数值;isFrame:定义第一个参数是基于时间的值还是基于帧的值(默认为 false)) + goToAndPlay: (value: number, isFrame?: boolean) => void // 跳到某个时刻/帧并播放(value:数值;isFrame:定义第一个参数是基于时间的值还是基于帧的值(默认为 false)) + playSegments: (segments: Segment | Segment[], forceFlag?: boolean) => void // 播放片段(segments:数组。可以包含 2 个数值,这些数值将用作动画的第一帧和最后一帧。或者可以包含一系列数组,每个数组具有 2 个数值;forceFlag:布尔。如果设置为 false,它将等待当前段完成。如果为 true,它将立即更新值。) + destroy: () => void // 销毁 + getDuration: (inFrames: boolean) => void // 获取动画一个周期时间(inFrames:如果为 true,则以帧为单位返回持续时间,如果为 false,则以秒为单位。) + + [propname: string]: any +} diff --git a/src/components/Sidebar/index.vue b/src/components/Sidebar/index.vue new file mode 100644 index 0000000..d1703ad --- /dev/null +++ b/src/components/Sidebar/index.vue @@ -0,0 +1,161 @@ + + + diff --git a/src/components/SignaturePad/index.vue b/src/components/SignaturePad/index.vue new file mode 100644 index 0000000..5abd7d7 --- /dev/null +++ b/src/components/SignaturePad/index.vue @@ -0,0 +1,211 @@ + + + diff --git a/src/components/SimpleTable/index.vue b/src/components/SimpleTable/index.vue new file mode 100644 index 0000000..8aebae4 --- /dev/null +++ b/src/components/SimpleTable/index.vue @@ -0,0 +1,95 @@ + + + diff --git a/src/components/Table/column/index.vue b/src/components/Table/column/index.vue new file mode 100644 index 0000000..70788c5 --- /dev/null +++ b/src/components/Table/column/index.vue @@ -0,0 +1,22 @@ + diff --git a/src/components/Table/index.vue b/src/components/Table/index.vue new file mode 100644 index 0000000..cb465c9 --- /dev/null +++ b/src/components/Table/index.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/src/components/Table/render/index.vue b/src/components/Table/render/index.vue new file mode 100644 index 0000000..b7d8dc8 --- /dev/null +++ b/src/components/Table/render/index.vue @@ -0,0 +1,21 @@ + diff --git a/src/components/UrmLoad/index.vue b/src/components/UrmLoad/index.vue new file mode 100644 index 0000000..b89e41e --- /dev/null +++ b/src/components/UrmLoad/index.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/src/components/UrmLoad/urmUrl.json b/src/components/UrmLoad/urmUrl.json new file mode 100644 index 0000000..53ceb6f --- /dev/null +++ b/src/components/UrmLoad/urmUrl.json @@ -0,0 +1,119 @@ +{ + "urls": [ + "/subject/book_shelf_left.svg", + "/subject/book_shelf_top.svg", + "/subject/book_shelf_bottom.svg", + + "/urm/bg_home.svg", + "/urm/bg_login.svg", + "/urm/book_bg.svg", + "/urm/mail_bg.svg", + "/urm/main_bg.svg", + "/urm/urm_load_bg.png", + "/urm/subject_target_dia_bg.svg", + + "/urm/ip_boy.png", + "/urm/ip_girl.png", + + "/icon/nav_activity.svg", + "/icon/nav_analysis.svg", + "/icon/nav_mailbox.svg", + "/icon/nav_notice.svg", + "/icon/nav_ranking.svg", + "/icon/nav_setting.svg", + "/icon/nav_homeWork.svg", + + "/urm/home_app.png", + "/urm/home_subject.png", + "/urm/home_task.png", + "/urm/home_urge.png", + "/urm/home_english.png", + + "/icon/diamond.svg", + "/icon/coin.svg", + "/icon/warning.svg", + "/icon/gender_1.svg", + "/icon/gender_2.svg", + "/icon/close_dia.svg", + "/icon/left_arrow.svg", + "/icon/mail_open.svg", + "/icon/open_switch.svg", + "/icon/close_switch.svg", + "/icon/leaf_solid.svg", + "/icon/thumbs.svg", + + "/icon/vip_level_1.svg", + "/icon/vip_level_10.svg", + "/icon/vip_level_11.svg", + "/icon/vip_level_12.svg", + "/icon/vip_level_13.svg", + "/icon/vip_level_14.svg", + "/icon/vip_level_15.svg", + "/icon/vip_level_16.svg", + "/icon/vip_level_17.svg", + "/icon/vip_level_18.svg", + "/icon/vip_level_19.svg", + "/icon/vip_level_2.svg", + "/icon/vip_level_20.svg", + "/icon/vip_level_3.svg", + "/icon/vip_level_4.svg", + "/icon/vip_level_5.svg", + "/icon/vip_level_6.svg", + "/icon/vip_level_7.svg", + "/icon/vip_level_8.svg", + "/icon/vip_level_9.svg", + + "/urm/userInfo_center_bg.png", + "/urm/btn_primary_left.svg", + "/urm/btn_primary_right.svg", + + "/urm/empty_activity.svg", + "/urm/empty_announcement.svg", + "/urm/empty_course.svg", + "/urm/empty_dev.svg", + "/urm/empty_email.svg", + "/urm/empty_goods.svg", + "/urm/empty_knowledge.png", + "/urm/empty_learn.svg", + "/urm/empty_network.svg", + "/urm/empty_practice.svg", + "/urm/empty_rank.svg", + "/urm/empty_report.svg", + "/urm/empty_search.svg", + "/urm/empty_task.svg", + "/urm/empty_test.svg", + + "/urm/sidebar_item_active.png", + "/urm/sidebar_item.svg", + "/urm/header_bg.svg", + "/urm/subject_item_pattern.svg", + + "/urm/textbook_tool_ziyouxue.png", + "/urm/textbook_tool_aijingzhunxue.png", + "/urm/textbook_tool_cuotiben.png", + "/urm/textbook_tool_ziyouzujuan.png", + "/urm/ranking_bg_thumbs.svg", + + "/urm/subject_dili.png", + "/urm/subject_fazhi.png", + "/urm/subject_huaxue.png", + "/urm/subject_item_pattern.svg", + "/urm/subject_kexue.png", + "/urm/subject_lishi.png", + "/urm/subject_shengwu.png", + "/urm/subject_shuxue.png", + "/urm/subject_target_dia_bg.svg", + "/urm/subject_wuli.png", + "/urm/subject_yingyu.png", + "/urm/subject_yuwen.png", + "/urm/subject_zhengzhi.png", + + "/urm/task-yilingqu.png", + "/urm/task-kelingqu.png", + "/urm/task-normal.png", + "/urm/task_achievement.svg", + "/urm/task_day.svg", + "/urm/task_parent.svg", + "/urm/task_lead.svg" + ] +} diff --git a/src/components/UserCenterDia/components/UserCenterSidebar.vue b/src/components/UserCenterDia/components/UserCenterSidebar.vue new file mode 100644 index 0000000..60a53c6 --- /dev/null +++ b/src/components/UserCenterDia/components/UserCenterSidebar.vue @@ -0,0 +1,128 @@ + + + diff --git a/src/components/UserCenterDia/index.vue b/src/components/UserCenterDia/index.vue new file mode 100644 index 0000000..636302f --- /dev/null +++ b/src/components/UserCenterDia/index.vue @@ -0,0 +1,949 @@ + + + + diff --git a/src/components/UserHead/index.vue b/src/components/UserHead/index.vue new file mode 100644 index 0000000..72c9534 --- /dev/null +++ b/src/components/UserHead/index.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/src/components/VideoPlayer/index.vue b/src/components/VideoPlayer/index.vue new file mode 100644 index 0000000..e73b830 --- /dev/null +++ b/src/components/VideoPlayer/index.vue @@ -0,0 +1,339 @@ + + + diff --git a/src/components/WinningStreakAnimation.vue b/src/components/WinningStreakAnimation.vue new file mode 100644 index 0000000..d718089 --- /dev/null +++ b/src/components/WinningStreakAnimation.vue @@ -0,0 +1,70 @@ + + + diff --git a/src/components/WrongQuesItem/OptionsList.vue b/src/components/WrongQuesItem/OptionsList.vue new file mode 100644 index 0000000..920a626 --- /dev/null +++ b/src/components/WrongQuesItem/OptionsList.vue @@ -0,0 +1,52 @@ + + + diff --git a/src/components/WrongQuesItem/index.vue b/src/components/WrongQuesItem/index.vue new file mode 100644 index 0000000..4df9be1 --- /dev/null +++ b/src/components/WrongQuesItem/index.vue @@ -0,0 +1,394 @@ + + + diff --git a/src/components/XAe/index.vue b/src/components/XAe/index.vue new file mode 100644 index 0000000..c3e3015 --- /dev/null +++ b/src/components/XAe/index.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/src/components/XDia/index.vue b/src/components/XDia/index.vue new file mode 100644 index 0000000..ea93f91 --- /dev/null +++ b/src/components/XDia/index.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/src/components/XLDia/index.vue b/src/components/XLDia/index.vue new file mode 100644 index 0000000..d8ea4ab --- /dev/null +++ b/src/components/XLDia/index.vue @@ -0,0 +1,141 @@ + + + diff --git a/src/components/XStatusDia/index.vue b/src/components/XStatusDia/index.vue new file mode 100644 index 0000000..fae1037 --- /dev/null +++ b/src/components/XStatusDia/index.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/components/XTree/index.ts b/src/components/XTree/index.ts new file mode 100644 index 0000000..4cdcf4e --- /dev/null +++ b/src/components/XTree/index.ts @@ -0,0 +1,13 @@ +export const state_checked = 1 +export const state_unchecked = 0 +export const state_indeterminate = 2 + +export function getCheckboxIcon(state: any) { + if (state === state_checked) { + return 'checkbox_checked.png' + } else if (state === state_indeterminate) { + return 'checkbox_indeterminate.png' + } else { + return 'checkbox_unchecked.png' + } +} diff --git a/src/components/XTree/index.vue b/src/components/XTree/index.vue new file mode 100644 index 0000000..76290f5 --- /dev/null +++ b/src/components/XTree/index.vue @@ -0,0 +1,239 @@ + + + + + diff --git a/src/components/XTree/item.vue b/src/components/XTree/item.vue new file mode 100644 index 0000000..e9b5bb9 --- /dev/null +++ b/src/components/XTree/item.vue @@ -0,0 +1,100 @@ + + + + diff --git a/src/components/board-bg/index.vue b/src/components/board-bg/index.vue new file mode 100644 index 0000000..1f02202 --- /dev/null +++ b/src/components/board-bg/index.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/src/components/book-select/index.ts b/src/components/book-select/index.ts new file mode 100644 index 0000000..1caf490 --- /dev/null +++ b/src/components/book-select/index.ts @@ -0,0 +1,2 @@ +export const book_select_practice = 0 +export const book_select_video = 1 diff --git a/src/components/book-select/index.vue b/src/components/book-select/index.vue new file mode 100644 index 0000000..f36e6f1 --- /dev/null +++ b/src/components/book-select/index.vue @@ -0,0 +1,641 @@ + + + + + diff --git a/src/components/book-shelf/index.vue b/src/components/book-shelf/index.vue new file mode 100644 index 0000000..2d08884 --- /dev/null +++ b/src/components/book-shelf/index.vue @@ -0,0 +1,360 @@ + + + + + diff --git a/src/components/card/number-card/index.vue b/src/components/card/number-card/index.vue new file mode 100644 index 0000000..fc23fdf --- /dev/null +++ b/src/components/card/number-card/index.vue @@ -0,0 +1,184 @@ + + + diff --git a/src/components/card/right-rate-card/index.vue b/src/components/card/right-rate-card/index.vue new file mode 100644 index 0000000..0ad8b07 --- /dev/null +++ b/src/components/card/right-rate-card/index.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/src/components/chapter-list/index.vue b/src/components/chapter-list/index.vue new file mode 100644 index 0000000..a57a0e6 --- /dev/null +++ b/src/components/chapter-list/index.vue @@ -0,0 +1,464 @@ + + + + + + + diff --git a/src/components/heart-bg/index.vue b/src/components/heart-bg/index.vue new file mode 100644 index 0000000..800af14 --- /dev/null +++ b/src/components/heart-bg/index.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/src/components/keyboard/index.ts b/src/components/keyboard/index.ts new file mode 100644 index 0000000..20c4ff4 --- /dev/null +++ b/src/components/keyboard/index.ts @@ -0,0 +1,2 @@ +export const key_space_value = ' ' +export const key_space_name = 'space' diff --git a/src/components/keyboard/index.vue b/src/components/keyboard/index.vue new file mode 100644 index 0000000..2aa21ed --- /dev/null +++ b/src/components/keyboard/index.vue @@ -0,0 +1,323 @@ + + + diff --git a/src/components/keyboard/keyboard-item.vue b/src/components/keyboard/keyboard-item.vue new file mode 100644 index 0000000..60a5760 --- /dev/null +++ b/src/components/keyboard/keyboard-item.vue @@ -0,0 +1,292 @@ + + + + + diff --git a/src/components/latex-text/index.vue b/src/components/latex-text/index.vue new file mode 100644 index 0000000..cb1c0a9 --- /dev/null +++ b/src/components/latex-text/index.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/components/memory-tips/index.vue b/src/components/memory-tips/index.vue new file mode 100644 index 0000000..ebbf7e7 --- /dev/null +++ b/src/components/memory-tips/index.vue @@ -0,0 +1,125 @@ + + + + + + + diff --git a/src/components/mj/mj-button/index.vue b/src/components/mj/mj-button/index.vue new file mode 100644 index 0000000..76276b8 --- /dev/null +++ b/src/components/mj/mj-button/index.vue @@ -0,0 +1,204 @@ + + + + + diff --git a/src/components/mj/mj-check-group/index.vue b/src/components/mj/mj-check-group/index.vue new file mode 100644 index 0000000..fa1af91 --- /dev/null +++ b/src/components/mj/mj-check-group/index.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/src/components/mj/mj-check/index.vue b/src/components/mj/mj-check/index.vue new file mode 100644 index 0000000..97e6643 --- /dev/null +++ b/src/components/mj/mj-check/index.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/components/mj/mj-date-picker/index.vue b/src/components/mj/mj-date-picker/index.vue new file mode 100644 index 0000000..d8cfb28 --- /dev/null +++ b/src/components/mj/mj-date-picker/index.vue @@ -0,0 +1,217 @@ + + + + + diff --git a/src/components/mj/mj-dialog/index.ts b/src/components/mj/mj-dialog/index.ts new file mode 100644 index 0000000..4e9566a --- /dev/null +++ b/src/components/mj/mj-dialog/index.ts @@ -0,0 +1,77 @@ +import { createApp } from 'vue' +import MjDialog, { type MjDialogOptions } from './index.vue' +import { loading, LoadOptions as LoadingLoadOptions } from '../mj-loading' +import obj from '@/utils/obj' + +let dialogMap: Record = {} + +type LoadOptions = { + dialog: MjDialogOptions | string +} & LoadingLoadOptions + +function createDialog(): any { + const container = document.createElement('div') + const _destroy = () => { + app.unmount() + document.body.removeChild(container) + delete dialogMap[dialog._snowflakeId] + } + const app = createApp(MjDialog, { + modelValue: false, + js_destroy: _destroy, + }) + const dialog = app.mount(container) as any + dialog._snowflakeId = obj.snowflakeId() + document.body.appendChild(container) + dialogMap[dialog._snowflakeId] = dialog + return dialog +} + +export const dialog = { + isShowing() { + return Object.keys(dialogMap)?.length + }, + show(data?: MjDialogOptions) { + const dialog = createDialog() + dialog.show(data) + return dialog._snowflakeId + }, + hide(snowflakeId?: any) { + if (snowflakeId) { + const dialog = dialogMap[snowflakeId] + if (dialog) { + dialog.hide() + delete dialogMap[snowflakeId] + } + } else { + for (const id in dialogMap) { + dialogMap[id].hide() + } + dialogMap = {} + } + }, + async load(options: LoadOptions) { + return new Promise((resolve, reject) => { + let dialogOptions = options.dialog + if (typeof dialogOptions === 'string') { + dialogOptions = { + content: dialogOptions, + } + } + dialog.show({ + ...dialogOptions, + ok: async () => { + try { + const res = await loading.load(options) + resolve(true) + return res + } catch (err) { + reject(err) + // 不关闭窗口 + return true + } + }, + }) + }) + }, +} diff --git a/src/components/mj/mj-dialog/index.vue b/src/components/mj/mj-dialog/index.vue new file mode 100644 index 0000000..39b1461 --- /dev/null +++ b/src/components/mj/mj-dialog/index.vue @@ -0,0 +1,318 @@ + + + + + + diff --git a/src/components/mj/mj-grid/index.vue b/src/components/mj/mj-grid/index.vue new file mode 100644 index 0000000..ec0cc09 --- /dev/null +++ b/src/components/mj/mj-grid/index.vue @@ -0,0 +1,254 @@ + + + + + diff --git a/src/components/mj/mj-loading/index.ts b/src/components/mj/mj-loading/index.ts new file mode 100644 index 0000000..c7be460 --- /dev/null +++ b/src/components/mj/mj-loading/index.ts @@ -0,0 +1,79 @@ +import { createApp } from 'vue' +import MjLoading, { type MjLoadingOptions } from './index.vue' +import hud from '@/utils/hud' + +let loadingInstance: any = null +type ShowOptions = MjLoadingOptions | string +export type LoadOptions = { + loading?: ShowOptions + task: () => Promise + option?: string + hideSuccess?: boolean + hideError?: boolean +} + +const isShowing = () => { + return loadingInstance?.isShowing() +} + +const show = (data?: ShowOptions) => { + if (!loadingInstance) { + const container = document.createElement('div') + const app = createApp(MjLoading) + loadingInstance = app.mount(container) + document.body.appendChild(container) + } + loadingInstance.show(data) +} + +const hide = () => { + if (loadingInstance) { + loadingInstance.hide() + } +} + +const load = async (options: LoadOptions) => { + let loadingContent = '加载中...' + let successContent = '操作成功!' + let errorContent = '操作失败!' + if (options.option) { + loadingContent = `${options.option}中...` + successContent = `${options.option}成功!` + errorContent = `${options.option}失败!` + } + let showOptions = options.loading + if (!showOptions) { + showOptions = loadingContent + } + show(showOptions) + + // 默认不想 + + try { + const res = await options.task() + !options.hideSuccess && hud.success(successContent) + // 返回出去 + return res + } catch (err: any) { + if (err) { + if (typeof err === 'string') { + errorContent += `${err}` + } else if (err.message) { + errorContent += `${err.message}` + } + } + if (!err?.showed) { + !options.hideError && hud.error(errorContent) + } + throw err + } finally { + hide() + } +} + +export const loading = { + isShowing, + show, + hide, + load, +} diff --git a/src/components/mj/mj-loading/index.vue b/src/components/mj/mj-loading/index.vue new file mode 100644 index 0000000..8738a0d --- /dev/null +++ b/src/components/mj/mj-loading/index.vue @@ -0,0 +1,231 @@ + + + + + + diff --git a/src/components/mj/mj-radio/index.vue b/src/components/mj/mj-radio/index.vue new file mode 100644 index 0000000..7bd8120 --- /dev/null +++ b/src/components/mj/mj-radio/index.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/components/mj/mj-table/const.ts b/src/components/mj/mj-table/const.ts new file mode 100644 index 0000000..ad4daa4 --- /dev/null +++ b/src/components/mj/mj-table/const.ts @@ -0,0 +1,42 @@ +import type { + VxeGridEventProps, + VxeGridProps, + VxeFormEventProps, + VxeFormProps, + VxeModalProps, +} from 'vxe-table' + +export const mj_form_input = 'VxeInput' +export const mj_form_select = 'VxeSelect' +export const mj_form_date = 'VxeDatePicker' +export const mj_form_button_group = 'VxeButtonGroup' +export const mj_form_radio_group = 'VxeRadioGroup' + +export const mj_action_add = 1 +export const mj_action_update = 2 +export const mj_action_remove = 3 + +export type MjFormProps = VxeFormProps +export type MjFormEventProps = VxeFormEventProps +export type MjGridProps = VxeGridProps & { + afterLoadData?: (data: any) => any + beforeLoadData?: (params: any) => any + loadData?: ( + currentPage: any, + pageSize: any, + params: any, + ) => Promise<{ + rows: any[] + totalRows: number + }> + afterReset?: () => void +} +export type MjGridEventProps = VxeGridEventProps +export type MjModalProps = VxeModalProps +export type MjEditFormProps = { + form: MjFormProps + modal?: MjModalProps + updateFields: string[] + defaultFormData?: any + beforeSaveOrUpdate?: (data: any) => any +} diff --git a/src/components/mj/mj-table/fmt.ts b/src/components/mj/mj-table/fmt.ts new file mode 100644 index 0000000..808b5f4 --- /dev/null +++ b/src/components/mj/mj-table/fmt.ts @@ -0,0 +1,52 @@ +import num from '@/utils/num' +import { VxeUI } from 'vxe-pc-ui' +import XEUtils from 'xe-utils' +import dayjs from '@/plugins/dayjs' + +export const pattern_kg = '^\\d+(\\.\\d{1,3})?$' +export const pattern_int = '^[1-9]\\d*$' + +// 格式化日期,默认 yyyy-MM-dd HH:mm:ss +VxeUI.formats.add('date-time', { + cellFormatMethod({ cellValue }, format) { + return XEUtils.toDateString(cellValue, format || 'yyyy-MM-dd HH:mm:ss') + }, +}) + +VxeUI.formats.add('money', { + cellFormatMethod({ cellValue }) { + return num.formatMoney(cellValue) + }, +}) + +VxeUI.formats.add('date', { + cellFormatMethod({ cellValue }, format) { + return XEUtils.toDateString(cellValue, format || 'yyyy-MM-dd') + }, +}) + +VxeUI.formats.add('timeGap', { + cellFormatMethod({ cellValue }) { + return dayjs(cellValue).fromNow() + }, +}) + +VxeUI.formats.add('trimZero', { + cellFormatMethod({ cellValue }) { + return num.trimZero(cellValue) + }, +}) + +// 保留2位小数 +VxeUI.formats.add('fixed2', { + cellFormatMethod({ cellValue }) { + return num.toFixed2(Number(cellValue)) + }, +}) + +// 数字变百分比 +VxeUI.formats.add('num2percent', { + cellFormatMethod({ cellValue }) { + return num.toPercent(cellValue) + }, +}) diff --git a/src/components/mj/mj-table/index.scss b/src/components/mj/mj-table/index.scss new file mode 100644 index 0000000..cbe001f --- /dev/null +++ b/src/components/mj/mj-table/index.scss @@ -0,0 +1,351 @@ +@use '../../../styles/variate.scss' as *; + +$border-color: rgb(240, 242, 245, 0.9); +$border-radius: 1.67vh; +$fz: 2.33vh; +$family: $font-text; +$title-family: $font-special; +$cell_h: 7vh; +$color: #4b4b68; +// $header_bg: #4de798; //#a0fcf8; +// $row_selected_bg: #a0fcf8; // #ffebbc; + +$header_bg: #ccefff; //#a0fcf8; +$row_selected_bg: #ebf9ff; // #ffebbc; +$check_bg: #a2fb6e; + +.mj-table { + height: 100% !important; + :deep(.vxe-grid) { + // height: 100% !important; + background-color: transparent; + padding: 0; + + .vxe-body--x-space, + .vxe-body--y-space, + // 隐藏滚动条 + .vxe-table--scroll-y-virtual, + .vxe-table--border-line { + display: none; + } + + // checkbox + .col--checkbox { + $i_wh: 3.33vh; + $i_border: 0.25vh; + $i_inner: 2.83vh; + + &.vxe-body--column, + &.vxe-header--column { + display: flex; + justify-content: center; + } + + .vxe-cell { + width: $cell_h !important; + } + .vxe-cell--wrapper { + display: flex; + align-items: center; + justify-content: center; + } + + .custom-checkbox { + display: flex; + align-items: center; + justify-content: center; + + position: relative; + width: $i_wh; + height: $i_wh; + border-radius: 50% !important; /* 圆形样式 */ + background: rgba(0, 0, 0, 0.65); + border: $i_border solid $check_bg; + + i { + $before_hx: 0.33vh; + $before_top: 1.25vh; + $before_lr: 0.5vh; + &::before { + display: none; + } + + position: absolute; + transition: width 0.15s ease-in 0.05s; + + &.vxe-icon-square-checked-fill { + left: 0.92vh; + top: 0.42vh; + width: 0.67vh; + height: 1.25vh; + border: 0.25vh solid $check_bg; + border-left: 0; + border-top: 0; + box-sizing: content-box; + transform: rotate(45deg); + } + + &.vxe-icon-square-minus-fill { + height: $before_hx; + left: $before_lr; + right: $before_lr; + top: $before_top; + background-color: $check_bg; + } + } + } + } + + // 被选中的行 + .row--checked { + .vxe-body--column { + background-color: $row_selected_bg; + } + } + + &.is--loading { + &::before { + content: none; + } + + .vxe-grid--pager-wrapper { + :disabled { + opacity: 0.5; + } + // visibility: hidden; + } + } + + .vxe-table--render-default { + color: $color; + } + + .vxe-grid--layout-header-wrapper { + background-color: #fff; + border-radius: $border-radius; + overflow: hidden; + padding: 0 8px; + + .vxe-form { + background-color: transparent !important; + } + } + + .vxe-grid--layout-body-content-wrapper { + display: flex; + flex-direction: column; + justify-content: space-between; + height: 100% !important; + + .vxe-grid--toolbar-wrapper { + .vxe-toolbar { + background-color: transparent !important; + padding: 1.25vh 0 !important; + } + } + + .vxe-grid--table-container { + flex: 1; + border-radius: $border-radius; + overflow: hidden; + // border-top-left-radius: $border-radius; + // border-top-right-radius: $border-radius; + + .vxe-table { + overflow: visible; + height: 100%; + .vxe-cell { + min-height: $cell_h !important; + height: $cell_h !important; + line-height: $cell_h; + font-size: $fz; + text-align: center; + font-family: $family; + color: $color; + .vxe-cell--wrapper { + overflow: visible; + } + } + + .vxe-table--empty-content { + font-size: 3vh; + font-family: $family; + } + + .vxe-table--header-inner-wrapper { + height: $cell_h !important; + + .vxe-header--column { + background-image: none; + .vxe-cell { + font-family: $title-family; + } + } + } + + .vxe-header--column, + .vxe-table--scroll-y-top-corner { + // color: #323233; + background-color: $header_bg !important; + } + + // .vxe-table--scroll-y-top-corner:before, + // .vxe-table--scroll-y-wrapper:after { + // // border-color: $border-color !important; + // border: none !important; + // } + + .vxe-body--column { + background-image: + linear-gradient($border-color, $border-color), + linear-gradient($border-color, $border-color) !important; + } + } + } + + .vxe-grid--pager-wrapper { + background-color: transparent !important; + + $btn_w: 64px; + $btn_h: 5.33vh; + $btn_gap: 8px; + $radius: 8px; + $shadow: 0 4px 4px rgba(0, 0, 0, 0.25); + $btn_bg: rgba(0, 0, 0, 0.65); + $icon_color: #4de798; + + // 悬浮框 + .vxe-select--panel { + bottom: 5.83vh !important; + .vxe-select--panel-wrapper { + background-color: rgba(0, 0, 0, 0.65); + .vxe-select-option--wrapper { + max-height: inherit; + } + + .vxe-select-option { + color: #ccd4d4; + font-size: 2.17vh; + height: 5vh; + display: flex; + align-items: center; + justify-content: center; + + &.is--selected { + background-color: $icon_color; + // background: linear-gradient(249deg, #4de798 26.9%, #a2fb6e 79.86%); + color: $color; + } + } + } + } + + .vxe-pager { + margin-top: 1.25vh; + background-color: transparent !important; + height: 6.16vh; + + .vxe-pager--wrapper { + display: flex; + align-items: center; + justify-content: flex-end; + column-gap: $btn_gap; + + .vxe-pager--sizes, + .vxe-pager--jump { + // width: 9em !important; + margin: 0 20px; + } + + .vxe-pager--goto-text, + .vxe-pager--classifier-text, + .vxe-pager--count, + .vxe-pager--total { + font-size: $fz; + font-family: $family; + color: rgb(75, 75, 104, 0.65); + } + + i { + color: $icon_color !important; + font-weight: bolder; + } + + .vxe-select { + border-radius: $radius; + box-shadow: $shadow; + font-family: $family; + background-color: $btn_bg; + width: 200px; + + .vxe-input { + font-family: $family; + background-color: transparent !important; + font-size: $fz; + height: $btn_h; + // width: 250px; + input { + color: #fff !important; + // width: 150px; + } + + .vxe-input--wrapper, + .vxe-input--suffix { + background-color: transparent !important; + } + } + } + + .vxe-pager--jump .vxe-input { + margin: 0 10px; + background-color: #fff !important; + input { + color: $color !important; + } + } + + .vxe-pager--jump .vxe-input, + button { + font-size: $fz; + width: $btn_w; + height: $btn_h; + border-radius: $radius; + box-shadow: $shadow; + font-family: $family; + background-color: $btn_bg; + + &.is--disabled { + box-shadow: none; + i { + color: #bfbfbf !important; + } + } + + &.vxe-pager--num-btn { + $border_w: 0.33vh; + color: $color; + background-color: #fff; + border: $border_w solid #fff; + line-height: 4.67vh; + &.is--active { + background-color: $icon_color; + box-shadow: none; + } + } + } + } + + button:not(.is--disabled) { + // background-color: $primary-color; + color: #fff; + } + } + } + } + } +} +.hideToolbar { + :deep(.vxe-grid--toolbar-wrapper) { + display: none; + } +} diff --git a/src/components/mj/mj-table/index.ts b/src/components/mj/mj-table/index.ts new file mode 100644 index 0000000..64f8b49 --- /dev/null +++ b/src/components/mj/mj-table/index.ts @@ -0,0 +1,5 @@ +import MjTable from './index.vue' +import './fmt' + +export default MjTable +export * from './const' diff --git a/src/components/mj/mj-table/index.vue b/src/components/mj/mj-table/index.vue new file mode 100644 index 0000000..df83cc1 --- /dev/null +++ b/src/components/mj/mj-table/index.vue @@ -0,0 +1,585 @@ + + + + + diff --git a/src/components/new-progress-bar/index.vue b/src/components/new-progress-bar/index.vue new file mode 100644 index 0000000..46e78c3 --- /dev/null +++ b/src/components/new-progress-bar/index.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/components/pagination/index.vue b/src/components/pagination/index.vue new file mode 100644 index 0000000..21f46ea --- /dev/null +++ b/src/components/pagination/index.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/components/question/Question.vue b/src/components/question/Question.vue new file mode 100644 index 0000000..549d049 --- /dev/null +++ b/src/components/question/Question.vue @@ -0,0 +1,1504 @@ + + + + diff --git a/src/components/question/answer/CameraPreview.vue b/src/components/question/answer/CameraPreview.vue new file mode 100644 index 0000000..b955fd1 --- /dev/null +++ b/src/components/question/answer/CameraPreview.vue @@ -0,0 +1,303 @@ + + + + + diff --git a/src/components/question/answer/ClozeTest.vue b/src/components/question/answer/ClozeTest.vue new file mode 100644 index 0000000..15472f8 --- /dev/null +++ b/src/components/question/answer/ClozeTest.vue @@ -0,0 +1,166 @@ + + + diff --git a/src/components/question/answer/CompositeStem.vue b/src/components/question/answer/CompositeStem.vue new file mode 100644 index 0000000..89a2f8e --- /dev/null +++ b/src/components/question/answer/CompositeStem.vue @@ -0,0 +1,272 @@ + + + + + diff --git a/src/components/question/answer/HandDrawn.vue b/src/components/question/answer/HandDrawn.vue new file mode 100644 index 0000000..d346316 --- /dev/null +++ b/src/components/question/answer/HandDrawn.vue @@ -0,0 +1,382 @@ + + + diff --git a/src/components/question/answer/Input.vue b/src/components/question/answer/Input.vue new file mode 100644 index 0000000..7c5f7b6 --- /dev/null +++ b/src/components/question/answer/Input.vue @@ -0,0 +1,106 @@ + + + diff --git a/src/components/question/answer/Judgment.vue b/src/components/question/answer/Judgment.vue new file mode 100644 index 0000000..c875b12 --- /dev/null +++ b/src/components/question/answer/Judgment.vue @@ -0,0 +1,144 @@ + + + diff --git a/src/components/question/answer/JudgmentCloze.vue b/src/components/question/answer/JudgmentCloze.vue new file mode 100644 index 0000000..635ea91 --- /dev/null +++ b/src/components/question/answer/JudgmentCloze.vue @@ -0,0 +1,179 @@ + + + diff --git a/src/components/question/answer/MultipleChoice.vue b/src/components/question/answer/MultipleChoice.vue new file mode 100644 index 0000000..61ae69c --- /dev/null +++ b/src/components/question/answer/MultipleChoice.vue @@ -0,0 +1,161 @@ + + + diff --git a/src/components/question/answer/Other.vue b/src/components/question/answer/Other.vue new file mode 100644 index 0000000..bcede8f --- /dev/null +++ b/src/components/question/answer/Other.vue @@ -0,0 +1,285 @@ + + + diff --git a/src/components/question/answer/SingleChoice.vue b/src/components/question/answer/SingleChoice.vue new file mode 100644 index 0000000..2b1aae4 --- /dev/null +++ b/src/components/question/answer/SingleChoice.vue @@ -0,0 +1,147 @@ + + + diff --git a/src/components/school-class-select/index.vue b/src/components/school-class-select/index.vue new file mode 100644 index 0000000..c729a7b --- /dev/null +++ b/src/components/school-class-select/index.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/user-asset-item/index.vue b/src/components/user-asset-item/index.vue new file mode 100644 index 0000000..578db08 --- /dev/null +++ b/src/components/user-asset-item/index.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/src/components/user-figure-big/index.vue b/src/components/user-figure-big/index.vue new file mode 100644 index 0000000..bf7a276 --- /dev/null +++ b/src/components/user-figure-big/index.vue @@ -0,0 +1,175 @@ + + + + + diff --git a/src/components/user-figure/index.vue b/src/components/user-figure/index.vue new file mode 100644 index 0000000..6c6edbe --- /dev/null +++ b/src/components/user-figure/index.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/user-profile-card/index.vue b/src/components/user-profile-card/index.vue new file mode 100644 index 0000000..35667f3 --- /dev/null +++ b/src/components/user-profile-card/index.vue @@ -0,0 +1,238 @@ + + + + + diff --git a/src/components/user-task-list/index.vue b/src/components/user-task-list/index.vue new file mode 100644 index 0000000..a749b41 --- /dev/null +++ b/src/components/user-task-list/index.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/src/components/word-book-select/index.vue b/src/components/word-book-select/index.vue new file mode 100644 index 0000000..6ad15b2 --- /dev/null +++ b/src/components/word-book-select/index.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/src/components/word-book-select/store.ts b/src/components/word-book-select/store.ts new file mode 100644 index 0000000..bdec685 --- /dev/null +++ b/src/components/word-book-select/store.ts @@ -0,0 +1,74 @@ +import wordTableApi from '@/api/subject/wordTable' +import obj from '@/utils/obj' + +export const useWordBookSelect = defineStore('word-book-select', () => { + const stageOptions = [ + { + label: '小学', + value: 1, + }, + { + label: '初中', + value: 2, + }, + { + label: '高中', + value: 3, + }, + ] + const stageMap = obj.options2map(stageOptions) + const versionsMap = {} as any + const textbooksMap = {} as any + const chaptersMap = {} as any + + async function getVersions(stageId: any) { + let versions = versionsMap[stageId] + if (!versions) { + versions = await wordTableApi.getTextbookVersion(stageId) + versionsMap[stageId] = versions + } + return versions + } + + async function getVersionOptions(stageId: any) { + return (await getVersions(stageId)).map((item: any) => ({ + label: item.name, + value: item.id, + })) + } + + async function getTextbooks(versionId: any) { + let textbooks = textbooksMap[versionId] + if (!textbooks) { + textbooks = await wordTableApi.getTextbookList(versionId) + textbooksMap[versionId] = textbooks + } + return textbooks + } + + async function getChapters(bookId: any) { + let chapters = chaptersMap[bookId] + if (!chapters) { + chapters = await wordTableApi.getChapterList(bookId) + chaptersMap[bookId] = chapters + } + return chapters + } + + async function getTextbookOptions(versionId: any) { + return (await getTextbooks(versionId)).map((item: any) => ({ + label: item.name, + value: item.id, + })) + } + + return { + stageOptions, + stageMap, + getVersions, + getVersionOptions, + getTextbooks, + getTextbookOptions, + getChapters, + } +}) diff --git a/src/components/word-book-selector/index.ts b/src/components/word-book-selector/index.ts new file mode 100644 index 0000000..8e76052 --- /dev/null +++ b/src/components/word-book-selector/index.ts @@ -0,0 +1,40 @@ +import obj from '@/utils/obj' + +// 导航 +export const nav_stage = '1' +export const nav_book = '2' +export const navOptions = [ + { + label: '阶段', + value: nav_stage, + }, + { + label: '教材', + value: nav_book, + }, +] + +// 阶段 +export const stageOptions = [ + { + label: '全部', + value: '', + }, + { + label: '小学', + value: '1', + }, + { + label: '初中', + value: '2', + }, + { + label: '高中', + value: '3', + }, + { + label: '四级', + value: '4', + }, +] +export const stageMap = obj.options2map(stageOptions) diff --git a/src/components/word-book-selector/index.vue b/src/components/word-book-selector/index.vue new file mode 100644 index 0000000..76f44b9 --- /dev/null +++ b/src/components/word-book-selector/index.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/src/components/word-game/hooks/main.ts b/src/components/word-game/hooks/main.ts new file mode 100644 index 0000000..3ca9e67 --- /dev/null +++ b/src/components/word-game/hooks/main.ts @@ -0,0 +1,235 @@ +import wordDetailApi from '@/api/subject/wordDetail' +import useAudio from '@/hooks/useCommonAudio' +import { OSS_URL } from '@/utils' +import hud from '@/utils/hud' +import { level_type_advance, result_wrong } from '..' + +export const shelfTopUrl = `${OSS_URL}/subject/book_shelf_top.svg` +export const bottomUrl = `${OSS_URL}/subject/book_shelf_bottom.svg` +export const leftUrl = `${OSS_URL}/subject/book_shelf_left.svg` +export const wrongUrl = `${OSS_URL}/xuexiaole_clinet/normalMode/cross.png` +export const rightUrl = `${OSS_URL}/xuexiaole_clinet/normalMode/tick.png` +export const surrenderUrl = `${OSS_URL}/xuexiaole_clinet/icon/icon_surrender.svg` +export const shengciben01Url = `${OSS_URL}/xuexiaole_clinet/icon/icon_shengciben_01.svg` +export const shengciben02Url = `${OSS_URL}/xuexiaole_clinet/icon/icon_shengciben_02.svg` +export const nextUrl = `${OSS_URL}/xuexiaole_clinet/icon/icon_next.svg` +export const memoryTipsUrl = `${OSS_URL}/xuexiaole_clinet/icon/icon_memory_tips.png` +export const countDownBg = `url(${OSS_URL}/icon/timeout_clock.png)` + +export const useMain = (props: any, emits: any) => { + // 开始的时间 + const startTime = ref(0) + // 播放音频 + const sound = useAudio(true) + + // 是否已经出结果 + const result = ref(undefined as any) + + // 显示投降按钮 + const showSurrender = computed(() => result.value === undefined) + + // 下一题按钮 + const showNext = computed(() => { + // 如果还没有出结果,不显示 + if (!result.value) return false + // 最后一题,不显示 + if (props.last) return false + // 答题情况 + return result.value === result_wrong + }) + + const isMarked = ref(false) + + // 生词本图标 + const strangeIcon = computed(() => { + if (isMarked.value) { + return shengciben02Url + } else { + return shengciben01Url + } + }) + + const showMemoryTips = ref(false) + // 点击助记 + const handelMemoryTips = () => { + showMemoryTips.value = true + } + + // 倒计时 + const countDownText = ref('') + // 5秒内显示 + const showCountDown = 5 + // 到时间就失败 + let failedTimer = 0 as any + // 到时间就自动进入下一题 + let nextTimer = 0 as any + + const startFailedTimer = () => { + if (!props.countDown) return + stopFailedTimer() + + // 选择题倒计时 + const initCountDown = 10 + let duration = initCountDown + if (props.data.levelType === level_type_advance) { + // 拼写 + duration = Math.ceil(props.data.spell.length * 3) + duration = Math.max(duration, initCountDown) + } + if (duration <= showCountDown) { + countDownText.value = `${duration}` + } + failedTimer = setInterval(() => { + duration-- + if (duration <= showCountDown) { + countDownText.value = `${duration}` + if (duration <= 0) { + // 直接投降 + handleSurrender() + } + } + }, 1000) + } + + const stopFailedTimer = () => { + if (!props.countDown) return + countDownText.value = '' + clearInterval(failedTimer) + } + + const startNextTimer = () => { + if (!props.countDown) return + stopNextTimer() + + // 倒计时多少秒 + let duration = Math.max(5, Math.ceil((props.data.wordSpell?.length || 0) * 1.5)) + if (duration <= showCountDown) { + countDownText.value = `${duration}` + } + nextTimer = setInterval(() => { + duration-- + if (duration <= showCountDown) { + countDownText.value = `${duration}` + if (duration <= 0) { + // 直接下一题 + handleNext() + } + } + }, 1000) + } + + const stopNextTimer = () => { + if (!props.countDown) return + countDownText.value = '' + clearInterval(nextTimer) + } + + const stopAllTimers = () => { + stopNextTimer() + stopFailedTimer() + } + + // 点击生词本 + const handelStrange = () => { + isMarked.value = !isMarked.value + wordDetailApi + .operateTag({ + id: props.data.wordId, + meaningId: props.data.meaningId, + levelId: props.data.levelId, + knowFlag: null, + strangeFlag: isMarked.value ? 1 : 0, + }) + .then(() => { + hud.success(isMarked.value ? '已加入生词本' : '已从生词本移除') + }) + } + + // 点击投降 + const handleSurrender = () => { + // 标记为错误 + result.value = result_wrong + // 发送结果 + emits('post-result', result.value, true, Date.now() - startTime.value) + } + + // 点击下一题 + const handleNext = () => { + emits('next') + } + + watch( + () => result.value, + () => { + if (result.value !== undefined) { + // 只要出结果了,就停止定时器 + stopAllTimers() + + if (result.value === result_wrong) { + // 错误了,就开始下一题的定时器 + startNextTimer() + } + } + }, + ) + + watch( + () => props.end, + () => { + if (props.end) { + stopAllTimers() + } + }, + ) + + watch( + () => props.data, + () => { + // 没有题目 + if (!props.data.levelId) return + + stopAllTimers() + + nextTick(() => { + // 清空结果 + result.value = undefined + // 设置开始时间 + startTime.value = Date.now() + // 开始定时器 + startFailedTimer() + }) + }, + { + immediate: true, + }, + ) + + // 监控下一题按钮的显示或隐藏 + watch( + () => showNext.value, + () => { + if (!showNext.value) return + // 播放音频 + sound.play('show_nextBtn.mp3') + }, + ) + + onUnmounted(() => { + stopAllTimers() + }) + + return { + handleNext, + handleSurrender, + strangeIcon, + handelStrange, + sound, + result, + showNext, + showMemoryTips, + handelMemoryTips, + showSurrender, + countDownText, + startTime, + } +} diff --git a/src/components/word-game/index.scss b/src/components/word-game/index.scss new file mode 100644 index 0000000..d9a9b65 --- /dev/null +++ b/src/components/word-game/index.scss @@ -0,0 +1,196 @@ +@use '../../styles/variate.scss' as *; + +.question-box { + position: relative; + width: 100%; + + .count-down { + position: absolute; + background-size: 100%; + top: 10px; + left: 10px; + width: 15vh; + height: 15.97vh; + padding-top: 3vh; + font-size: 7vh; + font-family: $font-special; + text-align: center; + color: #db0e29; + } + + .abbr { + display: flex; + flex-direction: column; + row-gap: 0.83vh; + + :deep(.img-Speech) { + margin-right: 0; + width: auto; + height: 3.33vh; + } + } + + $top_h: 30.67vh; + $img_box_h: 22.34vh; + $radius: 3.33vh; + .top { + background-color: #a0fcf8; + height: $top_h; + border-radius: $radius; + position: relative; + display: flex; + align-items: center; + justify-content: center; + + .img-box { + height: $img_box_h; + width: auto; + overflow: hidden; + } + + .top-box { + pointer-events: none; + position: absolute; + top: -2.92vh; + left: 260px; + right: 260px; + display: flex; + justify-content: space-between; + z-index: 1; + + img { + width: 3.67vh; + height: auto; + } + } + + .trunk { + display: flex; + align-items: center; + justify-content: center; + column-gap: 30px; + + .title { + font-size: 5vh; + font-family: $font-special; + color: rgba(0, 0, 0, 0.85); + } + + .cn { + display: flex; + align-items: center; + justify-content: center; + + .abbr { + margin-right: 20px; + } + } + } + } + .bottom { + position: relative; + overflow: hidden; + height: 54.33vh; + background-color: #faffff; + border-radius: 3.33vh; + display: flex; + justify-content: center; + align-items: center; + box-shadow: 0 0.33vh 0.33vh 0 rgba(0, 0, 0, 0.25); + + .button { + $button_w: 120px; + $button_p: 24px; + position: absolute; + right: 0; + top: 0; + background-color: #fff01f; + width: $button_w; + height: 10vh; + text-align: center; + border-top-right-radius: $radius; + border-bottom-left-radius: $radius; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + box-shadow: 0 0.33vh 0.33vh rgba(0, 0, 0, 0.25); + + &.second-button { + right: $button_w + $button_p; + border-top-right-radius: 0; + border-bottom-right-radius: $radius; + } + + img { + width: 6.67vh; + height: 6.67vh; + } + } + + .next-question { + cursor: pointer; + position: absolute; + right: 0; + bottom: 5.33vh; + width: 100px; + height: 25vh; + border-top-left-radius: $radius; + border-bottom-left-radius: $radius; + background-color: #91eca9; + box-shadow: 0 0.33vh 0.33vh rgba(0, 0, 0, 0.25); + color: #0a1f13; + font-size: 3.83vh; + font-family: $font-text; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + animation-delay: 0.3s; + animation-duration: 0.5s; + animation-fill-mode: both; + transform-style: preserve-3d; + img { + margin-bottom: 0.83vh; + width: 4.08vh; + height: auto; + } + } + + .sticker-left { + pointer-events: none; + position: absolute; + opacity: 20%; + transform: rotate(-10deg) scale(1.2); + top: -12.92vh; + left: -15px; + width: 408px; + height: 38.58vh; + } + + .sticker-bottom { + pointer-events: none; + position: absolute; + opacity: 20%; + right: 20px; + bottom: 1.67vh; + width: 346px; + height: 24.75vh; + } + } + + .middle-line { + $dot_w: 1.69vh; + $dot_h: 1vh; + $line_t: 30.17vh; + z-index: 20; + position: absolute; + top: $line_t; + left: 27px; + width: 1800px; + height: $dot_h; + background-image: url('https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/urm/purple_dot.png'); + background-repeat: repeat-x; + background-size: $dot_w $dot_h; + } +} diff --git a/src/components/word-game/index.ts b/src/components/word-game/index.ts new file mode 100644 index 0000000..a6f3b58 --- /dev/null +++ b/src/components/word-game/index.ts @@ -0,0 +1,127 @@ +// 结果 +export const result_wrong = 'wrong' +export const result_right = 'right' + +// 单词闯关:第1轮 +export const type_en = 1 +// 单词闯关:第2轮 +export const type_cn = 2 +// 单词闯关:第3轮 +export const type_sentence = 3 + +// 题干是英文 +export const category_en = 1 +// 题干是中文 +export const category_cn = 2 +export const category_link = 3 +// 题干是句子 +export const category_sentence = 4 + +// 单词闯关:入门 +export const level_type_begin = 1 +// 单词闯关:进阶 +export const level_type_advance = 2 + +export interface Option { + answer: boolean + optionType: number + value: string + spell: string + tips: string + abbr: string + wordId: string + valueCategory: number + tipsCategory: number + accent: string + wordAccentSpell: string + // 选项的字母ABCD + letter: any + // 结果 + result: any +} + +interface MemoryTip { + method: string + details: string +} + +export interface SingleChoiceQuestion { + titleFrom: any // null 用 any 表示 + levelId: string + sessionId: string + levelNum: number + stageId: string + stageName: string + levelType: number + wordId: string + meaningId: string + levelWordId: string + accent: string + title: string + titleTips: any // null 用 any 表示 + titlePicture: string + abbr: string + // 题目类型 + titleCategory: number + knowWord: any // null 用 any 表示 + strangeWord: number + score: number + optionList: Option[] + titleType: number + sentenceWordSpell: any // null 用 any 表示 + sentenceDisplaySpell: any // null 用 any 表示 + wordSpell: string + sentenceMeaningWordFormLabel: any // null 用 any 表示 + sentenceMeaningWordFormLabelStr: any // null 用 any 表示 + sentenceMeaningWordSpell: any // null 用 any 表示 + wordTestQuestionType: any // null 用 any 表示 + wordTestQuestFlag: string + memoryTips: MemoryTip[] | string // 可能是数组或字符串 +} + +interface CharItem { + value: string + choose: boolean + maxChoose: number +} + +export interface SpellQuestion { + titleFrom: number // 这个例子中是数字2,不是null + levelId: string + sessionId: string + levelNum: number + stageId: string + stageName: string + levelType: number + wordId: string + meaningId: string + levelWordId: string + accent: string + title: string + titleTips: string // 这个例子中是字符串,不是null + titlePicture: any // null 用 any 表示 + abbr: string + titleCategory: number + knowWord: number + strangeWord: number + spell: string + wordSpell: string + sentenceDisplaySpell: string + wordSimpleZnDesc: string + wordZnDesc: string + wordEnDesc: any // null 用 any 表示 + charList: CharItem[] + titleType: number + sentenceMeaningWordFormLabel: number + sentenceMeaningWordSpell: string + wordAccent: string + wordAccentSpell: string + sentenceMeaningWordFormLabelStr: string + wordTestQuestionType: any // null 用 any 表示 + wordTestQuestFlag: string + score: number + memoryTips: MemoryTip[] | string // 可能是数组或字符串 + reviewSuccessful: any // null 用 any 表示 +} + +export type Question = SingleChoiceQuestion | SpellQuestion diff --git a/src/components/word-game/index.vue b/src/components/word-game/index.vue new file mode 100644 index 0000000..2e89444 --- /dev/null +++ b/src/components/word-game/index.vue @@ -0,0 +1,439 @@ + + + + + diff --git a/src/components/word-game/word-single-choice/index.vue b/src/components/word-game/word-single-choice/index.vue new file mode 100644 index 0000000..b8503f8 --- /dev/null +++ b/src/components/word-game/word-single-choice/index.vue @@ -0,0 +1,385 @@ + + + + + diff --git a/src/components/word-game/word-spelling-bee/index.vue b/src/components/word-game/word-spelling-bee/index.vue new file mode 100644 index 0000000..099375f --- /dev/null +++ b/src/components/word-game/word-spelling-bee/index.vue @@ -0,0 +1,502 @@ + + + + diff --git a/src/components/word-print/index.vue b/src/components/word-print/index.vue new file mode 100644 index 0000000..766c709 --- /dev/null +++ b/src/components/word-print/index.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/src/directive/auth.ts b/src/directive/auth.ts new file mode 100644 index 0000000..0234c9e --- /dev/null +++ b/src/directive/auth.ts @@ -0,0 +1,34 @@ +/* eslint-disable no-undef */ +import { userStore } from '@/stores' +import { storeToRefs } from 'pinia' + +const userPermissions: any = null +nextTick(() => { + const { userInfo } = storeToRefs(userStore()) + // console.log(userInfo); + // userPermissions = userinfo.permissions; +}) + +export default function (el: HTMLElement, { value }: { value: string | string[] | undefined }) { + if (value === undefined) { + return + } + if (typeof value === 'object') { + if (value.every(val => !userPermissions.value.includes(val))) el.parentNode?.removeChild(el) + return + } + if (!userPermissions.value.includes(value)) { + if (el.className.includes('switch-box')) { + el.classList.value += ' disabled' + const elSwitch: HTMLElement = el.querySelector('.switch') as HTMLElement + elSwitch.onclick = e => e.stopPropagation() + + const spans: NodeListOf = el.querySelectorAll('span') + spans.forEach(i => { + i.onclick = e => e.stopPropagation() + }) + return + } + el.parentNode?.removeChild(el) + } +} diff --git a/src/directive/index.ts b/src/directive/index.ts new file mode 100644 index 0000000..c116a6c --- /dev/null +++ b/src/directive/index.ts @@ -0,0 +1,16 @@ +import auth from './auth' +import noticeBtnAuth from './notice-btn-auth' +import longpress from './longpress' + +const directives: anyObj = { + auth, + noticeBtnAuth, + longpress, +} +export default { + install(Vue: anyObj) { + Object.keys(directives).forEach(key => { + Vue.directive(key, directives[key]) + }) + }, +} diff --git a/src/directive/longpress.ts b/src/directive/longpress.ts new file mode 100644 index 0000000..f4d03b3 --- /dev/null +++ b/src/directive/longpress.ts @@ -0,0 +1,36 @@ +export default function (el: HTMLElement, content: anyObj) { + const { value, duration } = content + // 定义长按所需的时长(毫秒) + const delay = duration || 1000 + let pressTimer: any = null + + // 开始计时 + const start = (e: any) => { + if (e.type === 'click' && e.button !== 0) { + return + } + // 设置定时器 + if (pressTimer === null) { + pressTimer = setTimeout(() => { + // 长按后执行绑定的函数 + value() + }, delay) + } + } + + // 取消计时器 + const cancel = (_: Event) => { + if (pressTimer !== null) { + clearTimeout(pressTimer) + pressTimer = null + } + } + + // 添加事件监听 + el.addEventListener('touchstart', start) + el.addEventListener('touchend', cancel) + el.addEventListener('touchmove', cancel) // 避免拖动时触发 + el.addEventListener('mousedown', start) // 支持鼠标点击 + el.addEventListener('mouseup', cancel) + el.addEventListener('mouseleave', cancel) +} diff --git a/src/directive/notice-btn-auth.ts b/src/directive/notice-btn-auth.ts new file mode 100644 index 0000000..5bdd1ab --- /dev/null +++ b/src/directive/notice-btn-auth.ts @@ -0,0 +1,29 @@ +import type { Ref } from 'vue' +import { userStore } from '@/stores' +import { storeToRefs } from 'pinia' + +let AUTH: Ref +nextTick(() => { + const { auth } = storeToRefs(userStore()) + AUTH = auth +}) + +// eslint-disable-next-line max-params +export default function (el: HTMLElement, { value }: { value: string }) { + el.parentNode.style.display = 'block' + function remove() { + el.parentNode.style.display = 'none' + // el.parentNode?.removeChild(el); + } + if (!value) { + return remove() + } + if (value.startsWith('qyn://')) { + const path = value.split('qyn://')[1] + if (!path) return remove() + if (!AUTH.value.some(i => i === path)) return remove() + } else if (value.startsWith('qy://')) { + const path = value.split('qy://')[1] + if (!path) return remove() + } +} diff --git a/src/hooks/index.ts b/src/hooks/index.ts new file mode 100644 index 0000000..f6310e8 --- /dev/null +++ b/src/hooks/index.ts @@ -0,0 +1,16 @@ +export * from './useMessage' +export * from './useCopy' +export * from './useDict' +export * from './useTools' +export * from './useLoad' +export * from './useAudio' +export * from './useTips' +export * from './useReward' +export * from './useBindQrCode' +export * from './useSocket' +export * from './useTeacherExplain' +export * from './usePay' +export * from './useLog' +export * from './useMathJax' +export * from './useSubject' +export * from './useSound' diff --git a/src/hooks/useAudio.ts b/src/hooks/useAudio.ts new file mode 100644 index 0000000..5762a28 --- /dev/null +++ b/src/hooks/useAudio.ts @@ -0,0 +1,56 @@ +import Player, { Events } from 'xgplayer' +import type { IPlayerOptions } from 'xgplayer' +import { globalStore } from '@/stores' + +interface Audio_Config extends IPlayerOptions { + autoplay?: boolean + recordType?: string // 日志上报 + onPlay?: (...args: any[]) => void + onEnded?: (...args: any[]) => void + onError?: (...args: any[]) => void +} + +export const useAudio = (config: Audio_Config) => { + const { system } = globalStore() + const player = new Player({ + id: 'x-audio', + autoplay: true, + volume: system.volume.musicVolume / 100, + keyShortcut: false, + fullscreen: { + useCssFullscreen: true, // 全屏按钮将会调用页面内全屏 + }, + defaultPlaybackRate: system.volume.playbackRate, + ...config, + }) + + // player.playNext({ + // url: config.url, + // }); + player.play() + + player.on(Events.PLAY, result => { + config.onPlay && + config.onPlay({ + result, + config, + }) + }) + + player.on(Events.ENDED, result => { + config.onEnded && + config.onEnded({ + result, + config, + }) + }) + player.on(Events.ERROR, result => { + config.onError && + config.onError({ + result, + config, + }) + }) + + return player +} diff --git a/src/hooks/useBindQrCode.ts b/src/hooks/useBindQrCode.ts new file mode 100644 index 0000000..8776433 --- /dev/null +++ b/src/hooks/useBindQrCode.ts @@ -0,0 +1,38 @@ +import { getSN, getManufacturer } from '@/utils' +import loginApi from '@/api/login' +import { userStore } from '@/stores' +import { storeToRefs } from 'pinia' + +export const useBindQrCode = () => { + const bindQrCode = ref('') + const loadingQrCode = ref(true) + const { userInfo } = storeToRefs(userStore()) + + const initQrCode = async () => { + loadingQrCode.value = true + try { + const SN = getSN() + const model = getManufacturer() + const { + data: { data: res }, + } = await loginApi.getBindQrCode({ + qrCodeFileName: `code_${userInfo.value.account}_${SN}`, + qrCodeInfo: JSON.stringify({ + account: userInfo.value.account, + userId: userInfo.value.userId, + simSerialNumber: SN, + model: model, + }), + }) + bindQrCode.value = res.filePath + } finally { + loadingQrCode.value = false + } + } + + return { + bindQrCode, + loadingQrCode, + initQrCode, + } +} diff --git a/src/hooks/useCommonAudio.ts b/src/hooks/useCommonAudio.ts new file mode 100644 index 0000000..24e2cf4 --- /dev/null +++ b/src/hooks/useCommonAudio.ts @@ -0,0 +1,46 @@ +import { useAudio as Audio } from '@/hooks' +const OSS_URL = import.meta.env.VITE_OSS_URL + +const soundUrl = `${OSS_URL}/xuexiaole_clinet/sound/` + +// const music = uni.createInnerAudioContext(); // 创建播放器对象 +const playSwitches = ref([] as Ref[]) + +const useAudio = function (needStatic?: boolean) { + // 每个音频生成一个对应的 isPlay 状态 + const isPlay = ref(false) + playSwitches.value.push(isPlay) + + const play = (url: string) => { + playSwitches.value.forEach(item => (item.value = false)) // 关闭所有音频的isPlay + isPlay.value = true + Audio({ + url: needStatic ? soundUrl + url : url, + autoplay: true, + onEnded() { + isPlay.value = false + }, + onError() { + isPlay.value = false + }, + }) + } + + const stopAll = () => { + playSwitches.value.forEach(item => (item.value = false)) + // music.stop(); + } + + const destroy = () => { + // music.destroy(); + } + + return { + isPlay, + play, + destroy, + stopAll, + } +} + +export default useAudio diff --git a/src/hooks/useCopy.ts b/src/hooks/useCopy.ts new file mode 100644 index 0000000..24a7783 --- /dev/null +++ b/src/hooks/useCopy.ts @@ -0,0 +1,16 @@ +import { XMessage } from './useMessage' +export const hookCopy = (str: string | undefined) => { + try { + if (str === null) return + const tempInput = document.createElement('input') + document.body.appendChild(tempInput) + tempInput.setAttribute('value', str) + tempInput.select() + document.execCommand('copy') + document.body.removeChild(tempInput) + // navigator.clipboard.writeText(str); + XMessage.success('复制成功') + } catch { + XMessage.error('浏览器版本太低,不支持复制功能') + } +} diff --git a/src/hooks/useDict.ts b/src/hooks/useDict.ts new file mode 100644 index 0000000..862289d --- /dev/null +++ b/src/hooks/useDict.ts @@ -0,0 +1,24 @@ +import { globalStore } from '@/stores' +import { ArrToObj } from '@/utils/tool' + +export const getDict = (code: string, full = false, { label, value }: anyObj = {}) => { + const { dict } = globalStore() + + const d = dict.find((i: anyObj) => i.code === code) + let dictData = d ? d.children : [] + if (label && value) { + dictData = dictData.map((i: anyObj) => ({ + label: i[label], + value: i[value], + })) + } + if (full) { + return { + dictData, + dictObj: ArrToObj(dictData, 'value', 'code'), + enum: ArrToObj(dictData, 'code', 'value'), + remarkObj: ArrToObj(dictData, 'code', 'remark'), + } + } + return dictData +} diff --git a/src/hooks/useLoad.ts b/src/hooks/useLoad.ts new file mode 100644 index 0000000..75eb2bf --- /dev/null +++ b/src/hooks/useLoad.ts @@ -0,0 +1,88 @@ +import { ref } from 'vue' +import { $XXL, isWebEvn } from '@/utils' + +export const useLoad = () => { + const size = ref(0) + const loadSize = ref(0) + const loadProgress = ref('0%') + const loaded = ref(false) + const loadText = ref('') + let close = false + + const init = (arr: any, config: { timeout?: number; android?: boolean } = {}) => { + loadSize.value = 0 + loaded.value = false + loadProgress.value = '0%' + close = false + if (config.android) { + size.value = arr.c + $XXL.loadResources({ data: arr }, (res, next) => { + load( + { + src: res.data.url, + }, + true, + ) + ok(res.data.url) + next() + }) + } else { + size.value = arr.length + if (arr.length) { + arr.forEach((i: string) => { + load({ src: i }) + }) + } else { + loadProgress.value = '100%' + loaded.value = true + } + } + } + + const load = (item: { src: string; numberOfFail?: number }, silence = false) => { + const img = new Image() + if (!/^https?:\/\/(.+\/)+.+(\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif))$/i.test(item.src)) + return ok(item.src) + img.src = item.src + if (silence) { + img.addEventListener('load', () => {}) + } else { + img.addEventListener('load', () => ok(item.src)) + img.addEventListener('error', () => { + item.numberOfFail ? item.numberOfFail++ : (item.numberOfFail = 1) + if (item.numberOfFail && item.numberOfFail > 2) { + ok(item.src) + // XMessage.error('加载失败,网络异常,请刷新或稍后重试'); + } else { + load(item) + } + }) + } + } + + // 加载完成 + const ok = (src?: string) => { + loadSize.value++ + const progress = Math.round((loadSize.value / size.value) * 100) + loadProgress.value = progress + '%' + // loadText.value = src?.split('/').pop() || ''; + + if (!isWebEvn && progress > 2 && !close) { + close = true + $XXL.closeLoading() + } + + setTimeout(() => { + loaded.value = Number(loadProgress.value.replace('%', '')) >= 100 + }, 500) + } + + return { + size, + loadSize, + loadProgress, + loaded, + loadText, + init, + } +} diff --git a/src/hooks/useLog.ts b/src/hooks/useLog.ts new file mode 100644 index 0000000..487804b --- /dev/null +++ b/src/hooks/useLog.ts @@ -0,0 +1,35 @@ +import logApi from '@/api/log' +import type { LockScreenTime, VideoPlayTime, StudyTime } from '@/api/log' +import type { AxiosResponse } from 'axios' + +export enum LogType { + LockScreenTime, + VideoPlayTime, + StudyTime, +} + +type ConfigMap = { + [LogType.LockScreenTime]: LockScreenTime + [LogType.VideoPlayTime]: VideoPlayTime + [LogType.StudyTime]: StudyTime +} + +type ReportFunction = (data: T) => Promise> + +export const useLog = async (type: T, data: ConfigMap[T]) => { + const logTypeMap: { + [K in LogType]?: ReportFunction + } = { + [LogType.LockScreenTime]: logApi.reportLockScreenTime, + [LogType.VideoPlayTime]: logApi.reportVideoPlayTime, + [LogType.StudyTime]: logApi.reportStudyTime, + } + + const fn = logTypeMap[type] + try { + if (!fn) return + return await fn(data) + } catch (err) { + console.log(err) + } +} diff --git a/src/hooks/useMathJax.ts b/src/hooks/useMathJax.ts new file mode 100644 index 0000000..a96d665 --- /dev/null +++ b/src/hooks/useMathJax.ts @@ -0,0 +1,13 @@ +export const TypeSet = async function (elements: any) { + try { + if (!window.MathJax) { + return + } + window.MathJax.startup.promise = window.MathJax.startup.promise + .then(() => { + return window.MathJax.typesetPromise(elements) + }) + .catch((err: any) => console.log('Typeset failed: ' + err.message)) + return window.MathJax.startup.promise + } catch {} +} diff --git a/src/hooks/useMessage.ts b/src/hooks/useMessage.ts new file mode 100644 index 0000000..1a6ec36 --- /dev/null +++ b/src/hooks/useMessage.ts @@ -0,0 +1,39 @@ +import { h } from 'vue' +import { ElMessage } from 'element-plus' +import Icon from '@/components/Icon/index.vue' +import 'element-plus/es/components/message/style/index' + +const successTip = (msg: string, html = false) => { + ElMessage({ + dangerouslyUseHTMLString: html, + message: msg, + type: 'success', + customClass: 'success_messageBox', + icon: h(Icon, { name: 'tip_success', size: 42 }), + }) +} + +const errorTip = (msg: string, html = false) => { + ElMessage({ + dangerouslyUseHTMLString: html, + message: msg, + type: 'error', + customClass: 'error_messageBox', + icon: h(Icon, { name: 'tip_error', size: 42 }), + }) +} + +const infoTip = (msg: string, html = false) => { + ElMessage({ + dangerouslyUseHTMLString: html, + message: msg, + type: 'info', + customClass: 'info_messageBox', + }) +} + +export const XMessage = { + success: successTip, + error: errorTip, + info: infoTip, +} diff --git a/src/hooks/usePay.ts b/src/hooks/usePay.ts new file mode 100644 index 0000000..05ee66c --- /dev/null +++ b/src/hooks/usePay.ts @@ -0,0 +1,87 @@ +import orderApi from '@/api/order' +import QRCode from 'qrcode' + +interface PayConfig { + type?: 'wx' + interval?: number + timeout?: number + init?: anyFuc +} + +export const usePay = (config: PayConfig = {}) => { + const url = ref('') + const qrCode = ref('') + const status = ref<-1 | 0 | 1>(0) // -1二维码失效 0未支付 1已支付 + const reqRes = ref({}) + const loading = ref(false) + let timer: any + + const loop = (id: any) => { + timer = setInterval(async () => { + if (!id) { + console.error('order id is required') + end() + return + } + const { + data: { data: res }, + } = await orderApi.getPayStatus(id) + reqRes.value = res + + if (res.orderPayExpiredStatus === 1) { + status.value = -1 + end() + return + } + + if (res.status === 1) { + status.value = 1 + end() + return + } + }, config.interval || 3000) + } + + const start = async (init?: any) => { + loading.value = true + try { + clear() + if (!(init || config.init)) return + const { + data: { data: res }, + } = await (init || config.init)!() + url.value = res.codeUrl + qrCode.value = await QRCode.toDataURL(url.value) + loop(res.payId) + setTimeout( + () => { + end() + }, + config.timeout || 1000 * 60 * 6, + ) + } catch (err) { + qrCode.value = '' + } finally { + loading.value = false + } + } + + const end = () => { + clearInterval(timer) + timer = null + } + + const clear = () => { + end() + status.value = 0 + } + + return { + qrCode, + status, + reqRes, + loading, + start, + end, + } +} diff --git a/src/hooks/useReward.ts b/src/hooks/useReward.ts new file mode 100644 index 0000000..d355762 --- /dev/null +++ b/src/hooks/useReward.ts @@ -0,0 +1,38 @@ +import { createVNode, render } from 'vue' +import RewardDia from '@c/RewardDia/index.vue' +import { useSound } from './useSound' + +interface Tips_Config { + rewardList?: anyObj[] + onOk?: (...args: any[]) => void +} + +const OSS_URL = import.meta.env.VITE_OSS_URL + +export const useReward = (config: Tips_Config) => { + const container = document.createElement('div') + const dia = createVNode(RewardDia, { + modelValue: true, + rewardList: config.rewardList, + ...config, + onOk: async () => { + config.onOk && (await config.onOk()) + close() + }, + onCancel: () => { + close() + }, + }) + + const close = () => { + dia.component!.props.modelValue = false + setTimeout(() => { + render(null, container) + }, 300) + } + + render(dia, container) + document.querySelector('body')?.appendChild(container.firstElementChild!) + // 音效 + useSound(`${OSS_URL}/sound/receive_reward.mp3`) +} diff --git a/src/hooks/useSocket.ts b/src/hooks/useSocket.ts new file mode 100644 index 0000000..b54918b --- /dev/null +++ b/src/hooks/useSocket.ts @@ -0,0 +1,210 @@ +import { useWebSocket } from '@vueuse/core' +import { userStore, globalStore, urgeStore } from '@/stores' +import type { UseWebSocketReturn } from '@vueuse/core' +import { getSN, $XXL, sys_type, sys_type_study_machine, isNotStudyMachine } from '@/utils' +import { useLog, LogType, useTips } from '@/hooks' +import { useRouter } from 'vue-router' +import { storeToRefs } from 'pinia' + +let SOCKET: UseWebSocketReturn + +enum SOCKET_MSG_TYPE { + lockScreen = 'lockScreen', + unLockScreen = 'unLockScreen', + desktopPreview = 'desktopPreview', + inspectorTalkMessage = 'inspectorTalkMessage', + inspectorStart = 'inspectorStart', + inspectorEnd = 'inspectorEnd', + systemMessage = 'systemMessage', + messageReceive = 'messageReceive', +} + +const inspectorEnd = ref() +const inspectorMessage = ref() + +export const useSocket = () => { + const router = useRouter() + const { token, userInfo } = storeToRefs(userStore()) + const { system } = storeToRefs(globalStore()) + const { getInspectorInfo } = urgeStore() + const SN = getSN() + + const init = () => { + return + if (import.meta.env.MODE === 'test') return + if (!token.value) return + stop() + SOCKET = useWebSocket( + `${import.meta.env.VITE_WS_URL}?accessToken=${token.value.replace('Bearer ', '')}`, + { + autoReconnect: { + retries: () => true, + delay: 10000, + onFailed() { + console.log('重新连接失败') + }, + }, + heartbeat: { + message: '{"type":"ping"}', + interval: 55000, + pongTimeout: 3000, + }, + onConnected, + onDisconnected, + onError, + onMessage, + }, + ) + SOCKET.send( + JSON.stringify({ + type: 'ping', + }), + ) + } + + const onConnected = (ws: WebSocket) => { + // ws.binaryType = 'arraybuffer'; + // console.log('ws已连接'); + } + + const onDisconnected = (ws: WebSocket, event: CloseEvent) => { + if (!token.value) { + stop() + SOCKET = null as any + } + // console.log('ws已关闭', event); + } + + const onError = (ws: WebSocket, event: Event) => { + // console.log(ws, event); + } + + const onMessage = (ws: WebSocket, event: MessageEvent) => { + const data = JSON.parse(event.data) + + // 确认接收 + sendMsg({ + type: SOCKET_MSG_TYPE.messageReceive, + msg: data.msg, + }) + + // 全局消息提醒 + if (data.type === SOCKET_MSG_TYPE.systemMessage) { + useTips({ + tips: data.msg, + showCancel: false, + }) + return + } + + // if (isWeb) return; + switch (data.type) { + case SOCKET_MSG_TYPE.lockScreen: + if (isNotStudyMachine) return + // 执行锁屏 + system.value.isLock = true + useLog(LogType.LockScreenTime, { + simSerialNumber: SN, + lockFlag: 1, + }) + break + case SOCKET_MSG_TYPE.unLockScreen: + if (isNotStudyMachine) return + // 执行解锁 + system.value.isLock = false + useLog(LogType.LockScreenTime, { + simSerialNumber: SN, + lockFlag: 0, + }) + break + case SOCKET_MSG_TYPE.desktopPreview: + if (isNotStudyMachine) return + onDesktopPreview() + break + case SOCKET_MSG_TYPE.inspectorStart: + // 开始督学 + // console.log('开始督学'); + getInspectorInfo() + .then(() => router.push('/urge/learning')) + .catch(() => { + const _router = useRouter() + _router.push('/urge/learning') + }) // 更新督学信息 + break + case SOCKET_MSG_TYPE.inspectorEnd: + // 结束督学 + // console.log('结束督学'); + inspectorEnd.value = data.msg + getInspectorInfo() + .then(() => router.push('/')) + .catch(() => { + const _router = useRouter() + _router.push('/') + }) // 更新督学信息 + break + case SOCKET_MSG_TYPE.inspectorTalkMessage: + inspectorMessage.value = data.msg + break + } + } + + // 桌面预览 + const onDesktopPreview = async () => { + try { + const { data: filePath } = $XXL.getScreenshot() + // console.log('截图本地地址', filePath); + if (!filePath) + return sendMsg({ + type: 'desktopScreenshotImage', + userId: userInfo.value.userId, + simSerialNumber: SN, + msg: '', + }) + const res = await $XXL.uploadFile({ + url: `${import.meta.env.VITE_SERVER_URL}/sysFileInfo/tenUploadAll`, + header: { + Authorization: token, + }, + filePath, + fileKey: 'file', + }) + sendMsg({ + type: 'desktopScreenshotImage', + userId: userInfo.value.userId, + simSerialNumber: SN, + msg: res.url, + }) + } catch (err) { + console.log(err) + } + } + + // 发送消息 + const sendMsg = (data: anyObj, config = {}) => { + if (!SOCKET) { + // console.error('ws不存在'); + return + } + SOCKET.send(JSON.stringify(data)) + } + + const textToBuffer = (str: string) => { + return new TextEncoder().encode(str) + } + + const bufferToText = (buffer: ArrayBuffer) => { + return new TextDecoder().decode(buffer) + } + + const stop = () => { + SOCKET?.close() + } + + return { + init, + stop, + sendMsg, + inspectorEnd, + inspectorMessage, + } +} diff --git a/src/hooks/useSound.ts b/src/hooks/useSound.ts new file mode 100644 index 0000000..bebb4ba --- /dev/null +++ b/src/hooks/useSound.ts @@ -0,0 +1,12 @@ +import { globalStore } from '@/stores' +import { useAudio } from './useAudio' + +export const useSound = (url: string) => { + const { system } = globalStore() + if (!system.volume.effectsStatus) return + useAudio({ + url, + autoplay: true, + volume: system.volume.effectsVolume / 100, + }) +} diff --git a/src/hooks/useSubject.ts b/src/hooks/useSubject.ts new file mode 100644 index 0000000..0a2ba5d --- /dev/null +++ b/src/hooks/useSubject.ts @@ -0,0 +1,41 @@ +export const rateType = computed(() => { + return (rate: number) => { + if (rate >= 10000) { + return 'success' + } else if (rate >= 8000) { + return 'primary' + } else if (rate >= 6000) { + return 'warning' + } else { + return 'error' + } + } +}) + +export const EncourageLanguage = computed(() => { + return (rate: number) => { + if (rate >= 10000) { + return '超凡实力,名不虚传!' + } else if (rate >= 9000) { + return '你离完美只有一步之遥!' + } else if (rate >= 8000) { + return '实力不凡,继续冲刺!' + } else if (rate >= 7000) { + return '值得骄傲,向完美进发!' + } else if (rate >= 6000) { + return '基础不错,继续提升!' + } else if (rate >= 5000) { + return '有进步空间,继续加油!' + } else if (rate >= 4000) { + return '不要气馁,继续努力!' + } else if (rate >= 3000) { + return '坚持不懈,成功在望!' + } else if (rate >= 2000) { + return '勇往直前,不怕失败!' + } else if (rate >= 1000) { + return '没关系,失败是成功的爸爸!' + } else { + return '跌倒了,爬起来再战!' + } + } +}) diff --git a/src/hooks/useTeacherExplain.ts b/src/hooks/useTeacherExplain.ts new file mode 100644 index 0000000..9c7a3ed --- /dev/null +++ b/src/hooks/useTeacherExplain.ts @@ -0,0 +1,379 @@ +/** + * 老师讲解 WebSocket 连接管理 + * + * 功能说明: + * 1. 系统加载时连接 WebSocket 服务(地址从环境变量 VITE_WS_URL 读取) + * 2. 连接成功后,调用接口 /school/questionExplain/myClass 获取班级信息 + * 3. 获取到班级后,发送订阅消息:{"type":"subscribeTopic","msg":"class:{classId}"} + * 4. 每 30 秒发送一次心跳保活 + * 5. 收到的消息统一处理,支持注册自定义消息回调 + * 6. 断线自动重连 + */ +import { ref, shallowRef } from 'vue' +import questionExplainApi from '@/api/subject/questionExplain' +import { getCache } from '@/utils' +import { userStore } from '@/stores' + +// ======================== 常量配置 ======================== + +/** 心跳发送间隔(毫秒) */ +const HEARTBEAT_INTERVAL = 30_000 + +/** 断线重连延迟(毫秒) */ +const RECONNECT_DELAY = 5_000 + +/** 最大重连次数,超过后停止重连 */ +const MAX_RECONNECT_ATTEMPTS = 20 + +// ======================== 类型定义 ======================== + +/** WebSocket 连接状态枚举 */ +export enum TeacherWsState { + /** 未连接 */ + DISCONNECTED = 'disconnected', + /** 连接中 */ + CONNECTING = 'connecting', + /** 已连接 */ + CONNECTED = 'connected', +} + +/** WebSocket 消息结构 */ +export interface TeacherWsMessage { + type: string + msg?: any + [key: string]: any +} + +/** 消息回调函数类型 */ +type MessageHandler = (data: TeacherWsMessage) => void + +// ======================== 模块级单例状态 ======================== +// 保证全局只有一个 WebSocket 连接实例 + +let ws: WebSocket | null = null +let heartbeatTimer: ReturnType | null = null +let reconnectTimer: ReturnType | null = null +let reconnectAttempts = 0 +let isManualClose = false +let visibilityHandler: (() => void) | null = null + +/** 外部注册的消息处理回调集合 */ +const messageHandlers: Set = new Set() + +/** 连接状态(响应式) */ +const connectionState = ref(TeacherWsState.DISCONNECTED) + +/** 最新收到的消息(响应式) */ +const lastMessage = shallowRef(null) + +/** 班级信息(响应式) */ +const classInfo = ref(null) + +// ======================== 内部方法 ======================== + +/** 获取带 token 的 WebSocket 连接地址 */ +function getWsUrl(): string { + const base = import.meta.env.VITE_WS_URL || '' + if (!base) return '' + const token = getCache('token') || '' + return `${base}?token=${encodeURIComponent(token)}` +} + +/** 启动心跳定时器,每 30 秒发送一次 ping */ +function startHeartbeat() { + stopHeartbeat() + heartbeatTimer = setInterval(() => { + sendMessage({ type: 'ping', msg: '' }) + }, HEARTBEAT_INTERVAL) +} + +/** 停止心跳定时器 */ +function stopHeartbeat() { + if (heartbeatTimer) { + clearInterval(heartbeatTimer) + heartbeatTimer = null + } +} + +/** 清除重连定时器 */ +function clearReconnectTimer() { + if (reconnectTimer) { + clearTimeout(reconnectTimer) + reconnectTimer = null + } +} + +/** 尝试自动重连 */ +function tryReconnect() { + if (isManualClose) return + if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) { + console.error('[TeacherExplain] 已达到最大重连次数,停止重连') + return + } + clearReconnectTimer() + reconnectTimer = setTimeout(() => { + reconnectAttempts++ + console.log(`[TeacherExplain] 第 ${reconnectAttempts} 次重连...`) + connect() + }, RECONNECT_DELAY) +} + +/** + * 建立 WebSocket 连接 + * 如果已有活跃连接则跳过 + */ +function connect() { + if (ws && ws.readyState === WebSocket.OPEN) return + + const url = getWsUrl() + if (!url) { + console.error('[TeacherExplain] WebSocket 地址未配置,请检查环境变量 VITE_WS_URL') + return + } + + connectionState.value = TeacherWsState.CONNECTING + isManualClose = false + + try { + ws = new WebSocket(url) + } catch (err) { + console.error('[TeacherExplain] WebSocket 创建失败:', err) + tryReconnect() + return + } + + ws.onopen = () => { + console.log('[TeacherExplain] WebSocket 已连接') + connectionState.value = TeacherWsState.CONNECTED + reconnectAttempts = 0 + + // 连接成功后,订阅已获取的班级 + subscribeClass() + + // 启动心跳 + startHeartbeat() + + // 查询当前讲解状态,结果走消息分发 + fetchCurrentExplainStatus() + } + + ws.onclose = (event: CloseEvent) => { + console.log('[TeacherExplain] WebSocket 已断开, code:', event.code) + connectionState.value = TeacherWsState.DISCONNECTED + stopHeartbeat() + + // 非手动关闭时自动重连 + if (!isManualClose) { + tryReconnect() + } + } + + ws.onerror = (event: Event) => { + console.error('[TeacherExplain] WebSocket 连接错误:', event) + } + + ws.onmessage = (event: MessageEvent) => { + try { + // console.log('[TeacherExplain] 收到消息:', event) + const rawData = (event.data as string).replace(/"recordId"\s*:\s*(\d+)/g, '"recordId":"$1"') + const data: TeacherWsMessage = JSON.parse(rawData) + lastMessage.value = data + console.log('[TeacherExplain] 收到消息:', data) + handleMessage(data) + } catch (err) { + console.error('[TeacherExplain] 消息解析失败:', event.data) + } + } +} + +/** + * 统一消息处理入口 + * 内部分发 + 调用外部注册的回调 + */ +function handleMessage(data: TeacherWsMessage) { + // 心跳响应不做业务处理 + if (data.type === 'pong') return + + // 调用所有已注册的外部消息回调 + messageHandlers.forEach(handler => { + try { + handler(data) + } catch (err) { + console.error('[TeacherExplain] 消息回调执行异常:', err) + } + }) +} + +/** 订阅班级主题(API 返回 { classId: '...' },拼接为 "class:{classId}" 发送订阅) */ +function subscribeClass() { + if (!classInfo.value?.classId) return + + const classId = String(classInfo.value.classId) + sendMessage({ + type: 'subscribeTopic', + msg: 'class:' + classId, + }) + console.log(`[TeacherExplain] 已订阅班级: ${classId}`) +} + +/** 查询当前讲解状态,将结果伪装成 WebSocket 消息分发给所有回调 */ +async function fetchCurrentExplainStatus() { + const classId = classInfo.value?.classId + if (!classId) return + + try { + const res = await questionExplainApi.current(String(classId)) + console.log('[TeacherExplain] 当前讲解状态:', res) + if (!res) return + + const type = res.explaining ? 'questionExplainStart' : 'questionExplainStop' + handleMessage({ type, msg: res }) + } catch (err) { + console.warn('[TeacherExplain] 查询当前讲解状态失败:', err) + } +} + +// ======================== 对外暴露方法 ======================== + +/** + * 发送 WebSocket 消息 + * @param data 消息体,会被 JSON.stringify 后发送 + */ +function sendMessage(data: TeacherWsMessage) { + if (!ws || ws.readyState !== WebSocket.OPEN) { + console.warn('[TeacherExplain] WebSocket 未连接,消息发送失败:', data) + return + } + console.log('[TeacherExplain] 发送消息:', data) + ws.send(JSON.stringify(data)) +} + +/** + * 注册消息处理回调 + * 可在任意组件中调用,收到消息时会触发所有已注册的回调 + * @param handler 回调函数 + * @returns 取消注册的函数 + */ +function onMessage(handler: MessageHandler): () => void { + messageHandlers.add(handler) + return () => { + messageHandlers.delete(handler) + } +} + +/** + * 初始化老师讲解 WebSocket + * 流程:获取班级信息 → 建立 WebSocket 连接 → 订阅班级 → 启动心跳 + */ +async function init() { + const schoolId = userStore().userInfo?.schoolClass?.[0]?.schoolId + if (Number(schoolId) === 125) { + try { + const res = await questionExplainApi.myClass() + classInfo.value = res + console.log('[TeacherExplain] 获取班级信息成功:', res) + } catch (err) { + console.warn('[TeacherExplain] 获取班级信息失败,仍尝试连接 WebSocket:', err) + } + } + + connect() + startVisibilityListener() +} + +/** 关闭 WebSocket 连接并清理所有资源 */ +function close() { + isManualClose = true + stopHeartbeat() + clearReconnectTimer() + stopVisibilityListener() + reconnectAttempts = 0 + + if (ws) { + ws.onclose = null + ws.onerror = null + ws.onmessage = null + ws.onopen = null + ws.close() + ws = null + } + + connectionState.value = TeacherWsState.DISCONNECTED +} + +/** 断开并重新初始化(重新登录 / 页面恢复可见时调用) */ +async function reconnect() { + console.log('[TeacherExplain] 重新连接...') + close() + await init() +} + +/** 页面恢复可见时:WS 断开则重连,未断开则刷新讲解状态 */ +function onVisibilityChange() { + if (document.hidden) return + console.log('[TeacherExplain] 页面恢复可见') + if (!ws || ws.readyState !== WebSocket.OPEN) { + reconnect() + } else { + fetchCurrentExplainStatus() + } +} + +function startVisibilityListener() { + stopVisibilityListener() + visibilityHandler = onVisibilityChange + document.addEventListener('visibilitychange', visibilityHandler) +} + +function stopVisibilityListener() { + if (visibilityHandler) { + document.removeEventListener('visibilitychange', visibilityHandler) + visibilityHandler = null + } +} + +/** + * 老师讲解 WebSocket 组合式函数 + * + * @example + * ```ts + * const { init, close, sendMessage, onMessage, connectionState, lastMessage, classInfo } = useTeacherExplain() + * + * // 初始化连接 + * init() + * + * // 注册消息回调 + * const unregister = onMessage((data) => { + * console.log('收到消息:', data) + * }) + * + * // 组件卸载时取消回调 + * onUnmounted(() => unregister()) + * + * // 主动发送消息 + * sendMessage({ type: 'customType', msg: 'hello' }) + * + * // 关闭连接 + * close() + * ``` + */ +export const useTeacherExplain = () => { + return { + /** 初始化连接(获取班级 → 连接 WebSocket → 订阅 → 心跳) */ + init, + /** 关闭连接并清理资源 */ + close, + /** 断开并重新初始化(重新登录时调用) */ + reconnect, + /** 发送消息 */ + sendMessage, + /** 注册消息回调,返回取消注册函数 */ + onMessage, + /** 连接状态(响应式) */ + connectionState, + /** 最新收到的消息(响应式) */ + lastMessage, + /** 班级信息(响应式) */ + classInfo, + } +} diff --git a/src/hooks/useTips.ts b/src/hooks/useTips.ts new file mode 100644 index 0000000..7b08e58 --- /dev/null +++ b/src/hooks/useTips.ts @@ -0,0 +1,42 @@ +import { ref, createVNode, render } from 'vue' +import XDia from '@c/XDia/index.vue' + +interface Tips_Config { + title?: string + html?: string + tips?: string + zIndex?: number + showCancel?: boolean + showClose?: boolean + 'close-on-click-modal'?: boolean + 'close-on-press-escape'?: boolean + onOk?: (...args: any[]) => void +} + +export const useTips = (config: Tips_Config) => { + const container = document.createElement('div') + const dia = createVNode(XDia, { + modelValue: true, + title: config.title || '提示', + showCancel: config.showCancel || false, + ...config, + onOk: async () => { + dia.component!.props.loading = true + config.onOk && (await config.onOk()) + close() + }, + onCancel: () => { + close() + }, + }) + + const close = () => { + dia.component!.props.modelValue = false + setTimeout(() => { + render(null, container) + }, 300) + } + + render(dia, container) + document.querySelector('body')?.appendChild(container.firstElementChild!) +} diff --git a/src/hooks/useTools.ts b/src/hooks/useTools.ts new file mode 100644 index 0000000..6d28a3b --- /dev/null +++ b/src/hooks/useTools.ts @@ -0,0 +1,28 @@ +import { XMessage } from '@/hooks' + +// eslint-disable-next-line max-params +export const debounce = function ( + fn: (...args: any[]) => void, + delay = 200, + immediate = true, + toast = false, +) { + let timer: number | null + return function (this: any, ...args: any[]) { + if (timer) { + toast && XMessage.info('请勿频繁操作') + clearTimeout(timer) + } + if (immediate) { + !timer && fn.apply(this, args) + timer = setTimeout(() => { + timer = null + }, delay) + } else { + timer = setTimeout(() => { + fn.apply(this, args) + timer = null + }, delay) + } + } +} diff --git a/src/layouts/android.json b/src/layouts/android.json new file mode 100644 index 0000000..43be47d --- /dev/null +++ b/src/layouts/android.json @@ -0,0 +1,124 @@ +{ + "list": [ + { + "label": "截图", + "method": "getScreenshot" + }, + { + "label": "打开应用", + "method": "openApp", + "value": -1 + }, + { + "label": "杀死应用", + "method": "killApp", + "value": -1 + }, + { + "label": "卸载应用", + "method": "uninstallApp", + "value": -1 + }, + { + "label": "杀死当前应用", + "method": "killCurrentApp" + }, + { + "label": "应用是否运行", + "method": "isAppRunning", + "value": -1 + }, + { + "label": "获取所有应用", + "method": "getAppsInfo" + }, + { + "label": "打开文件", + "method": "openFile" + }, + + { + "label": "硬件信息", + "method": "getDeviceInfo" + }, + { + "label": "网络情况", + "method": "isNetworkAvailable" + }, + { + "label": "打开wifi", + "method": "openWiFi" + }, + { + "label": "打开设置", + "method": "openSetting" + }, + { + "label": "锁屏", + "method": "lockScreen" + }, + { + "label": "桌面", + "method": "gotoHome" + }, + { + "label": "刷新", + "method": "refresh" + }, + { + "label": "强制刷新", + "method": "forceRefresh" + }, + { + "label": "设置音量", + "method": "setVolume", + "value": 1 + }, + { + "label": "设置亮度", + "method": "setBrightness", + "value": 255 + }, + { + "label": "清理内存", + "method": "clearMemory" + }, + { + "label": "关机", + "method": "shutdown" + }, + { + "label": "重启", + "method": "reboot" + }, + { + "label": "屏幕常亮", + "method": "setScreenOn", + "value": 1 + }, + { + "label": "版本信息", + "method": "getVersionCode" + }, + { + "label": "设置缓存", + "method": "setData", + "key": "aaa", + "value": "123" + }, + { + "label": "获取缓存", + "method": "getData", + "value": "aaa" + }, + { + "label": "清除缓存", + "method": "removeData", + "value": "aaa" + }, + { + "label": "清除所有缓存", + "method": "removeAllData" + } + ] +} diff --git a/src/layouts/app.json b/src/layouts/app.json new file mode 100644 index 0000000..964e87a --- /dev/null +++ b/src/layouts/app.json @@ -0,0 +1,1086 @@ +{ + "list": [ + { + "app": "AR指读/AR绘本", + "pkg": "com.jxw.huiben", + "cls": "com.jxw.huiben.activity.SplashActivity", + "flags": 1, + "buttons": [ + { + "label": "打开K12指读", + "extra": { + "StartArgs": "keben" + } + }, + { + "label": "打开绘本", + "extra": { + "StartArgs": "huiben" + } + } + ] + }, + { + "app": "Ai精准学", + "pkg": "com.jxw.question", + "cls": "com.jxw.question.activity.SplashActivity", + "flags": 1, + "buttons": [ + { + "label": "打开AI题库主页面", + "extra": { + "tiku_func_type": "1" + } + }, + { + "label": "打开AI题库阶段测", + "extra": { + "tiku_func_type": "2" + } + }, + { + "label": "打开AI题库组卷中心", + "extra": { + "tiku_func_type": "3" + } + }, + { + "label": "打开AI题库错题本", + "extra": { + "tiku_func_type": "4" + } + }, + { + "label": "打开AI题库收藏", + "extra": { + "tiku_func_type": "5" + } + } + ] + }, + { + "app": "同步辅导", + "pkg": "com.jxw.online_study", + "cls": "com.jxw.online_study.activity.BookCaseWrapperActivity", + "flags": 1, + "buttons": [ + { + "label": "语文", + "extra": { + "StartArgs": "d:/同步学习/语文|e:JWFD" + } + }, + { + "label": "数学", + "extra": { + "StartArgs": "d:/同步学习/数学|e:JWFD" + } + }, + { + "label": "英语", + "extra": { + "StartArgs": "d:/同步学习/英语|e:JWFD" + } + }, + { + "label": "物理", + "extra": { + "StartArgs": "d:/同步学习/物理|e:JWFD" + } + }, + { + "label": "化学", + "extra": { + "StartArgs": "d:/同步学习/化学|e:JWFD" + } + }, + { + "label": "生物", + "extra": { + "StartArgs": "d:/同步学习/生物|e:JWFD" + } + }, + { + "label": "历史", + "extra": { + "StartArgs": "d:/同步学习/历史|e:JWFD" + } + }, + { + "label": "地理", + "extra": { + "StartArgs": "d:/同步学习/地理|e:JWFD" + } + }, + { + "label": "政治", + "extra": { + "StartArgs": "d:/同步学习/政治|e:JWFD" + } + }, + { + "label": "科学", + "extra": { + "StartArgs": "d:/同步学习/科学|e:JWFD" + } + } + ] + }, + { + "app": "同步视频", + "pkg": "com.jxw.newyouer.video", + "cls": "com.jxw.newyouer.activity.ExecellentActivity", + "flags": 1, + "buttons": [ + { + "label": "语文", + "extra": { + "StartArgs": "同步视频|语文" + } + }, + { + "label": "数学", + "extra": { + "StartArgs": "同步视频|数学" + } + }, + { + "label": "英语", + "extra": { + "StartArgs": "同步视频|英语" + } + }, + { + "label": "物理", + "extra": { + "StartArgs": "同步视频|物理" + } + }, + { + "label": "化学", + "extra": { + "StartArgs": "同步视频|化学" + } + }, + { + "label": "生物", + "extra": { + "StartArgs": "同步视频|生物" + } + }, + { + "label": "历史", + "extra": { + "StartArgs": "同步视频|历史" + } + }, + { + "label": "地理", + "extra": { + "StartArgs": "同步视频|地理" + } + }, + { + "label": "政治", + "extra": { + "StartArgs": "同步视频|政治" + } + }, + { + "label": "科学", + "extra": { + "StartArgs": "同步视频|科学" + } + } + ] + }, + { + "app": "实验室分学科调用", + "pkg": "com.jxw.laboratory", + "cls": "com.jxw.laboratory.SYSActivity", + "buttons": [ + { + "label": "物理", + "extra": { + "StartArgs": "物理实验室" + } + }, + { + "label": "化学", + "extra": { + "StartArgs": "化学实验室" + } + }, + { + "label": "生物", + "extra": { + "StartArgs": "生物实验室" + } + } + ] + }, + { + "app": "语文写作", + "pkg": "com.jxw.yuwenxiezuo", + "cls": "com.jxw.yuwenxiezuo.MainActivity", + "buttons": [ + { + "label": "小学", + "extra": { + "StartArgs": "小学" + } + }, + { + "label": "中学", + "extra": { + "StartArgs": "中学" + } + } + ] + }, + { + "app": "古诗词", + "pkg": "com.jxw.online_study", + "cls": "com.jxw.online_study.activity.XBookStudyActivity", + "buttons": [ + { + "label": "小学", + "extra": { + "StartArgs": "f:/ansystem/固化数据/小学古诗词.JXW" + } + }, + { + "label": "中学", + "extra": { + "StartArgs": "f:/ansystem/固化数据/中学古诗词.JXW" + } + } + ] + }, + { + "app": "素质拓展", + "pkg": "com.jxw.newyouer.video", + "cls": "com.jxw.newyouer.activity.QualityActivity", + "buttons": [ + { + "label": "美术", + "extra": { + "StartArgs": "美术" + } + }, + { + "label": "书法", + "extra": { + "StartArgs": "书法" + } + }, + { + "label": "中华文化", + "extra": { + "StartArgs": "中华文化" + } + }, + { + "label": "绘本动画", + "extra": { + "StartArgs": "绘本动画" + } + }, + { + "label": "儿歌律动", + "extra": { + "StartArgs": "儿歌律动" + } + }, + { + "label": "有声故事", + "extra": { + "StartArgs": "有声故事" + } + }, + { + "label": "生活百科", + "extra": { + "StartArgs": "生活百科" + } + } + ] + }, + { + "app": "专题视频", + "pkg": "com.jxw.newyouer.video", + "cls": "com.jxw.newyouer.activity.SpecialVideoActivity", + "flags": 1, + "buttons": [ + { + "label": "英语小学写作大本营", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/英语/小学/写作大本营" + } + }, + { + "label": "英语小学拼读大闯关", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/英语/小学/拼读大闯关" + } + }, + { + "label": "英语初中写作大提升", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/英语/初中/写作大提升" + } + }, + { + "label": "英语初中语法大全", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/英语/初中/语法大全" + } + }, + { + "label": "英语高中写作大提升", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/英语/高中/写作大提升" + } + }, + { + "label": "英语高中语法大全", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/英语/高中/语法大全" + } + }, + { + "label": "语文阅读与写作小学", + "extra": { + "StartArgs": "专区数据/专题精品课/语文阅读与写作/小学" + } + }, + { + "label": "语文阅读与写作初中", + "extra": { + "StartArgs": "专区数据/专题精品课/语文阅读与写作/初中" + } + }, + { + "label": "语文阅读与写作高中", + "extra": { + "StartArgs": "专区数据/专题精品课/语文阅读与写作/高中" + } + }, + { + "label": "超越奥数", + "extra": { + "StartArgs": "专区数据/专题精品课/超越奥数" + } + }, + { + "label": "少儿英语自然拼读", + "extra": { + "StartArgs": "专区数据/英语广角/少儿英语/自然拼读" + } + }, + { + "label": "初中数学动态几何", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/数学/初中/动态几何" + } + }, + { + "label": "初中数学变量与函数", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/数学/初中/变量与函数" + } + }, + { + "label": "初中数学图形的认识", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/数学/初中/图形的认识" + } + }, + { + "label": "初中数学圆", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/数学/初中/圆" + } + }, + { + "label": "初中数学数与式", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/数学/初中/数与式" + } + }, + { + "label": "初中数学方程与不等式", + "extra": { + "StartArgs": "专区数据/学王视频/专题视频/数学/初中/方程与不等式" + } + } + ] + }, + { + "app": "知识点视频", + "pkg": "com.jxw.newyouer.video", + "cls": "com.jxw.newyouer.activity.ExecellentActivity", + "flags": 1, + "buttons": [ + { + "label": "数学", + "extra": { + "StartArgs": "知识点视频|数学" + } + } + ] + }, + { + "app": "固化数据", + "pkg": "com.jxw.online_study", + "cls": "com.jxw.online_study.activity.XBookStudyActivity", + "flags": 1, + "buttons": [ + { + "label": "小学趣味数学", + "extra": { + "StartArgs": "f:/ansystem/固化数据/小学趣味数学.JXW" + } + }, + { + "label": "中学方程精解", + "extra": { + "StartArgs": "f:/ansystem/固化数据/中学方程精解.JXW" + } + }, + { + "label": "备战中高考", + "extra": { + "StartArgs": "f:/ansystem/固化数据/备战中高考.JXW" + } + }, + { + "label": "小学应用题训练", + "extra": { + "StartArgs": "f:/ansystem/固化数据/小学应用题训练.JXW" + } + }, + { + "label": "中学标点符号", + "extra": { + "StartArgs": "f:/ansystem/固化数据/中学标点符号.JXW" + } + }, + { + "label": "中学文言文", + "extra": { + "StartArgs": "f:/ansystem/固化数据/中学文言文.JXW" + } + }, + { + "label": "中学修辞方法", + "extra": { + "StartArgs": "f:/ansystem/固化数据/中学修辞方法.JXW" + } + }, + { + "label": "英语句型", + "extra": { + "StartArgs": "f:/ansystem/固化数据/英语句型.JXW" + } + }, + { + "label": "中学口语交际", + "extra": { + "StartArgs": "f:/ansystem/固化数据/中学口语交际.JXW" + } + }, + { + "label": "趣味英语", + "extra": { + "StartArgs": "f:/ansystem/固化数据/趣味英语.JXW" + } + }, + { + "label": "小学英语词汇", + "extra": { + "StartArgs": "f:/ansystem/固化数据/小学英语词汇.JXW" + } + }, + { + "label": "中学听力训练", + "extra": { + "StartArgs": "f:/ansystem/固化数据/中学听力训练.JXW" + } + }, + { + "label": "小学英语写作", + "extra": { + "StartArgs": "f:/ansystem/固化数据/小学英语写作.JXW" + } + }, + { + "label": "小学英语阅读", + "extra": { + "StartArgs": "f:/ansystem/固化数据/小学英语阅读.JXW" + } + }, + { + "label": "小学阅读指导", + "extra": { + "StartArgs": "f:/ansystem/固化数据/小学阅读指导.JXW" + } + }, + { + "label": "中学基础语音", + "extra": { + "StartArgs": "f:/ansystem/固化数据/中学基础语音.JXW" + } + }, + { + "label": "中学几何定理", + "extra": { + "StartArgs": "f:/ansystem/固化数据/中学几何定理.JXW" + } + }, + { + "label": "小学数学公式", + "extra": { + "StartArgs": "f:/ansystem/固化数据/小学数学公式.JXW" + } + }, + { + "label": "小学中华宝典", + "extra": { + "StartArgs": "f:/ansystem/固化数据/小学中华宝典.JXW" + } + }, + { + "label": "小学奥数训练", + "extra": { + "StartArgs": "f:/ansystem/固化数据/小学奥数训练.JXW" + } + }, + { + "label": "小学口语交际", + "extra": { + "StartArgs": "f:/ansystem/固化数据/小学口语交际.JXW" + } + }, + { + "label": "中学公式大全", + "extra": { + "StartArgs": "f:/ansystem/固化数据/中学公式大全.JXW" + } + } + ] + }, + { + "app": "背单词", + "pkg": "com.jxw.wuweijidanci", + "cls": "com.jxw.wuweijidanci.ReciteWordActivity", + "flags": 1, + "buttons": [ + { + "label": "启动背单词", + "extra": { + "StartArgs": "true" + } + } + ] + }, + { + "app": "学单词", + "pkg": "com.jxw.wuweijidanci", + "cls": "com.jxw.wuweijidanci.StudyWordActivity", + "flags": 1, + "buttons": [ + { + "label": "启动学单词", + "extra": { + "StartArgs": "true" + } + } + ] + }, + { + "app": "外教带你学英语", + "pkg": "com.jxw.newyouer.video", + "cls": "com.jxw.newyouer.activity.SpecialVideoActivity", + "flags": 1, + "buttons": [ + { + "label": "启动外教带你学英语", + "extra": { + "StartArgs": "专区数据/专题精品课/外教带你学英语" + } + } + ] + }, + { + "app": "动漫学成语", + "pkg": "com.jxw.newyouer.video", + "cls": "com.jxw.newyouer.activity.SpecialVideoActivity", + "flags": 1, + "buttons": [ + { + "label": "启动动漫学成语", + "extra": { + "StartArgs": "专区数据/动漫学习/动漫学成语" + } + } + ] + }, + { + "app": "字母学习", + "pkg": "com.jxw.mskt.video", + "cls": "com.jxw.mskt.video.VideoTopicActivity", + "flags": 1, + "buttons": [ + { + "label": "启动字母学习", + "extra": { + "isTopic": true, + "isYYGJ": true, + "url": "http://api4.jiumentongbu.com/api/jwfd/baseapp/url?filePath=专区数据/英语广角/幼儿启蒙/ABC字母/menu.json" + } + } + ] + }, + { + "app": "考前冲刺", + "pkg": "com.jxw.newyouer.video", + "cls": "com.jxw.newyouer.activity.ExamSprintActivity", + "flags": 1, + "buttons": [ + { + "label": "数学 - 中考第一轮复习", + "extra": { + "title": "中考第一轮复习", + "subject": "数学", + "index": 0 + } + }, + { + "label": "数学 - 中考第二轮复习", + "extra": { + "title": "中考第二轮复习", + "subject": "数学", + "index": 1 + } + }, + { + "label": "数学 - 中考专题系统复习", + "extra": { + "title": "中考专题系统复习", + "subject": "数学", + "index": 2 + } + }, + { + "label": "数学 - 高考专题系统复习", + "extra": { + "title": "高考专题系统复习", + "subject": "数学", + "index": 3 + } + }, + { + "label": "语文 - 小升初作文专项", + "extra": { + "title": "小升初作文专项", + "subject": "语文", + "index": 0 + } + }, + { + "label": "语文 - 小升初考点专项", + "extra": { + "title": "小升初考点专项", + "subject": "语文", + "index": 1 + } + }, + { + "label": "语文 - 小升初古诗词专项", + "extra": { + "title": "小升初古诗词专项", + "subject": "语文", + "index": 2 + } + }, + { + "label": "语文 - 中考考点专项", + "extra": { + "title": "中考考点专项", + "subject": "语文", + "index": 3 + } + }, + { + "label": "英语 - 中考语法大全", + "extra": { + "title": "中考语法大全", + "subject": "英语", + "index": 0 + } + }, + { + "label": "英语 - 中考写作大提升", + "extra": { + "title": "中考写作大提升", + "subject": "英语", + "index": 1 + } + }, + { + "label": "英语 - 高考语法大全", + "extra": { + "title": "高考语法大全", + "subject": "英语", + "index": 2 + } + }, + { + "label": "英语 - 高考写作大提升", + "extra": { + "title": "高考写作大提升", + "subject": "英语", + "index": 3 + } + }, + { + "label": "物理中考专项", + "extra": { + "title": "物理中考专项", + "subject": "物理", + "index": 0 + } + }, + { + "label": "化学中考专项", + "extra": { + "title": "化学中考专项", + "subject": "化学", + "index": 0 + } + }, + { + "label": "生物会考专项", + "extra": { + "title": "生物会考专项", + "subject": "生物", + "index": 0 + } + }, + { + "label": "地理会考专项", + "extra": { + "title": "地理会考专项", + "subject": "地理", + "index": 0 + } + } + ] + }, + { + "app": "单词大讲堂", + "pkg": "com.jxw.newyouer.video", + "cls": "com.jxw.newyouer.activity.WordLectureActivity", + "flags": 1, + "buttons": [ + { + "label": "一年级 - 人教版", + "extra": { + "gradeName": "一年级", + "pressName": "人教版" + } + }, + { + "label": "二年级 - 人教版", + "extra": { + "gradeName": "二年级", + "pressName": "人教版" + } + }, + { + "label": "三年级 - 人教版", + "extra": { + "gradeName": "三年级", + "pressName": "人教版" + } + }, + { + "label": "四年级 - 人教版", + "extra": { + "gradeName": "四年级", + "pressName": "人教版" + } + }, + { + "label": "五年级 - 人教版", + "extra": { + "gradeName": "五年级", + "pressName": "人教版" + } + }, + { + "label": "六年级 - 人教版", + "extra": { + "gradeName": "六年级", + "pressName": "人教版" + } + }, + { + "label": "七年级 - 人教版", + "extra": { + "gradeName": "七年级", + "pressName": "人教版" + } + }, + { + "label": "八年级 - 人教版", + "extra": { + "gradeName": "八年级", + "pressName": "人教版" + } + }, + { + "label": "九年级 - 人教版", + "extra": { + "gradeName": "九年级", + "pressName": "人教版" + } + } + ] + }, + { + "app": "应用启动(不携带参数)", + "buttons": [ + { + "label": "拍照搜题", + "pkg": "com.jxw.souti", + "cls": "com.jxw.souti.ui.activity.MainActivity", + "flags": 1 + }, + { + "label": "作文批改", + "pkg": "com.jxw.gb.zwpg", + "cls": "com.jxw.gb.zwpg.ui.activity.MainActivity", + "flags": 1 + }, + { + "label": "课程表", + "pkg": "com.jxw.classtable", + "cls": "com.jxw.classtable.MainActivity", + "flags": 1 + }, + { + "label": "认识数字", + "pkg": "com.jxw.studydigital", + "cls": "com.jxw.studydigital.StuDydigitalActivity", + "flags": 1 + }, + { + "label": "四则运算", + "pkg": "com.jxw.jxwcalculator", + "cls": "com.jxw.jxwcalculator.LancherActivity", + "flags": 1 + }, + { + "label": "元素周期表", + "pkg": "com.example.elementcycleapp", + "cls": "com.example.elementcycleapp.MainActivity", + "flags": 1 + }, + { + "label": "专注力训练", + "pkg": "com.jxw.schultegrid", + "cls": "com.jxw.schultegrid.SettingActivity", + "flags": 1 + }, + { + "label": "汉字学习", + "pkg": "com.jxw.characterlearning", + "cls": "com.jxw.characterlearning.MainActivity", + "flags": 1 + }, + { + "label": "拼音学习", + "pkg": "com.jxw.learnchinesepinyin", + "cls": "com.jxw.learnchinesepinyin.activity.MainActivity", + "flags": 1 + }, + { + "label": "偏旁部首", + "pkg": "com.example.pianpangbushou", + "cls": "com.example.viewpageindicator.MainActivity", + "flags": 1 + }, + { + "label": "趣味语文", + "pkg": "com.jxw.online_study", + "cls": "com.jxw.online_study.activity.InterestingLanguageActivity", + "flags": 1 + }, + { + "label": "笔画名称", + "pkg": "com.jxw.bihuamingcheng", + "cls": "com.example.viewpageindicator.MainActivity", + "flags": 1 + }, + { + "label": "算数口诀", + "pkg": "com.example.arithmeticformula", + "cls": "com.example.arithmeticformula.MainActivity", + "flags": 1 + }, + { + "label": "连词成句", + "pkg": "com.jxw.liancichengju", + "cls": "com.jxw.liancichengju.MainActivity", + "flags": 1 + }, + { + "label": "国际音标", + "pkg": "com.jxw.englishsoundmark", + "cls": "com.jxw.englishsoundmark.Activity.MainActivity", + "flags": 1 + }, + { + "label": "五维记单词", + "pkg": "com.jxw.wuweijidanci", + "cls": "com.jxw.wuweijidanci.MainActivity", + "flags": 1 + }, + { + "label": "薄冰语法", + "pkg": "com.jxw.online_study", + "cls": "com.jxw.online_study.activity.BobingGrammarActivity", + "flags": 1 + }, + { + "label": "口语评测", + "pkg": "com.jxw.singsound", + "cls": "com.jxw.singsound.ui.SplashActivity", + "flags": 1 + }, + { + "label": "中英互译", + "pkg": "com.tech.translate", + "cls": "com.tech.translate.MainActivity", + "flags": 1 + }, + { + "label": "学王词典", + "pkg": "com.jxw.zncd", + "cls": "com.jxw.zncd.MainActivity", + "flags": 1 + }, + { + "label": "家长管理", + "pkg": "com.jxw.pushservice", + "cls": "com.jxw.pushservice.MainActivity", + "flags": 1 + }, + { + "label": "学王市场", + "pkg": "com.jxw.JXWlabelMarket", + "cls": "com.jxw.JXWlabelMarket.MainActivity", + "flags": 1 + }, + { + "label": "模拟考场", + "pkg": "com.jxw.examsystem", + "cls": "com.jxw.examsystem.StartExamActivity", + "flags": 1 + }, + { + "label": "名师风采/师资展示", + "pkg": "com.jxw.teacher.video", + "cls": "com.jxw.teacher.activity.MainActivity", + "flags": 1 + }, + { + "label": "学情管理", + "pkg": "com.jxw.usagedate", + "cls": "com.jxw.usagedate.ui.MainActivity", + "flags": 1 + }, + { + "label": "字词听写", + "pkg": "com.jxw.handwrite", + "cls": "com.jxw.handwrite.MainActivity", + "flags": 1 + }, + { + "label": "近反义词", + "pkg": "com.jxw.jinfangyici", + "cls": "com.jxw.jinfangyici.MainActivity", + "flags": 1 + }, + { + "label": "同步书苑/精选阅读", + "pkg": "com.jxw.jxwbook", + "cls": "com.jxw.jxwbook.MainActivity", + "flags": 1 + }, + { + "label": "智能语音", + "pkg": "com.iflytek.cyber.iot.show.core", + "cls": "com.iflytek.cyber.iot.show.core.EvsLauncherActivity", + "flags": 1 + }, + { + "label": "智能护眼", + "pkg": "com.jxw.zhinenghuyan", + "cls": "com.jxw.zhinenghuyan.MainActivity", + "flags": 1 + }, + { + "label": "幼儿平台", + "pkg": "com.jxw.youer.video", + "cls": "com.jxw.youer.activity.MainActivity", + "flags": 1 + }, + { + "label": "笔顺规则", + "pkg": "com.jxw.bishunguize", + "cls": "com.example.viewpageindicator.MainActivity", + "flags": 1 + }, + { + "label": "单位换算", + "pkg": "com.oirsdfg89.flg", + "cls": "com.nsc.formulas.tools.ToolActivity", + "flags": 1 + }, + { + "label": "指尖查字词", + "pkg": "com.jxw.zncd", + "cls": "com.jxw.zncd.OCRWordActivity", + "flags": 1 + }, + { + "label": "家长管控", + "pkg": "com.jxw.pushservice", + "cls": "com.jxw.pushservice.MainActivity", + "flags": 1 + }, + { + "label": "日记本", + "pkg": "com.jxw.rijiben", + "cls": "com.jxw.rijiben.MainActivity", + "flags": 1 + }, + { + "label": "应用市场", + "pkg": "com.jxw.JXWlabelMarket", + "cls": "com.jxw.JXWlabelMarket.MainActivity", + "flags": 1 + }, + { + "label": "中英互译6.0", + "pkg": "com.tech.translate", + "cls": "com.tech.translate.MainActivity", + "flags": 1 + } + ] + } + ] +} diff --git a/src/layouts/index.vue b/src/layouts/index.vue new file mode 100644 index 0000000..8edcfc5 --- /dev/null +++ b/src/layouts/index.vue @@ -0,0 +1,377 @@ + + + diff --git a/src/layouts/tool.vue b/src/layouts/tool.vue new file mode 100644 index 0000000..5991aea --- /dev/null +++ b/src/layouts/tool.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..c0ac3fe --- /dev/null +++ b/src/main.ts @@ -0,0 +1,44 @@ +import { createApp } from 'vue' +import App from './App.vue' +import directive from './directive' +import router from './router' +import { createPinia } from 'pinia' +import PiniaPluginPersist from './plugins/pinia-plugin-persist' + +import '@/utils/mathjax' // 必须在引入mathjax前引入mathjax的配置文件 +// import "mathjax/es5/tex-mml-chtml"; // 使用 tex-mml-chtml +import 'mathjax/es5/tex-mml-svg' + +import './styles/element-plus.scss' +import './styles/global.scss' +import './styles/vxe.scss' +import './styles/homeWorkCSS/style.css' +import './styles/homeWorkCSS/style.scss' +// import './styles/qml-preview.css' + +import 'vxe-pc-ui/lib/style.css' +import 'vxe-table/lib/style.css' +import sass from './utils/sass' + +// 初始化图标 +const favicon = document.getElementById('sass-favicon') as HTMLLinkElement +favicon.href = sass.getLogo() +// 初始化标题 +const title = document.getElementById('sass-title') as HTMLTitleElement +title.innerHTML = sass.platform.appName + +const pinia = createPinia() +pinia.use(PiniaPluginPersist) + +createApp(App).use(router).use(directive).use(pinia).mount('#app') + +export function resetAllStores() { + if (!pinia) { + console.error('Pinia is not installed') + return + } + const allStores = (pinia as any)._s + for (const [_key, store] of allStores) { + store.$reset?.() + } +} diff --git a/src/page/app/app.ts b/src/page/app/app.ts new file mode 100644 index 0000000..37399d7 --- /dev/null +++ b/src/page/app/app.ts @@ -0,0 +1,301 @@ +export const SHUFA_URL = + 'https://jiaoxue.shufaxiaozhuangyuan.cn/index/live/autoxxl?code=eyJpdiI6IklGMm5HOVpJYTBkU2tHa1c1M2YxTXc9PSIsInZhbHVlIjoiNWNqeFVVQ1Z4bVYyUmJyS0ZRbjB0UT09In0=' +const SHUFA_ACCOUNTS = [ + 'sx001', + 'sx002', + 'sx003', + 'sx004', + 'sx005', + 'sx006', + 'sx007', + 'sx008', + 'sx009', + 'sx010', + '15928631036', +] +export const SHUFA_PATH = '/sfxzy' +export const isShufaAccount = (account: any) => { + return SHUFA_ACCOUNTS.includes(account) +} + +const OSS_URL = `${import.meta.env.VITE_OSS_URL}` +export const systemApps = [ + { + iconPath: `${OSS_URL}/urm/app_xiangji.png`, + appName: '相机', + pkName: 'com.android.camera2', + }, + { + iconPath: `${OSS_URL}/urm/app_rili.png`, + appName: '日历', + pkName: 'com.android.calendar', + }, + { + iconPath: `${OSS_URL}/urm/app_wenjianjike.png`, + appName: '文件', + pkName: 'com.android.documentsui', + }, + { + iconPath: `${OSS_URL}/urm/app_tuku.png`, + appName: '图库', + pkName: 'com.android.gallery3d', + }, + { + iconPath: `${OSS_URL}/urm/app_shezhi.png`, + appName: '设置', + pkName: 'com.android.settings', + }, + { + iconPath: `${OSS_URL}/urm/app_jisuanqi.png`, + appName: '计算器', + pkName: 'com.android.calculator2', + }, + { + iconPath: `${OSS_URL}/urm/app_shizhong.png`, + appName: '时钟', + pkName: 'com.android.deskclock', + }, + { + iconPath: `${OSS_URL}/urm/app_rijiben.png`, + appName: '日记本', + pkName: 'com.jxw.rijiben', + cls: 'com.jxw.rijiben.MainActivity', + }, + { + iconPath: `${OSS_URL}/urm/app_kechengbiao.png`, + appName: '课程表', + pkName: 'com.jxw.classtable', + cls: 'com.jxw.classtable.MainActivity', + }, +] +export const aiApps = [ + { + iconPath: `${OSS_URL}/urm/app_shufaxiaozhuangyuan.png`, + appName: '书法小状元', + href: SHUFA_URL, + }, + { + iconPath: `${OSS_URL}/urm/app_shufaxiaozhuangyuan.png`, + appName: '智写测评', + href: 'http://write.xuexiaole.com/#/', + }, + { + iconPath: `${OSS_URL}/urm/app_zhinenghuyan.png`, + appName: '智能护眼', + pkName: 'com.jxw.zhinenghuyan', + cls: 'com.jxw.zhinenghuyan.MainActivity', + }, + { + iconPath: `${OSS_URL}/urm/app_paizhaosouti.png`, + appName: '拍照搜题', + pkName: 'com.jxw.souti', + cls: 'com.jxw.souti.ui.activity.MainActivity', + }, + { + iconPath: `${OSS_URL}/urm/app_zhijianchaci.png`, + appName: '指尖查词', + pkName: 'com.jxw.zncd', + cls: 'com.jxw.zncd.OCRWordActivity', + }, + { + iconPath: `${OSS_URL}/urm/app_huibenbandu.png`, + appName: '绘本伴读', + pkName: 'com.jxw.huiben', + cls: 'com.jxw.huiben.activity.SplashActivity', + extra: { + StartArgs: 'huiben', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_zuoyepigai.png`, + appName: '作业批改', + pkName: 'com.jxw.souti', + cls: 'com.jxw.souti.ui.activity.MainActivity', + }, + { + iconPath: `${OSS_URL}/urm/app_aizhidu.png`, + appName: 'AI指读', + pkName: 'com.jxw.huiben', + cls: 'com.jxw.huiben.activity.SplashActivity', + extra: { + StartArgs: 'keben', + }, + }, +] +export const expandApps = [ + { + iconPath: `${OSS_URL}/urm/app_meisu.png`, + appName: '美术', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '美术', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_shufa.png`, + appName: '书法', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '书法', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_zhonghuawenhua.png`, + appName: '中华文化', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '中华文化', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_huibendonghua.png`, + appName: '绘本动画', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '绘本动画', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_ergelvdong.png`, + appName: '儿歌律动', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '儿歌律动', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_youshenggushi.png`, + appName: '有声故事', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '有声故事', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_shenghuobaike.png`, + appName: '生活百科', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '生活百科', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_tongbushuyuan.png`, + appName: '同步书苑', + pkName: 'com.jxw.jxwbook', + cls: 'com.jxw.jxwbook.MainActivity', + }, + { + iconPath: `${OSS_URL}/urm/app_zhuanzhulixunlian.png`, + appName: '专注力训练', + pkName: 'com.jxw.schultegrid', + cls: 'com.jxw.schultegrid.SettingActivity', + }, +] +export const infantApps = [ + { + iconPath: `${OSS_URL}/urm/app_meisu.png`, + appName: '美术', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '美术', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_shufa.png`, + appName: '书法', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '书法', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_zhonghuawenhua.png`, + appName: '中华文化', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '中华文化', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_huibendonghua.png`, + appName: '绘本动画', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '绘本动画', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_ergelvdong.png`, + appName: '儿歌律动', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '儿歌律动', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_youshenggushi.png`, + appName: '有声故事', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '有声故事', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_shenghuobaike.png`, + appName: '生活百科', + pkName: 'com.jxw.newyouer.video', + cls: 'com.jxw.newyouer.activity.QualityActivity', + extra: { + StartArgs: '生活百科', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_tongbushuyuan.png`, + appName: '同步书苑', + pkName: 'com.jxw.jxwbook', + cls: 'com.jxw.jxwbook.MainActivity', + }, + { + iconPath: `${OSS_URL}/urm/app_renshishuzi.png`, + appName: '认识数字', + pkName: 'com.jxw.studydigital', + cls: 'com.jxw.studydigital.StuDydigitalActivity', + }, + { + iconPath: `${OSS_URL}/urm/app_zimuxuexi.png`, + appName: '字母学习', + pkName: 'com.jxw.mskt.video', + cls: 'com.jxw.mskt.video.VideoTopicActivity', + extra: { + isTopic: true, + isYYGJ: true, + url: 'http://api4.jiumentongbu.com/api/jwfd/baseapp/url?filePath=专区数据/英语广角/幼儿启蒙/ABC字母/menu.json', + }, + }, + { + iconPath: `${OSS_URL}/urm/app_youerpingtai.png`, + appName: '幼儿平台', + pkName: 'com.jxw.youer.video', + cls: 'com.jxw.youer.activity.MainActivity', + }, + { + iconPath: `${OSS_URL}/urm/app_bishunguize.png`, + appName: '笔顺规则', + pkName: 'com.jxw.bishunguize', + cls: 'com.example.viewpageindicator.MainActivity', + }, +] diff --git a/src/page/app/index.vue b/src/page/app/index.vue new file mode 100644 index 0000000..00e3b6e --- /dev/null +++ b/src/page/app/index.vue @@ -0,0 +1,314 @@ + + + diff --git a/src/page/app/link.vue b/src/page/app/link.vue new file mode 100644 index 0000000..80b36df --- /dev/null +++ b/src/page/app/link.vue @@ -0,0 +1,38 @@ +vue + + + diff --git a/src/page/app/routes.ts b/src/page/app/routes.ts new file mode 100644 index 0000000..f895c4e --- /dev/null +++ b/src/page/app/routes.ts @@ -0,0 +1,24 @@ +import type { RouteRecordRaw } from 'vue-router' +import app_c from './index.vue' +import link_c from './link.vue' + +const routes: RouteRecordRaw = { + path: 'app', + children: [ + { + name: 'app', + path: '', + // component: () => import('./index.vue'), + component: app_c, + meta: { title: '应用' }, + }, + { + name: 'link', + path: 'link', + component: link_c, + meta: { title: '外链' }, + }, + ], +} + +export default routes diff --git a/src/page/chat/components/AiText/index.scss b/src/page/chat/components/AiText/index.scss new file mode 100644 index 0000000..bedaccb --- /dev/null +++ b/src/page/chat/components/AiText/index.scss @@ -0,0 +1,352 @@ +$font_size: 2vh; +$margin_h: 0.83vh; +$code_bg: rgb(40, 44, 52); +$corner_radius: 4px; +$theme: #009874; +$shadow: + 0 2px 5px 0 rgba(220, 220, 220, 0.6), + 0 2px 10px 0 rgba(220, 220, 220, 0.2); +$font: Menlo, Monaco, 'Courier New', monospace; + +.markdown-body { + background-color: transparent; + font-size: $font_size; + margin-top: -1.25vh; + margin-bottom: -1.25vh; + + p, + h1, + h2, + h3, + h4, + h5, + h6, + ul, + ol, + dl, + dd, + blockquote, + pre, + code, + hr, + table, + figure { + margin: $margin_h 0; + } + + p { + white-space: pre-wrap; + } + + ol { + list-style-type: decimal; + } + + ul { + list-style-type: disc; + } + + pre code, + pre tt { + line-height: 1.65; + } + + .highlight pre, + pre { + background-color: $code_bg; + border-radius: $corner_radius; + overflow: hidden; + text-indent: 0; + + code.hljs { + padding: 0 15px; + font-size: $font_size; + color: #fff; + counter-reset: line; + + .hljs-line::before { + counter-increment: line; + content: counter(line); + display: inline-block; + width: 20px; + margin-right: 15px; + color: #999; + text-align: right; + } + } + } + + .hljs-string { + color: rgb(152, 195, 121); + } + + .hljs-keyword { + color: rgb(249, 38, 114); + } + + .hljs-comment { + color: #7f8c99; + font-style: normal; + } + + .code-block-wrapper { + position: relative; + padding-top: 3.75vh; + } + + .code-block-header { + position: absolute; + top: 0; + right: 0; + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 0.01vh dashed #888; + color: #fff; + background-color: $code_bg; + + &__lang { + background-color: #424242; + padding: 0.42vh 15px; + display: inline-block; + } + + &__copy { + cursor: pointer; + margin-left: 0.5rem; + user-select: none; + background-color: #424242; + padding: 0.42vh 15px; + display: inline-block; + + &:hover { + color: $theme; + } + } + } + + div[id^='mermaid-container'] { + padding: 0.33vh; + // border-radius: 0.33vh; + margin: $margin_h 0; + // text-align: center; + overflow-x: auto !important; + // background-color: #fff; + // border: 1px solid #e5e5e5; + } + + a { + color: #576b95; + } + + h1 { + text-align: center; + line-height: 1.75; + font-family: $font; + font-size: $font_size; + display: table; + padding: 0.5em 1em; + border-bottom: 0.17vh solid $theme; + margin: 2em auto 1em; + color: hsl(var(--foreground)); + font-weight: bold; + text-shadow: 0.17vh 0.17vh 0.33vh rgba(0, 0, 0, 0.1); + margin-top: 0; + } + + h2 { + text-align: center; + line-height: 1.75; + font-family: $font; + font-size: $font_size; + display: table; + padding: 0.3em 1em; + margin: 4em auto 2em; + color: #fff; + background: $theme; + font-weight: bold; + border-radius: 0.67vh; + box-shadow: $shadow; + } + + h3 { + text-align: left; + line-height: 1.2; + font-family: $font; + font-size: $font_size; + padding-left: 12px; + padding-bottom: 0.42vh; + padding-top: 0.42vh; + border-left: 0.33vh solid $theme; + margin: 2em 8px 1em 0; + color: hsl(var(--foreground)); + font-weight: bold; + border-bottom: 0.08vh solid $theme; + } + + h4 { + display: inline-block; + border: 0.08vh solid $theme; + border-top: 0.33vh solid $theme; + padding-left: 5px; + padding-right: 5px; + } + + strong { + text-align: left; + line-height: 1.75; + font-family: $font; + font-size: inherit; + color: $theme; + font-weight: bold; + } + + ul { + text-align: left; + line-height: 1.75; + list-style: none; + font-family: $font; + padding-left: 1.5em; + margin-left: 0; + color: hsl(var(--foreground)); + + > li::before { + content: '• '; + position: absolute; + left: -27px; + } + } + + li { + text-align: left; + line-height: 1.75; + font-family: $font; + display: block; + margin: 0.5em 8px; + text-indent: 20px; + color: hsl(var(--foreground)); + position: relative; + + pre { + text-indent: 0; + } + } + + ol { + text-align: left; + line-height: 1.75; + font-family: $font; + font-size: $font_size; + padding-left: 1.5em; + margin-left: 0; + color: hsl(var(--foreground)); + counter-reset: section; /* 创建计数器 */ + + > li::before { + counter-increment: section; /* 递增计数器 */ + content: counter(section) '. '; /* 显示数字(如1.、2.) */ + position: absolute; + left: -50px; + } + } + + code { + color: rgb(221, 17, 68); + background-color: rgba(27, 31, 35, 0.05); + border-radius: 0.33vh; + padding: 0.42vh; + } + + p { + text-align: left; + line-height: 1.75; + font-family: $font; + letter-spacing: 0.1em; + color: hsl(var(--foreground)); + } + + img { + text-align: left; + line-height: 1.75; + font-size: 1.17vh; + display: block; + max-width: 100%; + margin: 0.1em auto 0.5em; + border-radius: $corner_radius; + box-shadow: $shadow; + } + + blockquote { + text-align: left; + line-height: 1.5; + font-family: $font; + padding: 1.25vh; + border-left: 0.33vh solid $theme; + border-radius: $corner_radius; + color: rgba(0, 0, 0, 0.6); + background: #e8f2fb; + margin: 1.67vh 0; + box-shadow: $shadow; + + p { + margin: 1.25vh 0; + } + } + + hr { + height: 0.08vh; + border: none; + border-top: 0.08vh solid #eee; + box-shadow: $shadow; + } + + table { + display: table; + border-collapse: separate; + box-sizing: border-box; + text-indent: initial; + unicode-bidi: isolate; + line-height: normal; + font-weight: normal; + font-size: medium; + font-style: normal; + color: -internal-quirk-inherit; + text-align: center; + border-spacing: 2px; + border-color: gray; + white-space: normal; + font-variant: normal; + + thead { + line-height: 1.75; + font-family: $font; + font-size: $font_size; + background: rgba(0, 0, 0, 0.05); + font-weight: bold; + color: #3f3f3f; + + td { + // text-align: left; + line-height: 1.75; + font-family: $font; + font-size: $font_size; + border: 0.08vh solid #dfdfdf; + padding: 0.5em 1em; + color: #3f3f3f; + word-break: keep-all; + } + } + + td { + // text-align: left; + line-height: 1.75; + font-family: $font; + font-size: $font_size; + border: 0.08vh solid #dfdfdf; + padding: 0.5em 1em; + color: #3f3f3f; + word-break: keep-all; + } + } +} diff --git a/src/page/chat/components/AiText/index.vue b/src/page/chat/components/AiText/index.vue new file mode 100644 index 0000000..7b469ea --- /dev/null +++ b/src/page/chat/components/AiText/index.vue @@ -0,0 +1,143 @@ + + + + + diff --git a/src/page/chat/components/AiText/languages.json b/src/page/chat/components/AiText/languages.json new file mode 100644 index 0000000..a8ffad0 --- /dev/null +++ b/src/page/chat/components/AiText/languages.json @@ -0,0 +1,105 @@ +{ + "html": "HTML", + "txt": "TXT", + "xml": "XML", + "svg": "SVG", + "mathml": "MathML", + "css": "CSS", + "clike": "C-like", + "js": "JavaScript", + "javascript": "JavaScript", + "abap": "ABAP", + "apacheconf": "Apache Configuration", + "apl": "APL", + "arff": "ARFF", + "asciidoc": "AsciiDoc", + "adoc": "AsciiDoc", + "asm6502": "6502 Assembly", + "aspnet": "ASP.NET (C#)", + "autohotkey": "AutoHotkey", + "autoit": "AutoIt", + "basic": "BASIC", + "csharp": "C#", + "dotnet": "C#", + "cpp": "C++", + "cil": "CIL", + "csp": "Content-Security-Policy", + "css-extras": "CSS Extras", + "django": "Django/Jinja2", + "jinja2": "Django/Jinja2", + "dockerfile": "Docker", + "erb": "ERB", + "fsharp": "F#", + "gcode": "G-code", + "gedcom": "GEDCOM", + "glsl": "GLSL", + "gml": "GameMaker Language", + "gamemakerlanguage": "GameMaker Language", + "graphql": "GraphQL", + "hcl": "HCL", + "http": "HTTP", + "hpkp": "HTTP Public-Key-Pins", + "hsts": "HTTP Strict-Transport-Security", + "ichigojam": "IchigoJam", + "inform7": "Inform 7", + "javastacktrace": "Java stack trace", + "json": "JSON", + "jsonp": "JSONP", + "latex": "LaTeX", + "emacs": "Lisp", + "elisp": "Lisp", + "emacs-lisp": "Lisp", + "lolcode": "LOLCODE", + "markup-templating": "Markup templating", + "matlab": "MATLAB", + "mel": "MEL", + "n1ql": "N1QL", + "n4js": "N4JS", + "n4jsd": "N4JS", + "nand2tetris-hdl": "Nand To Tetris HDL", + "nasm": "NASM", + "nginx": "Nginx", + "nsis": "NSIS", + "objectivec": "Objective-C", + "ocaml": "OCaml", + "opencl": "OpenCL", + "parigp": "PARI/GP", + "objectpascal": "Object Pascal", + "php": "PHP", + "php-extras": "PHP Extras", + "plsql": "PL/SQL", + "powershell": "PowerShell", + "properties": ".properties", + "protobuf": "Protocol Buffers", + "q": "Q (kdb+ database)", + "jsx": "React JSX", + "tsx": "React TSX", + "renpy": "Ren'py", + "rest": "reST (reStructuredText)", + "sas": "SAS", + "sass": "Sass (Sass)", + "scss": "Sass (Scss)", + "sql": "SQL", + "soy": "Soy (Closure Template)", + "sh": "Shell", + "shell": "Shell", + "tap": "TAP", + "toml": "TOML", + "tt2": "Template Toolkit 2", + "ts": "TypeScript", + "vbnet": "VB.Net", + "vhdl": "VHDL", + "vim": "Vim", + "visual-basic": "Visual Basic", + "vb": "Visual Basic", + "wasm": "WebAssembly", + "wiki": "Wiki markup", + "xeoracube": "XeoraCube", + "xojo": "Xojo (REALbasic)", + "xquery": "XQuery", + "yaml": "YAML", + "oc": "Objective-C", + "objc": "Objective-C", + "object-c": "Objective-C", + "objective-c": "Objective-C" +} diff --git a/src/page/chat/components/Message.vue b/src/page/chat/components/Message.vue new file mode 100644 index 0000000..7312d53 --- /dev/null +++ b/src/page/chat/components/Message.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/page/chat/components/MessageList.vue b/src/page/chat/components/MessageList.vue new file mode 100644 index 0000000..4a0209d --- /dev/null +++ b/src/page/chat/components/MessageList.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/page/chat/components/Sender.vue b/src/page/chat/components/Sender.vue new file mode 100644 index 0000000..83b6cde --- /dev/null +++ b/src/page/chat/components/Sender.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/page/chat/components/SessionItem.vue b/src/page/chat/components/SessionItem.vue new file mode 100644 index 0000000..bca69ab --- /dev/null +++ b/src/page/chat/components/SessionItem.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/src/page/chat/components/SessionList.vue b/src/page/chat/components/SessionList.vue new file mode 100644 index 0000000..08bac77 --- /dev/null +++ b/src/page/chat/components/SessionList.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/page/chat/components/Text/test.json b/src/page/chat/components/Text/test.json new file mode 100644 index 0000000..3799824 --- /dev/null +++ b/src/page/chat/components/Text/test.json @@ -0,0 +1,3 @@ +{ + "content": "# 探索 Markdown 的奇妙世界\n\n欢迎来到 Markdown 的奇妙世界!无论你是写作爱好者、开发者、博主,还是想要简单记录点什么的人,Markdown 都能成为你新的好伙伴。它不仅让写作变得简单明了,还能轻松地将内容转化为漂亮的网页格式。今天,我们将全面探讨 Markdown 的基础和进阶语法,让你在这个过程中充分享受写作的乐趣!\n\nMarkdown 是一种轻量级标记语言,用于格式化纯文本。它以简单、直观的语法而著称,可以快速地生成 HTML。Markdown 是写作与代码的完美结合,既简单又强大。\n\n```js\n\n```\n\n## Markdown 基础语法\n\n### 1. 标题:让你的内容层次分明\n\n用 `#` 号来创建标题。标题从 `#` 开始,`#` 的数量表示标题的级别。\n\n```markdown\n# 一级标题\n\n## 二级标题\n\n### 三级标题\n\n#### 四级标题\n```\n\n以上代码将渲染出一组层次分明的标题,使你的内容井井有条。\n\n### 2. 段落与换行:自然流畅\n\nMarkdown 中的段落就是一行接一行的文本。要创建新段落,只需在两行文本之间空一行。\n\n### 3. 字体样式:强调你的文字\n\n- ​**粗体**:用两个星号或下划线包裹文字,如 `**粗体**` 或 `__粗体__`。\n- _斜体_:用一个星号或下划线包裹文字,如 `*斜体*` 或 `_斜体_`。\n- ~~删除线~~:用两个波浪线包裹文字,如 `~~删除线~~`。\n\n这些简单的标记可以让你的内容更有层次感和重点突出。\n\n### 4. 列表:整洁有序\n\n- ​**无序列表**:用 `-`、`*` 或 `+` 加空格开始一行。\n- ​**有序列表**:使用数字加点号(`1.`、`2.`)开始一行。\n\n在列表中嵌套其他内容?只需缩进即可实现嵌套效果。\n\n- 无序列表项 1\n 1. 嵌套有序列表项 1\n 2. 嵌套有序列表项 2\n- 无序列表项 2\n\n1. 有序列表项 1\n2. 有序列表项 2\n\n### 5. 链接与图片:丰富内容\n\n- ​**链接**:用方括号和圆括号创建链接 `[显示文本](链接地址)`。\n- ​**图片**:和链接类似,只需在前面加上 `!`,如 `![描述文本](图片链接)`。\n\n[访问 Doocs](https://github.com/doocs)\n\n![doocs](https://cdn-doocs.oss-cn-shenzhen.aliyuncs.com/gh/doocs/md/images/logo-2.png)\n\n轻松实现富媒体内容展示!\n\n> 因微信公众号平台不支持除公众号内容以外的链接,故其他平台的链接,会呈现链接样式但无法点击跳转。\n\n> 对于这些链接请注意明文书写,或点击左上角「格式->微信外链接转底部引用」开启引用,这样就可以在底部观察到链接指向。\n\n另外,使用 `` 语法可以创建横屏滑动幻灯片,支持微信公众号平台。建议使用相似尺寸的图片以获得最佳显示效果。\n\n### 6. 引用:引用名言或引人深思的句子\n\n使用 `>` 来创建引用,只需在文本前面加上它。多层引用?在前一层 `>` 后再加一个就行。\n\n> 这是一个引用\n>\n> > 这是一个嵌套引用\n\n这让你的引用更加富有层次感。\n\n### 7. 代码块:展示你的代码\n\n- ​**行内代码**:用反引号包裹,如 `code`。\n- ​**代码块**:用三个反引号包裹,并指定语言,如:\n\n```js\nconsole.log(\"Hello, Doocs!\");\n```\n\n语法高亮让你的代码更易读。\n\n### 8. 分割线:分割内容\n\n用三个或更多的 `-`、`*` 或 `_` 来创建分割线。\n\n---\n\n为你的内容添加视觉分隔。\n\n### 9. 表格:清晰展示数据\n\nMarkdown 支持简单的表格,用 `|` 和 `-` 分隔单元格和表头。\n\n| 项目人员 | 邮箱 | 微信号 |\n| ------------------------------------------- | ---------------------- | ------------ |\n| [yanglbme](https://github.com/yanglbme) | contact@yanglibin.info | YLB0109 |\n| [YangFong](https://github.com/YangFong) | yangfong2022@gmail.com | yq2419731931 |\n| [thinkasany](https://github.com/thinkasany) | thinkasany@gmail.com | thinkasany |\n\n这样的表格让数据展示更为清爽!\n\n> 手动编写标记太麻烦?我们提供了便捷方式。左上方点击「编辑->插入表格」,即可快速实现表格渲染。\n\n## Markdown 进阶技巧\n\n### 1. LaTeX 公式:完美展示数学表达式\n\nMarkdown 允许嵌入 LaTeX 语法展示数学公式:\n\n- ​**行内公式**:用 `$` 包裹公式,如 $E = mc^2$。\n- ​**块级公式**:用 `$$` 包裹公式,如:\n\n$$\n\\begin{aligned}\nd_{i, j} &\\leftarrow d_{i, j} + 1 \\\\\nd_{i, y + 1} &\\leftarrow d_{i, y + 1} - 1 \\\\\nd_{x + 1, j} &\\leftarrow d_{x + 1, j} - 1 \\\\\nd_{x + 1, y + 1} &\\leftarrow d_{x + 1, y + 1} + 1\n\\end{aligned}\n$$\n\n这是展示复杂数学表达的利器!\n\n### 2. Mermaid 流程图:可视化流程\n\nMermaid 是强大的可视化工具,可以在 Markdown 中创建流程图、时序图等。\n\n```mermaid\ngraph LR\n A[GraphCommand] --> B[update]\n A --> C[goto]\n A --> D[send]\n \n B --> B1[更新状态]\n C --> C1[流程控制]\n D --> D1[消息传递]\n```\n\n```mermaid\ngraph TD;\n A-->B;\n A-->C;\n B-->D;\n C-->D;\n```\n\n```mermaid\npie\n title Key elements in Product X\n \"Calcium\" : 42.96\n \"Potassium\" : 50.05\n \"Magnesium\" : 10.01\n \"Iron\" : 5\n```\n\n```mermaid\npie\n title 为什么总是宅在家里?\n \"喜欢宅\" : 45\n \"天气太热\" : 70\n \"穷\" : 500\n \"没人约\" : 95\n```\n\n这种方式不仅能直观展示流程,还能提升文档的专业性。\n\n> 更多用法,参见:[Mermaid User Guide](https://mermaid.js.org/intro/getting-started.html)。\n\n## 结语\n\nMarkdown 是一种简单、强大且易于掌握的标记语言,通过学习基础和进阶语法,你可以快速创作内容并有效传达信息。无论是技术文档、个人博客还是项目说明,Markdown 都是你的得力助手。希望这篇内容能够带你全面了解 Markdown 的潜力,让你的写作更加丰富多彩!\n\n现在,拿起 Markdown 编辑器,开始创作吧!探索 Markdown 的世界,你会发现它远比想象中更精彩!\n\n#### 推荐阅读\n\n- [阿里又一个 20k+ stars 开源项目诞生,恭喜 fastjson!](https://mp.weixin.qq.com/s/RNKDCK2KoyeuMeEs6GUrow)\n- [刷掉 90% 候选人的互联网大厂海量数据面试题(附题解 + 方法总结)](https://mp.weixin.qq.com/s/rjGqxUvrEqJNlo09GrT1Dw)\n- [好用!期待已久的文本块功能究竟如何在 Java 13 中发挥作用?](https://mp.weixin.qq.com/s/kalGv5T8AZGxTnLHr2wDsA)\n- [2019 GitHub 开源贡献排行榜新鲜出炉!微软谷歌领头,阿里跻身前 12!](https://mp.weixin.qq.com/s/_q812aGD1b9QvZ2WFI0Qgw)\n\n---\n\n
\n \n
" +} diff --git a/src/page/chat/index.scss b/src/page/chat/index.scss new file mode 100644 index 0000000..b468797 --- /dev/null +++ b/src/page/chat/index.scss @@ -0,0 +1,17 @@ +$font: Menlo, Monaco, 'Courier New', monospace; +$border_radius: 10px; +$font_size: 2vh; +$font_size2: 22px; +$font_size3: 20px; +$font_size4: 18px; +$bg1: $theme-color-bg; +$header_h: 6.67vh; +$side_w: 400px; +$side_title_w: $side_w - 50px; +$padding_out: 25px; +$chat_title_w: $side_w + $padding_out * 5; + +// 公共 +:deep(.el-icon) { + font-size: $font_size; +} diff --git a/src/page/chat/index.ts b/src/page/chat/index.ts new file mode 100644 index 0000000..e76db88 --- /dev/null +++ b/src/page/chat/index.ts @@ -0,0 +1,2 @@ +const OSS_URL = import.meta.env.VITE_OSS_URL +export const imageBg = `${OSS_URL}/urm/chat_sender_bg.svg` diff --git a/src/page/chat/index.vue b/src/page/chat/index.vue new file mode 100644 index 0000000..f9c7efd --- /dev/null +++ b/src/page/chat/index.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/page/chat/routes.ts b/src/page/chat/routes.ts new file mode 100644 index 0000000..09493c9 --- /dev/null +++ b/src/page/chat/routes.ts @@ -0,0 +1,10 @@ +import type { RouteRecordRaw } from 'vue-router' + +const routes: RouteRecordRaw = { + name: 'Chat', + path: '/chat', + component: () => import('./index.vue'), + meta: { title: 'AI' }, +} + +export default routes diff --git a/src/page/classroomInteraction/index.vue b/src/page/classroomInteraction/index.vue new file mode 100644 index 0000000..737edc6 --- /dev/null +++ b/src/page/classroomInteraction/index.vue @@ -0,0 +1,413 @@ + + + + diff --git a/src/page/classroomInteraction/routes.ts b/src/page/classroomInteraction/routes.ts new file mode 100644 index 0000000..63a8e5b --- /dev/null +++ b/src/page/classroomInteraction/routes.ts @@ -0,0 +1,10 @@ +import type { RouteRecordRaw } from 'vue-router' + +const routes: RouteRecordRaw = { + name: 'classroomInteraction', + path: '/classroomInteraction', + component: () => import('./index.vue'), + meta: { title: '课堂互动' }, +} + +export default routes diff --git a/src/page/home/index.vue b/src/page/home/index.vue new file mode 100644 index 0000000..dee9ad2 --- /dev/null +++ b/src/page/home/index.vue @@ -0,0 +1,696 @@ + + + diff --git a/src/page/home/routes.ts b/src/page/home/routes.ts new file mode 100644 index 0000000..df8ad22 --- /dev/null +++ b/src/page/home/routes.ts @@ -0,0 +1,23 @@ +import type { RouteRecordRaw } from 'vue-router' +import home_c from './index.vue' + +const routes: RouteRecordRaw = { + path: '', + children: [ + { + name: 'Home', + path: '', + // component: () => import('./index.vue'), + component: home_c, + meta: { title: '首页' }, + }, + { + name: 'self-coin-detail', + path: 'self-coin-detail', + component: () => import('./self-coin-detail/index.vue'), + meta: { title: '乐贝明细' }, + }, + ], +} + +export default routes diff --git a/src/page/home/self-coin-detail/index.vue b/src/page/home/self-coin-detail/index.vue new file mode 100644 index 0000000..a9cbe77 --- /dev/null +++ b/src/page/home/self-coin-detail/index.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/src/page/login/components/Option.vue b/src/page/login/components/Option.vue new file mode 100644 index 0000000..37976d3 --- /dev/null +++ b/src/page/login/components/Option.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/src/page/login/index.vue b/src/page/login/index.vue new file mode 100644 index 0000000..199dd72 --- /dev/null +++ b/src/page/login/index.vue @@ -0,0 +1,339 @@ + + + diff --git a/src/page/login/init.vue b/src/page/login/init.vue new file mode 100644 index 0000000..4fa0e12 --- /dev/null +++ b/src/page/login/init.vue @@ -0,0 +1,483 @@ + + + + + diff --git a/src/page/login/routes.ts b/src/page/login/routes.ts new file mode 100644 index 0000000..1f6a27b --- /dev/null +++ b/src/page/login/routes.ts @@ -0,0 +1,22 @@ +import type { RouteRecordRaw } from 'vue-router' +import login_c from './index.vue' +import init_c from './init.vue' + +const routes: RouteRecordRaw[] = [ + { + name: 'login', + path: 'login', + // component: () => import('./index.vue'), + component: login_c, + meta: { title: '登录', isPublic: true }, + }, + { + name: 'init', + path: 'init', + // component: () => import('./init.vue'), + component: init_c, + meta: { title: '初始化' }, + }, +] + +export default routes diff --git a/src/page/positive/goodThings/index.vue b/src/page/positive/goodThings/index.vue new file mode 100644 index 0000000..05bf0e1 --- /dev/null +++ b/src/page/positive/goodThings/index.vue @@ -0,0 +1,208 @@ + + + + + diff --git a/src/page/positive/routes.ts b/src/page/positive/routes.ts new file mode 100644 index 0000000..4a5cd77 --- /dev/null +++ b/src/page/positive/routes.ts @@ -0,0 +1,25 @@ +import type { RouteRecordRaw } from 'vue-router' +import goodThings_c from './goodThings/index.vue' // 静态导入组件 +import smileSign_c from './smileSign/index.vue' // 静态导入组件 + +const routes: RouteRecordRaw = { + name: 'positive', + path: '/positive', + meta: { title: '积极教育' }, + children: [ + { + name: 'goodThings', + path: 'goodThings', + component: goodThings_c, + meta: { title: '3件好事' }, + }, + { + name: 'smileSign', + path: 'smileSign', + component: smileSign_c, + meta: { title: '微笑打卡' }, + }, + ], +} + +export default routes diff --git a/src/page/positive/smileSign/index.vue b/src/page/positive/smileSign/index.vue new file mode 100644 index 0000000..d5d6236 --- /dev/null +++ b/src/page/positive/smileSign/index.vue @@ -0,0 +1,12 @@ + + + + + diff --git a/src/page/ranking/components/AsideList.vue b/src/page/ranking/components/AsideList.vue new file mode 100644 index 0000000..f4a9bb0 --- /dev/null +++ b/src/page/ranking/components/AsideList.vue @@ -0,0 +1,96 @@ + + + + diff --git a/src/page/ranking/components/SelectTab.vue b/src/page/ranking/components/SelectTab.vue new file mode 100644 index 0000000..4bcef87 --- /dev/null +++ b/src/page/ranking/components/SelectTab.vue @@ -0,0 +1,99 @@ + + + + diff --git a/src/page/ranking/components/VirtualList.vue b/src/page/ranking/components/VirtualList.vue new file mode 100644 index 0000000..a7510ee --- /dev/null +++ b/src/page/ranking/components/VirtualList.vue @@ -0,0 +1,197 @@ + + + + + diff --git a/src/page/ranking/index.vue b/src/page/ranking/index.vue new file mode 100644 index 0000000..5875e50 --- /dev/null +++ b/src/page/ranking/index.vue @@ -0,0 +1,853 @@ + + + + diff --git a/src/page/ranking/interface.ts b/src/page/ranking/interface.ts new file mode 100644 index 0000000..9bd742f --- /dev/null +++ b/src/page/ranking/interface.ts @@ -0,0 +1,8 @@ +export interface selectType { + value: string | number + label: string | number +} + +export interface itemType { + remark: number +} diff --git a/src/page/ranking/other/index.vue b/src/page/ranking/other/index.vue new file mode 100644 index 0000000..7b006b4 --- /dev/null +++ b/src/page/ranking/other/index.vue @@ -0,0 +1,82 @@ + + + diff --git a/src/page/ranking/routes.ts b/src/page/ranking/routes.ts new file mode 100644 index 0000000..2c43637 --- /dev/null +++ b/src/page/ranking/routes.ts @@ -0,0 +1,25 @@ +import type { RouteRecordRaw } from 'vue-router' +import ranking_c from './index.vue' +import otherDetail_c from './other/index.vue' + +const routes: RouteRecordRaw = { + path: 'ranking', + children: [ + { + name: 'ranking', + path: '', + // component: () => import('./index.vue'), + component: ranking_c, + meta: { title: '排行榜' }, + }, + { + name: 'RankingOtherDetail', + path: 'otherDetail/:id', + // component: () => import('./other/index.vue'), + component: otherDetail_c, + meta: { title: '排行榜' }, + }, + ], +} + +export default routes diff --git a/src/page/sfxzy/index.vue b/src/page/sfxzy/index.vue new file mode 100644 index 0000000..1a077ba --- /dev/null +++ b/src/page/sfxzy/index.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/src/page/sfxzy/routes.ts b/src/page/sfxzy/routes.ts new file mode 100644 index 0000000..ff167ab --- /dev/null +++ b/src/page/sfxzy/routes.ts @@ -0,0 +1,12 @@ +import type { RouteRecordRaw } from 'vue-router' +import sfxzy from './index.vue' + +const routes: RouteRecordRaw = { + name: 'sfxzy', + path: 'sfxzy', + // component: () => import('./index.vue'), + component: sfxzy, + meta: { title: '智学-智写' }, +} + +export default routes diff --git a/src/page/student-mgr/basic-info/batch-operation.vue b/src/page/student-mgr/basic-info/batch-operation.vue new file mode 100644 index 0000000..d996c9d --- /dev/null +++ b/src/page/student-mgr/basic-info/batch-operation.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/page/student-mgr/basic-info/batch-send.vue b/src/page/student-mgr/basic-info/batch-send.vue new file mode 100644 index 0000000..9fd81dd --- /dev/null +++ b/src/page/student-mgr/basic-info/batch-send.vue @@ -0,0 +1,283 @@ + + + + + diff --git a/src/page/student-mgr/basic-info/dialog.scss b/src/page/student-mgr/basic-info/dialog.scss new file mode 100644 index 0000000..78957a6 --- /dev/null +++ b/src/page/student-mgr/basic-info/dialog.scss @@ -0,0 +1,36 @@ +@use '../../../styles/variate.scss' as *; + +$font_size: 2.67vh; +.basic-info-dialog { + font-family: $font-text; + display: flex; + justify-content: center; + flex-direction: column; + padding: 1.67vh; + + .amount { + width: 200px; + } + + .reason { + width: 350px; + } + + .row { + display: flex; + align-items: center; + justify-content: space-between; + + .item { + flex: 1; + display: flex; + align-items: center; + } + } + + .buttons { + display: flex; + justify-content: center; + gap: 50px; + } +} diff --git a/src/page/student-mgr/basic-info/index.ts b/src/page/student-mgr/basic-info/index.ts new file mode 100644 index 0000000..6d34134 --- /dev/null +++ b/src/page/student-mgr/basic-info/index.ts @@ -0,0 +1,41 @@ +export interface Personality { + name: string + resourceUrl: string + personalInfoResourceUrl: string + productCode: string + remark: number +} + +export interface UserInfo { + id: any + account: string + nickName: string + name: string + sex: number + avatarUrl: string + lastLoginTime: string + lastLoginTimeStr: string + className: string + classId: string + cumulativeTimeDuration: number + cumulativeTimeDurationStr: string + currentName: string + currentLevelNum: number + currentExp: number + currentExpStart: number + currentExpEnd: number + nextName: string + nextLevelNum: number + nextExp: number + personInUsePersonalities: Personality[] + englishSubjectExpLevelVo: null + learnGradeId: string + // 乐贝 + currency: number + // 钻石 + diamond: number + // 状态 + status: number + // 累计签到 + aggregateLoginNum: number +} diff --git a/src/page/student-mgr/basic-info/index.vue b/src/page/student-mgr/basic-info/index.vue new file mode 100644 index 0000000..236b7db --- /dev/null +++ b/src/page/student-mgr/basic-info/index.vue @@ -0,0 +1,332 @@ + + + + + diff --git a/src/page/student-mgr/basic-info/user-detail.vue b/src/page/student-mgr/basic-info/user-detail.vue new file mode 100644 index 0000000..fdbaf3e --- /dev/null +++ b/src/page/student-mgr/basic-info/user-detail.vue @@ -0,0 +1,417 @@ + + + + + diff --git a/src/page/student-mgr/coin-detail/index.vue b/src/page/student-mgr/coin-detail/index.vue new file mode 100644 index 0000000..8541296 --- /dev/null +++ b/src/page/student-mgr/coin-detail/index.vue @@ -0,0 +1,304 @@ + + + + + diff --git a/src/page/student-mgr/index.scss b/src/page/student-mgr/index.scss new file mode 100644 index 0000000..9f7c8c7 --- /dev/null +++ b/src/page/student-mgr/index.scss @@ -0,0 +1,139 @@ +@use '../../styles/variate.scss' as *; + +$raduis: 20px; +$font_size: 2.67vh; +$heder_h: 6.17vh; + +.stu-mgr-content { + margin-top: $space-3_h; + width: 100%; + height: calc(100% - 11vh); + position: relative; + .table-box { + height: 77vh; + } + &::after { + content: ''; + display: block; + width: calc(100% - 40px); + height: 1vh; + position: absolute; + top: 8vh; + left: 20px; + background: v-bind(student_bg_hollow); + background-size: 20px 12px; + } +} + +.student-toolbar { + height: 8.5vh; + border-top-left-radius: $raduis; + border-top-right-radius: $raduis; + background: linear-gradient(269deg, #83fff3 0%, #77e3ff 100%); + padding: 0 $space-4 0.42vh; + display: flex; + align-items: center; + position: relative; + + justify-content: space-between; + color: $font-tag-color; + font-size: $font-size-7; + font-family: $font-special; + + .status-button { + height: 5vh; + } + + :deep(.el-input) { + width: 320px; + height: 4.83vh; + .el-input__wrapper { + height: 4.83vh; + border-radius: 1.67vh; + background: rgba(0, 0, 0, 0.6); + box-shadow: none; + .el-input__inner { + font-size: 2.67vh; + color: rgba(255, 255, 255, 0.85); + } + } + .el-input__icon { + font-size: 2.67vh; + color: #4de798; + } + } + + .left-items { + display: flex; + align-items: center; + column-gap: $space-4; + } + + .right-items { + display: flex; + column-gap: $space-4; + } + + .update-time-box { + display: flex; + align-items: center; + column-gap: $space-4; + + .icon-text { + display: flex; + align-items: center; + column-gap: $space-1; + } + } +} + +.student-table { + max-height: 100%; + background: #fff; + @include checkbox; + + :deep(.el-table__header) { + // border-radius: $radius-5; + overflow: hidden; + margin-bottom: $space-1_h; + + .el-table__cell { + background: #d2f1ff; + color: $font-color; + font-family: $font-special; + padding: 0; + + .cell { + font-size: $font-size-5; + height: $heder_h; + line-height: $heder_h; + } + } + } + + :deep(.el-table__body) { + // border-radius: 1.67vh; + overflow: hidden; + background: none; + .row-disabled { + color: rgba(212, 84, 78, 0.45); + } + } + + :deep(.el-table__row) { + background: #fff; + font-family: $font-special; + color: $font-tag-color; + font-size: $font-size-7; + padding: $space-1_h $space-2; + box-shadow: 0 0.33vh 0.33vh 0 rgba(0, 0, 0, 0.15); + + .el-table__cell { + padding: 0; + .cell { + height: 7vh; + line-height: 7vh; + } + } + } +} diff --git a/src/page/student-mgr/index.ts b/src/page/student-mgr/index.ts new file mode 100644 index 0000000..f73d15e --- /dev/null +++ b/src/page/student-mgr/index.ts @@ -0,0 +1 @@ +export const only_last_id_value = 'student_manage' diff --git a/src/page/student-mgr/index.vue b/src/page/student-mgr/index.vue new file mode 100644 index 0000000..34d6019 --- /dev/null +++ b/src/page/student-mgr/index.vue @@ -0,0 +1,98 @@ + + + diff --git a/src/page/student-mgr/routes.ts b/src/page/student-mgr/routes.ts new file mode 100644 index 0000000..40da0d3 --- /dev/null +++ b/src/page/student-mgr/routes.ts @@ -0,0 +1,52 @@ +import type { RouteRecordRaw } from 'vue-router' +import studentManage_c from './index.vue' + +const routes: RouteRecordRaw = { + path: 'student-mgr', + children: [ + { + name: 'studentManage', + path: '', + component: studentManage_c, + meta: { title: '学员管理' }, + }, + { + name: 'coin-detail', + path: 'coin-detail', + component: () => import('./coin-detail/index.vue'), + meta: { title: '乐贝明细' }, + }, + { + name: 'coin-detail', + path: 'coin-detail', + component: () => import('./coin-detail/index.vue'), + meta: { title: '乐贝明细' }, + }, + { + name: 'set-book', + path: 'set-book', + component: () => import('./set-book/index.vue'), + meta: { title: '教材设置' }, + }, + { + name: 'set-task', + path: 'set-task', + component: () => import('./set-task/index.vue'), + meta: { title: '任务设置' }, + }, + { + name: 'add-task', + path: 'add-task', + component: () => import('./set-task/add-task/index.vue'), + meta: { title: '添加任务' }, + }, + { + name: 'task-detail', + path: 'task-detail', + component: () => import('./set-task/task-detail/index.vue'), + meta: { title: '任务明细' }, + }, + ], +} + +export default routes diff --git a/src/page/student-mgr/set-book/index.vue b/src/page/student-mgr/set-book/index.vue new file mode 100644 index 0000000..f1aee1f --- /dev/null +++ b/src/page/student-mgr/set-book/index.vue @@ -0,0 +1,157 @@ + + + + diff --git a/src/page/student-mgr/set-task/add-task/index.scss b/src/page/student-mgr/set-task/add-task/index.scss new file mode 100644 index 0000000..b2db766 --- /dev/null +++ b/src/page/student-mgr/set-task/add-task/index.scss @@ -0,0 +1,16 @@ +@use '../../../../styles/variate.scss' as *; + +.mj-data-item { + .button { + height: 5vh; + } +} + +.amount { + width: 160px; +} + +.title { + width: 160px; + margin-right: 16px; +} diff --git a/src/page/student-mgr/set-task/add-task/index.vue b/src/page/student-mgr/set-task/add-task/index.vue new file mode 100644 index 0000000..835d35a --- /dev/null +++ b/src/page/student-mgr/set-task/add-task/index.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/src/page/student-mgr/set-task/add-task/reward-item/index.vue b/src/page/student-mgr/set-task/add-task/reward-item/index.vue new file mode 100644 index 0000000..951875f --- /dev/null +++ b/src/page/student-mgr/set-task/add-task/reward-item/index.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/src/page/student-mgr/set-task/add-task/target-item/index.vue b/src/page/student-mgr/set-task/add-task/target-item/index.vue new file mode 100644 index 0000000..06ff7a5 --- /dev/null +++ b/src/page/student-mgr/set-task/add-task/target-item/index.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/src/page/student-mgr/set-task/add-task/target-item/set-target.vue b/src/page/student-mgr/set-task/add-task/target-item/set-target.vue new file mode 100644 index 0000000..26e5621 --- /dev/null +++ b/src/page/student-mgr/set-task/add-task/target-item/set-target.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/src/page/student-mgr/set-task/add-task/task-cfg-item/index.vue b/src/page/student-mgr/set-task/add-task/task-cfg-item/index.vue new file mode 100644 index 0000000..1e23d8a --- /dev/null +++ b/src/page/student-mgr/set-task/add-task/task-cfg-item/index.vue @@ -0,0 +1,80 @@ + + + + + diff --git a/src/page/student-mgr/set-task/add-task/task-cfg-item/task-free-learn/index.vue b/src/page/student-mgr/set-task/add-task/task-cfg-item/task-free-learn/index.vue new file mode 100644 index 0000000..72f01c0 --- /dev/null +++ b/src/page/student-mgr/set-task/add-task/task-cfg-item/task-free-learn/index.vue @@ -0,0 +1,185 @@ + + + + + diff --git a/src/page/student-mgr/set-task/add-task/task-cfg-item/task-sentence/index.vue b/src/page/student-mgr/set-task/add-task/task-cfg-item/task-sentence/index.vue new file mode 100644 index 0000000..7464d16 --- /dev/null +++ b/src/page/student-mgr/set-task/add-task/task-cfg-item/task-sentence/index.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/page/student-mgr/set-task/add-task/task-cfg-item/task-word-quest/index.vue b/src/page/student-mgr/set-task/add-task/task-cfg-item/task-word-quest/index.vue new file mode 100644 index 0000000..3fe186a --- /dev/null +++ b/src/page/student-mgr/set-task/add-task/task-cfg-item/task-word-quest/index.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/src/page/student-mgr/set-task/add-task/task-cfg-item/task-word-table/index.vue b/src/page/student-mgr/set-task/add-task/task-cfg-item/task-word-table/index.vue new file mode 100644 index 0000000..9edb6d0 --- /dev/null +++ b/src/page/student-mgr/set-task/add-task/task-cfg-item/task-word-table/index.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/src/page/student-mgr/set-task/index.ts b/src/page/student-mgr/set-task/index.ts new file mode 100644 index 0000000..aff46f9 --- /dev/null +++ b/src/page/student-mgr/set-task/index.ts @@ -0,0 +1,98 @@ +import obj from '@/utils/obj' + +export type SetTargetDataItem = { + id: any + name: string +} + +export type SetTargetData = { + classes: SetTargetDataItem[] + students: SetTargetDataItem[] +} + +// 任务主题 +export const topic_free_learn = 'free_learn' +export const topic_word_mastery = 'word_mastery' +export const topic_word_quest = 'word_quest' +export const topic_word_review = 'word_review' +export const topic_sentence_training = 'sentence_training' +export const topicTypeCodeMap = { + [topic_word_mastery]: '单词掌握', + [topic_word_review]: '单词复习', + [topic_word_quest]: '单词闯关', + [topic_sentence_training]: '句子训练', + [topic_free_learn]: '自由学', +} as any +export const topicTypeCodeOptions = obj.map2options(topicTypeCodeMap) +export const topicTypeCodeOptions2 = topicTypeCodeOptions.filter( + (item: any) => item.value !== topic_word_review, +) + +// 任务优先级 +export const task_priority_normal = 0 +export const task_priority_middle = 1 +export const task_priority_high = 2 +export const task_priority_map = { + [task_priority_normal]: '普通', + [task_priority_middle]: '中', + [task_priority_high]: '高', +} as any +export const task_priority_options = obj.map2options(task_priority_map) + +// 任务状态 +export const task_status_unpublished = 0 +export const task_status_ready = 1 +export const task_status_ing = 2 +export const task_status_canceled = 3 +export const task_status_finished = 4 +export const task_status_map = { + [task_status_unpublished]: '待发布', + [task_status_ready]: '待开始', + [task_status_ing]: '执行中', + [task_status_canceled]: '被取消', + [task_status_finished]: '已完成', +} as any + +// 用户任务 0 未开始, 1 执行中 2 完成 3 未完成 +export const user_task_status_unpublished = 0 +export const user_task_status_ing = 1 +export const user_task_status_finished = 2 +export const user_task_status_unfinished = 3 +export const user_task_status_canceled = 4 +export const user_task_status_map = { + [user_task_status_unpublished]: '待开始', + [user_task_status_ing]: '执行中', + [user_task_status_finished]: '已完成', + [user_task_status_unfinished]: '未完成', + [user_task_status_canceled]: '被取消', +} as any + +export function getTaskStatusClass(status: any) { + switch (Number(status)) { + case task_status_canceled: + return 'task-canceled' + case task_status_ready: + return 'task-ready' + case task_status_finished: + return 'task-finished' + case task_status_ing: + return 'tasking' + case task_status_unpublished: + return 'task-unpublished' + } +} + +export function getUserStatusClass(status: any) { + switch (Number(status)) { + case user_task_status_unfinished: + return 'task-unfinished' + case user_task_status_canceled: + return 'task-canceled' + case user_task_status_finished: + return 'task-finished' + case user_task_status_ing: + return 'tasking' + case user_task_status_unpublished: + return 'task-ready' + } +} diff --git a/src/page/student-mgr/set-task/index.vue b/src/page/student-mgr/set-task/index.vue new file mode 100644 index 0000000..3b52792 --- /dev/null +++ b/src/page/student-mgr/set-task/index.vue @@ -0,0 +1,271 @@ + + + + + diff --git a/src/page/student-mgr/set-task/store.ts b/src/page/student-mgr/set-task/store.ts new file mode 100644 index 0000000..4f037a2 --- /dev/null +++ b/src/page/student-mgr/set-task/store.ts @@ -0,0 +1 @@ +export const word_review_access = [] diff --git a/src/page/student-mgr/set-task/task-detail/index.vue b/src/page/student-mgr/set-task/task-detail/index.vue new file mode 100644 index 0000000..cad713e --- /dev/null +++ b/src/page/student-mgr/set-task/task-detail/index.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/page/student-mgr/set-task/task-detail/task-basic-info.vue b/src/page/student-mgr/set-task/task-detail/task-basic-info.vue new file mode 100644 index 0000000..483f23f --- /dev/null +++ b/src/page/student-mgr/set-task/task-detail/task-basic-info.vue @@ -0,0 +1,261 @@ + + + + + diff --git a/src/page/student-mgr/store/index.ts b/src/page/student-mgr/store/index.ts new file mode 100644 index 0000000..fd2f249 --- /dev/null +++ b/src/page/student-mgr/store/index.ts @@ -0,0 +1,58 @@ +import { userStore } from '@/stores' +import { defineStore } from 'pinia' + +export const nav_rank = 1 +export const nav_basic = 2 +export const nav_english_word = 3 +export const nav_english = 4 +export const nav_math = 5 +export const nav_chinese = 6 +export const navList = [ + { + value: nav_rank, + label: '综合', + }, + { + value: nav_english_word, + label: '单词句子', + }, + { + value: nav_english, + label: '英语', + }, + { + value: nav_math, + label: '数学', + }, + { + value: nav_chinese, + label: '语文', + }, +] + +export const useStudentManageStore = defineStore('student-manage', () => { + const schoolId = ref('') + const classId = ref('') + const { userInfo } = storeToRefs(userStore()) + + if (userInfo.value.isTeacher) { + navList.unshift({ + value: nav_basic, + label: '管理', + }) + } + const activeNav = ref(navList[0].value) + + const $reset = () => { + schoolId.value = '' + classId.value = '' + activeNav.value = navList[0].value + } + + return { + $reset, + schoolId, + classId, + activeNav, + } +}) diff --git a/src/page/student-mgr/study-data/chinese-data.vue b/src/page/student-mgr/study-data/chinese-data.vue new file mode 100644 index 0000000..4eb5853 --- /dev/null +++ b/src/page/student-mgr/study-data/chinese-data.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/page/student-mgr/study-data/column.tsx b/src/page/student-mgr/study-data/column.tsx new file mode 100644 index 0000000..4b60647 --- /dev/null +++ b/src/page/student-mgr/study-data/column.tsx @@ -0,0 +1,305 @@ +import num from '@/utils/num' +import { px2px, secondsToHours } from '@/utils/tool' + +// 未分组的名称 +export const UNGROUP_NAME = '其他' + +// 总计 +export const P_TYPE_TOTAL = 1 +// 每日 +export const P_TYPE_DAILY = 2 +// 个人 +export const P_GROUP_PERSONAL = 1 +// 小组 +export const P_GROUP_GROUP = 2 + +// 处理数值 +export const processNumberValue = function (values: any[], column: any, len: number) { + let ret = '' + if (!values.every(value => Number.isNaN(value))) { + ret = num.toFixed2( + values.reduce((prev, curr) => { + const value = Number(curr) + if (!Number.isNaN(value)) { + return prev + curr + } else { + return prev + } + }, 0) / len, + ) + if (column.property === 'learnTime' && ret !== '0') { + ret = secondsToHours(Number(ret)) + } + } else { + ret = '' + } + return ret +} + +function timeValueFn(time: any) { + return time && secondsToHours(time) +} + +function makeCellWithAverage(props: any, valueFn: any = undefined) { + const prop = props.prop + return { + ...props, + render: (_: any, scope: any) => { + let val = scope.row[prop] + if (valueFn) { + val = valueFn(val) + } + if (scope.row.average && scope.row[prop] < scope.row.average[prop]) { + // 低于平均值的,用特殊颜色显示 + return {val} + } else { + return val + } + }, + } +} + +const wordStrangerCount = { + label: '陌生', + prop: 'wordStrangerCount', +} + +const name = { + label: '姓名', + prop: 'name', + width: px2px(150), + noAverage: true, +} + +const starCount = { + label: '星星', + prop: 'starCount', + sortable: true, +} + +const wordKnowCount = { + label: '认识', + prop: 'wordKnowCount', +} + +const wordKnowWellCount = { + label: '熟悉', + prop: 'wordKnowWellCount', +} + +const wordGraspCount = makeCellWithAverage({ + label: '掌握', + prop: 'wordGraspCount', + sortable: true, +}) + +// const rightRate = makeCellWithAverage( +// { +// label: '正确率', +// prop: 'rightRate', +// sortable: true, +// }, +// (val: any) => val + '%', +// ) + +const wordCount = makeCellWithAverage({ + label: '总数', + prop: 'wordCount', + sortable: true, +}) + +const newWordCount = makeCellWithAverage({ + label: '新词数', + prop: 'newWordCount', +}) + +// const wordReviewCount = { +// label: '复习数', +// prop: 'wordReviewCount', +// render: (h, scope) => { +// return scope.row.wordCount - scope.row.newWordCount +// } +// } + +const sentenceCount = makeCellWithAverage({ + label: '句子', + prop: 'sentenceCount', + sortable: true, +}) + +const knowledgeCount = makeCellWithAverage({ + label: '知识点', + prop: 'knowledgeCount', + sortable: true, +}) + +const learnTime = makeCellWithAverage( + { + label: '有效时长', + prop: 'learnTime', + width: px2px(180), + sortable: true, + }, + timeValueFn, +) + +// 英语(每日) +export const englishDailyColumn = function (event: { [key: string]: any }): any[] { + const cols = [ + name, + learnTime, + wordStrangerCount, + wordKnowCount, + wordKnowWellCount, + wordGraspCount, + newWordCount, + wordCount, + starCount, + sentenceCount, + // knowledgeCount, + ] + if (event.group === P_GROUP_PERSONAL) { + cols.unshift({ + label: '序号', + type: 'index', + }) + } + return cols +} + +// 英语(总计) +export const englishTotalColumn = function (event: { [key: string]: any }): any[] { + const cols = [ + name, + learnTime, + wordStrangerCount, + wordKnowCount, + wordKnowWellCount, + wordGraspCount, + wordCount, + starCount, + // rightRate, + sentenceCount, + // knowledgeCount, + ] + if (event.group === P_GROUP_PERSONAL) { + cols.unshift({ + label: '序号', + type: 'index', + }) + } + return cols +} + +// 综合排名(每日、总计) +export const rankColumn = function (event: { [key: string]: any }): any[] { + const cols = [ + { + label: '姓名', + prop: 'name', + noAverage: true, + }, + { + label: '有效时长', + prop: 'learnTime', + sortable: true, + render: (_: any, scope: any) => timeValueFn(scope.row.learnTime), + }, + // { + // label: '单词掌握', + // prop: 'wordGraspCount', + // sortable: true, + // }, + // { + // label: '单词总数', + // prop: 'wordCount', + // sortable: true, + // }, + // { + // label: '句子', + // prop: 'sentenceLearnCount', + // sortable: true, + // }, + { + label: '知识点', + prop: 'knowledgeCount', + sortable: true, + }, + { + label: '错题', + prop: 'errorCount', + sortable: true, + }, + { + label: '订正', + prop: 'correctCount', + sortable: true, + }, + { + label: '乐贝', + prop: 'currency', + sortable: true, + }, + ] + if (event.group === P_GROUP_PERSONAL) { + cols.unshift({ + label: '序号', + type: 'index', + } as any) + } + return cols +} + +// 学科(每日、总计) +export const subjectColumn = function (event: { [key: string]: any }): any[] { + const cols = [ + { + label: '姓名', + prop: 'name', + noAverage: true, + }, + { + label: '有效时长', + prop: 'learnTime', + sortable: true, + render: (_: any, scope: any) => timeValueFn(scope.row.learnTime), + }, + { + label: '答题正确', + prop: 'successTestCount', + sortable: true, + }, + { + label: '答题错误', + prop: 'errorTestCount', + sortable: true, + }, + { + label: '知识点总数', + prop: 'allKnowledgeCount', + sortable: true, + }, + { + label: '知识点掌握', + prop: 'allKnowledgeGraspCount', + sortable: true, + }, + { + label: '订正总数', + prop: 'allReviewCount', + sortable: true, + }, + { + label: '订正正确', + prop: 'successReviewCount', + sortable: true, + }, + ] + if (event.group === P_GROUP_PERSONAL) { + cols.unshift({ + label: '序号', + type: 'index', + } as any) + } + return cols +} diff --git a/src/page/student-mgr/study-data/english-data.vue b/src/page/student-mgr/study-data/english-data.vue new file mode 100644 index 0000000..0d14b1f --- /dev/null +++ b/src/page/student-mgr/study-data/english-data.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/page/student-mgr/study-data/english-word-data.vue b/src/page/student-mgr/study-data/english-word-data.vue new file mode 100644 index 0000000..acf3e70 --- /dev/null +++ b/src/page/student-mgr/study-data/english-word-data.vue @@ -0,0 +1,228 @@ + + + + diff --git a/src/page/student-mgr/study-data/hooks/auto-update.ts b/src/page/student-mgr/study-data/hooks/auto-update.ts new file mode 100644 index 0000000..92fe723 --- /dev/null +++ b/src/page/student-mgr/study-data/hooks/auto-update.ts @@ -0,0 +1,54 @@ +import dayjs from 'dayjs' +import { P_TYPE_DAILY } from '../column' +import { userStore } from '@/stores' +import { storeToRefs } from 'pinia' + +export function useAutoUpdate(activeType: any, date: any, init: any) { + const { userInfo } = storeToRefs(userStore()) + const updateTime = ref(dayjs().format('HH:mm:ss')) + const showUpdateTime = computed( + () => + userInfo.value.isTeacher && + activeType.value === P_TYPE_DAILY && + dayjs(date.value).isSame(dayjs(), 'day'), + ) + + const autoUpdate = ref(false) + function changeAuto() { + autoUpdate.value = !autoUpdate.value + } + + let timer: any + watch([() => showUpdateTime.value, () => autoUpdate.value], () => { + if (showUpdateTime.value && autoUpdate.value) { + updateData() + } else { + clearInterval(timer) + timer = null + } + }) + + function _updateData() { + init(false) + updateTime.value = dayjs().format('HH:mm:ss') + } + + function updateData() { + clearInterval(timer) + _updateData() + + // 20秒 + timer = setInterval(_updateData, 20000) + } + + onUnmounted(() => { + clearInterval(timer) + }) + + return { + updateTime, + showUpdateTime, + autoUpdate, + changeAuto, + } +} diff --git a/src/page/student-mgr/study-data/hooks/index.ts b/src/page/student-mgr/study-data/hooks/index.ts new file mode 100644 index 0000000..08fa3e0 --- /dev/null +++ b/src/page/student-mgr/study-data/hooks/index.ts @@ -0,0 +1,50 @@ +import dayjs from 'dayjs' +import { P_GROUP_GROUP, P_GROUP_PERSONAL, P_TYPE_DAILY, P_TYPE_TOTAL } from '../column' +import { useTable } from './table' +import { useAutoUpdate } from './auto-update' + +export function useStudyData(init: any) { + const date = ref(dayjs().format('YYYY-MM-DD')) + + const groupList = [ + { + value: P_GROUP_PERSONAL, + label: '个人', + }, + { + value: P_GROUP_GROUP, + label: '小组', + }, + ] + + const activeGroup = ref(P_GROUP_PERSONAL) + const typeList = [ + { + value: P_TYPE_DAILY, + label: '每日数据', + }, + { + value: P_TYPE_TOTAL, + label: '总计', + }, + ] + const activeType = ref(P_TYPE_TOTAL) + const loading = ref(false) + + watch([() => activeType.value, () => activeGroup.value, () => date.value], () => init()) + + onMounted(async () => { + init() + }) + + return { + ...useTable(), + ...useAutoUpdate(activeType, date, init), + loading, + date, + groupList, + activeGroup, + typeList, + activeType, + } +} diff --git a/src/page/student-mgr/study-data/hooks/table.ts b/src/page/student-mgr/study-data/hooks/table.ts new file mode 100644 index 0000000..55d29ed --- /dev/null +++ b/src/page/student-mgr/study-data/hooks/table.ts @@ -0,0 +1,57 @@ +import { XbTableClass } from '@/utils' +import { processNumberValue } from '../column' +import { TableColumnCtx } from 'element-plus' + +export interface SummaryMethodProps { + columns: TableColumnCtx[] + data: T[] +} + +export function useTable() { + const tableRef = ref() + const xbTable = reactive( + new XbTableClass({ + column: [], + page: { + size: -1, + current: 1, + total: 0, + }, + expandAll: false, + data: [], + }), + ) + provide('xbTable', xbTable) + + async function handleHeaderClick(data: anyObj) { + if (!data.sortable) return + tableRef.value.getRef().sort(data.property, 'descending') + } + + // 底部的那行数据 + function getSummaries(param: SummaryMethodProps) { + const { columns, data } = param + const sums: (string | number)[] = [] + const len = xbTable.table.data?.length || 0 + columns.forEach((column, index) => { + if (index === 0) { + sums[index] = '平均' + return + } + if (column.property === 'name') { + sums[index] = '' + return + } + const values = data.map(item => Number(item[column.property])) + sums[index] = processNumberValue(values, column, len) + }) + return sums + } + + return { + getSummaries, + handleHeaderClick, + tableRef, + xbTable, + } +} diff --git a/src/page/student-mgr/study-data/index.scss b/src/page/student-mgr/study-data/index.scss new file mode 100644 index 0000000..1af9c9b --- /dev/null +++ b/src/page/student-mgr/study-data/index.scss @@ -0,0 +1,91 @@ +@use '../index.scss' as *; + +:global(.report-loading .el-loading-spinner .el-loading-text) { + font-size: 2.33vh; + color: #fff; +} + +.table-box { + overflow: hidden; + border-bottom-left-radius: $raduis; + border-bottom-right-radius: $raduis; + + :deep(.el-table) { + --el-fill-color-lighter: #e7f8ff; + + th { + height: 7vh !important; + background: #d2f1ff !important; + font-size: 2.17vh; + } + + th, + td { + text-align: center; + } + + .el-table__empty-text { + font-size: 2.17vh; + } + + .el-table__row { + height: 7vh !important; + font-size: 2.33vh; + + .cell { + line-height: 2.33vh; + } + + .el-table__expand-icon { + width: 2.17vh; + height: 2.17vh; + + .el-icon { + font-size: 2.17vh; + } + } + } + + .el-table__footer-wrapper { + font-size: 2.33vh; + + .el-table__footer { + height: 7vh !important; + } + + tfoot td.el-table__cell { + background: #d2f1ff !important; + } + } + + .caret-wrapper { + height: 2.33vh; + pointer-events: none; + + .sort-caret { + border-width: 0.83vh; + + &.ascending { + top: -0.5vh; + display: none; + } + + &.descending { + bottom: 0; + } + } + } + + // .cell { + // white-space: pre-wrap !important; + // word-break: break-word; + // line-height: 1.5em !important; + // } + + // .el-table-column--default { + // .cell { + // display: none; + // } + // } + } +} diff --git a/src/page/student-mgr/study-data/math-data.vue b/src/page/student-mgr/study-data/math-data.vue new file mode 100644 index 0000000..2a0eb57 --- /dev/null +++ b/src/page/student-mgr/study-data/math-data.vue @@ -0,0 +1,14 @@ + + + diff --git a/src/page/student-mgr/study-data/rank.vue b/src/page/student-mgr/study-data/rank.vue new file mode 100644 index 0000000..bb9bc93 --- /dev/null +++ b/src/page/student-mgr/study-data/rank.vue @@ -0,0 +1,174 @@ + + + + diff --git a/src/page/student-mgr/study-data/subject-data.vue b/src/page/student-mgr/study-data/subject-data.vue new file mode 100644 index 0000000..c843a98 --- /dev/null +++ b/src/page/student-mgr/study-data/subject-data.vue @@ -0,0 +1,183 @@ + + + + diff --git a/src/page/study-analysis/components/KnowledgeChart.vue b/src/page/study-analysis/components/KnowledgeChart.vue new file mode 100644 index 0000000..d35dd7c --- /dev/null +++ b/src/page/study-analysis/components/KnowledgeChart.vue @@ -0,0 +1,435 @@ + + + + diff --git a/src/page/study-analysis/components/KnowledgeList.vue b/src/page/study-analysis/components/KnowledgeList.vue new file mode 100644 index 0000000..cf58c0e --- /dev/null +++ b/src/page/study-analysis/components/KnowledgeList.vue @@ -0,0 +1,94 @@ + + + + diff --git a/src/page/study-analysis/components/NumberCard.vue b/src/page/study-analysis/components/NumberCard.vue new file mode 100644 index 0000000..eff7c28 --- /dev/null +++ b/src/page/study-analysis/components/NumberCard.vue @@ -0,0 +1,90 @@ + + + + diff --git a/src/page/study-analysis/components/ReadData.vue b/src/page/study-analysis/components/ReadData.vue new file mode 100644 index 0000000..28df056 --- /dev/null +++ b/src/page/study-analysis/components/ReadData.vue @@ -0,0 +1,315 @@ + + + + diff --git a/src/page/study-analysis/components/SelectTime.vue b/src/page/study-analysis/components/SelectTime.vue new file mode 100644 index 0000000..3e0d765 --- /dev/null +++ b/src/page/study-analysis/components/SelectTime.vue @@ -0,0 +1,92 @@ + + + + diff --git a/src/page/study-analysis/components/StudyTime.vue b/src/page/study-analysis/components/StudyTime.vue new file mode 100644 index 0000000..1029761 --- /dev/null +++ b/src/page/study-analysis/components/StudyTime.vue @@ -0,0 +1,246 @@ + + + + diff --git a/src/page/study-analysis/components/TopicChart.vue b/src/page/study-analysis/components/TopicChart.vue new file mode 100644 index 0000000..ca186a2 --- /dev/null +++ b/src/page/study-analysis/components/TopicChart.vue @@ -0,0 +1,495 @@ + + + + diff --git a/src/page/study-analysis/components/VideoTime.vue b/src/page/study-analysis/components/VideoTime.vue new file mode 100644 index 0000000..174c49a --- /dev/null +++ b/src/page/study-analysis/components/VideoTime.vue @@ -0,0 +1,325 @@ + + + + diff --git a/src/page/study-analysis/components/WordChart.vue b/src/page/study-analysis/components/WordChart.vue new file mode 100644 index 0000000..0abf692 --- /dev/null +++ b/src/page/study-analysis/components/WordChart.vue @@ -0,0 +1,585 @@ + + + + diff --git a/src/page/study-analysis/hooks.ts b/src/page/study-analysis/hooks.ts new file mode 100644 index 0000000..4129e95 --- /dev/null +++ b/src/page/study-analysis/hooks.ts @@ -0,0 +1,18 @@ +export function getArrow(current: string | number, previous: string | number) { + return Number(current) > Number(previous) + ? 'arrow_up' + : Number(current) === Number(previous) + ? 'arrow_flat_orange' + : 'arrow_down' +} + +export function timeTool(second: string | number, isminute = false) { + const seconds = Number(second) + let h: number | string = Math.floor(seconds / 3600) + let m: number | string = Math.floor((seconds % 3600) / 60) + // 补零 + h = h < 10 ? '0' + h : h + m = m < 10 ? '0' + m : m + + return isminute ? m : h +} diff --git a/src/page/study-analysis/index.vue b/src/page/study-analysis/index.vue new file mode 100644 index 0000000..1a31587 --- /dev/null +++ b/src/page/study-analysis/index.vue @@ -0,0 +1,213 @@ + + + + diff --git a/src/page/study-analysis/interface.ts b/src/page/study-analysis/interface.ts new file mode 100644 index 0000000..9bd742f --- /dev/null +++ b/src/page/study-analysis/interface.ts @@ -0,0 +1,8 @@ +export interface selectType { + value: string | number + label: string | number +} + +export interface itemType { + remark: number +} diff --git a/src/page/study-analysis/routes.ts b/src/page/study-analysis/routes.ts new file mode 100644 index 0000000..9ed7f29 --- /dev/null +++ b/src/page/study-analysis/routes.ts @@ -0,0 +1,12 @@ +import type { RouteRecordRaw } from 'vue-router' +import studyAnalysis_c from './index.vue' // 静态导入组件 + +const routes: RouteRecordRaw = { + name: 'studyAnalysis', + path: '/studyAnalysis', + // component: () => import('./index.vue'), + component: studyAnalysis_c, + meta: { title: '学情分析' }, +} + +export default routes diff --git a/src/page/subject/SubjectDia.vue b/src/page/subject/SubjectDia.vue new file mode 100644 index 0000000..8ccee02 --- /dev/null +++ b/src/page/subject/SubjectDia.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/src/page/subject/aiStudy/index.vue b/src/page/subject/aiStudy/index.vue new file mode 100644 index 0000000..42eb379 --- /dev/null +++ b/src/page/subject/aiStudy/index.vue @@ -0,0 +1,279 @@ + + + diff --git a/src/page/subject/components/Book.vue b/src/page/subject/components/Book.vue new file mode 100644 index 0000000..d0f08cc --- /dev/null +++ b/src/page/subject/components/Book.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/src/page/subject/components/Card.vue b/src/page/subject/components/Card.vue new file mode 100644 index 0000000..1932b0f --- /dev/null +++ b/src/page/subject/components/Card.vue @@ -0,0 +1,184 @@ + + + diff --git a/src/page/subject/components/MapRegion.vue b/src/page/subject/components/MapRegion.vue new file mode 100644 index 0000000..7474aba --- /dev/null +++ b/src/page/subject/components/MapRegion.vue @@ -0,0 +1,270 @@ + + + diff --git a/src/page/subject/components/VideoFullBox/index.vue b/src/page/subject/components/VideoFullBox/index.vue new file mode 100644 index 0000000..6f69c5b --- /dev/null +++ b/src/page/subject/components/VideoFullBox/index.vue @@ -0,0 +1,125 @@ + + + diff --git a/src/page/subject/dictionaries/components/TopSearch.vue b/src/page/subject/dictionaries/components/TopSearch.vue new file mode 100644 index 0000000..50cb064 --- /dev/null +++ b/src/page/subject/dictionaries/components/TopSearch.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/src/page/subject/dictionaries/components/seekWords.vue b/src/page/subject/dictionaries/components/seekWords.vue new file mode 100644 index 0000000..eb7fad2 --- /dev/null +++ b/src/page/subject/dictionaries/components/seekWords.vue @@ -0,0 +1,535 @@ + + + diff --git a/src/page/subject/dictionaries/index.vue b/src/page/subject/dictionaries/index.vue new file mode 100644 index 0000000..34884dd --- /dev/null +++ b/src/page/subject/dictionaries/index.vue @@ -0,0 +1,97 @@ + + + diff --git a/src/page/subject/dictionaries/interface/index.ts b/src/page/subject/dictionaries/interface/index.ts new file mode 100644 index 0000000..ca85840 --- /dev/null +++ b/src/page/subject/dictionaries/interface/index.ts @@ -0,0 +1,27 @@ +export interface SearchHistory { + createTime: string + createUser: string + updateTime: string | null + updateUser: string | null + id: any + searchValue: string + wordId: string + wordSpell: string + wordZnDesc: string | null + stageState: number + status: number + delFlag: number + meaningSimpleList: any[] + meaningSimpleListNew?: any[] +} +export interface SearchResult { + id: any + wordId: string + wordSpell: string + wordZnDesc: string + wordEnDesc: string | null + phraseFlag: number + completeFlag: number + meaningSimpleList: any[] + meaningSimpleListNew?: any[] +} diff --git a/src/page/subject/doWork/components/AiReplyDia.vue b/src/page/subject/doWork/components/AiReplyDia.vue new file mode 100644 index 0000000..7b412af --- /dev/null +++ b/src/page/subject/doWork/components/AiReplyDia.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/src/page/subject/doWork/components/Feedback.vue b/src/page/subject/doWork/components/Feedback.vue new file mode 100644 index 0000000..c23301b --- /dev/null +++ b/src/page/subject/doWork/components/Feedback.vue @@ -0,0 +1,237 @@ + + + diff --git a/src/page/subject/doWork/components/reportDia/KnowledgeList.vue b/src/page/subject/doWork/components/reportDia/KnowledgeList.vue new file mode 100644 index 0000000..5f79749 --- /dev/null +++ b/src/page/subject/doWork/components/reportDia/KnowledgeList.vue @@ -0,0 +1,123 @@ + + + diff --git a/src/page/subject/doWork/components/reportDia/index.vue b/src/page/subject/doWork/components/reportDia/index.vue new file mode 100644 index 0000000..66bfff4 --- /dev/null +++ b/src/page/subject/doWork/components/reportDia/index.vue @@ -0,0 +1,414 @@ + + + diff --git a/src/page/subject/doWork/index.ts b/src/page/subject/doWork/index.ts new file mode 100644 index 0000000..2f7c94b --- /dev/null +++ b/src/page/subject/doWork/index.ts @@ -0,0 +1,16 @@ +// 自由学 +export const resource_type_free = '0' +// AI精准学 +export const resource_type_ai = '1' +// 错题本 +export const resource_type_wrong_book = '2' +// 举一反三 +export const resource_type_analogy = '3' +// 组卷 +export const resource_type_paper = '7' +// 作业 +export const resource_type_homework = '8' +// 错题重练 +export const resource_type_wrong_retry = '10' +// 举一反三(错题本) +export const resource_type_similar_recommend = '11' diff --git a/src/page/subject/doWork/index.vue b/src/page/subject/doWork/index.vue new file mode 100644 index 0000000..272e26b --- /dev/null +++ b/src/page/subject/doWork/index.vue @@ -0,0 +1,1132 @@ + + + diff --git a/src/page/subject/doWork/parent.vue b/src/page/subject/doWork/parent.vue new file mode 100644 index 0000000..4b4ef93 --- /dev/null +++ b/src/page/subject/doWork/parent.vue @@ -0,0 +1,18 @@ + + diff --git a/src/page/subject/doWork/titles.ts b/src/page/subject/doWork/titles.ts new file mode 100644 index 0000000..0dc4abc --- /dev/null +++ b/src/page/subject/doWork/titles.ts @@ -0,0 +1,1373 @@ +export const list = [ + { + id: '1000262', + baseId: '1000162', + pid: '0', + title: + '下列不能支持“治学必须有怀疑精神”这一观点的一项是', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'A', + titleAnalyze: + 'A项,“学而时习之,不亦说乎”阐述的是按时温习的重要性,与“怀疑精神”无关,不能论证“治学必须有怀疑精神”这一观点。故答案选A。', + titleAnalyzePicture: null, + subjectId: 1, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '学而时习之,不亦说乎?——《论语》', + '博学之,审问之,慎思之,明辨之,笃行之。——《礼记》', + '打开科学大门的钥匙,无疑是一个问号。——李四光', + '提出一个问题往往比解决一个问题更重要。——爱因斯坦', + ], + ], + knowledgeIds: '1018608', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1021577', + baseId: '1021477', + pid: '1021476', + title: '杨花落尽子规)', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'B', + titleAnalyze: + '

这句诗的意思是杨花落完,子规啼鸣的时候。可知“啼”的意思是“鸣叫”,故答案选B。

', + titleAnalyzePicture: null, + subjectId: 1, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [['啼哭', '鸣叫', '打鸣']], + knowledgeIds: '1018585', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: '为下列诗句中加点的词选择正确的一项。', + }, + { + id: '1028054', + baseId: '1027954', + pid: '0', + title: + '
雁门太守行
李贺
黑云压城城欲摧,甲光向日金鳞开。
角声满天秋色里,塞上燕脂凝夜紫。
半卷红旗临易水,霜重鼓寒声不起。
报君黄金台上意,提携玉龙为君死。

塞下曲
李白
五月天山雪,无花只有寒。
笛中闻折柳,春色未曾看。
晓战随金鼓,宵眠抱玉鞍。
愿将腰下剑,直为斩楼兰

    [注]①楼兰:汉代西域国名,此指楼兰国王。据《汉书·傅介子传》记载,西汉昭帝时,楼兰国王屡次截杀通西域的汉使,大将军霍光派平乐监傅介子前往楼兰,用计刺杀了楼兰国王。
       对两首诗理解和分析不正确的一项是(

', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 4, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: + 'C项,“《塞下曲》中‘抱’字描绘将士们夜间休息时悠闲之态”表述有误,《塞下曲》中“抱”字描绘士卒夜间警备的情况,表现了军情之紧张急迫。故答案选C。', + titleAnalyzePicture: null, + subjectId: 1, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '《雁门太守行》中“角声满天秋色里”从听觉角度表现战争的规模,“塞上燕脂凝夜紫”从视觉角度表现战争的惨烈。', + '《塞下曲》首联写五月的天山有“雪”无“花”,寒气逼人,极力渲染边塞的严寒景象,突出环境的艰苦。', + '两首诗均用字考究,《雁门太守行》中“卷”字写出乘夜奔袭之状;《塞下曲》中“抱”字描绘将士们夜间休息时悠闲之态。', + '两首诗都运用典故,《雁门太守行》表达了守城将士们誓死报效君王的决心;《塞下曲》表现了将士们甘愿身赴疆场、为国立功的慷慨豪情。', + ], + ], + knowledgeIds: '1018586,1018588', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1185794', + baseId: '1185694', + pid: '0', + title: + '奇奇通过观察,发现人们对于动物的“家”有不同的称呼。
    “马旁边有一棵老树,树上有一个鸟,树下有一个狗,远处有一方鱼。”
       横线上应填的字是()', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 1, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'D', + titleAnalyze: + '

马的居所被称为“马厩”;鸟的居所被称为“鸟巢”;狗的居所被称为“狗窝”;鱼一般生活在有水的地方,包括池塘、河流等。故答案选D。

', + titleAnalyzePicture: null, + subjectId: 1, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '棚     塘     窝     巢 ', + '穴     巢     塘     窝 ', + '厩     窝     塘     巢 ', + '厩     巢     窝     塘 ', + ], + ], + knowledgeIds: '1018132', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1185857', + baseId: '1185757', + pid: '0', + title: + '明明看到西湖在阳光下和雨中的景色都非常迷人,他想起了诗句“ ”。()', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 1, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: + 'A项,描写的是荷花凋谢连那擎雨的荷叶也枯萎了,只有那开败了菊花的花枝还傲寒斗霜的景象。不符合题意。
B项,描写的是家中几个小孩还在兴致勃勃地斗蟋蟀,夜深人静了还亮着灯不肯睡眠的场景。不符合题意。
D项,描写的是采莲少女的绿罗裙融入到田田荷叶中,仿佛一色,少女的脸庞掩映在盛开的荷花间,相互映照。不符合题意。
C项,描写的是在晴日的阳光照射下,西湖水波荡漾,闪烁着粼粼的金光,风景秀丽;在阴雨的天气里,山峦在细雨中迷蒙一片,别有一种奇特的美。符合题意。
故答案选C。
', + titleAnalyzePicture: null, + subjectId: 1, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '荷尽已无擎雨盖,菊残犹有傲霜枝。', + '知有儿童挑促织,夜深篱落一灯明。', + '水光潋滟晴方好,山色空蒙雨亦奇。', + '荷叶罗裙一色裁,芙蓉向脸两边开。', + ], + ], + knowledgeIds: '1018188', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1186502', + baseId: '1186402', + pid: '0', + title: + '根据字形推断,汉字“”最有可能和 有关。', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 1, + stagePid: 1, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'D', + titleAnalyze: '根据字形,该汉字有着“金”字旁,可以推断与金属有关,故答案选D。', + titleAnalyzePicture: null, + subjectId: 1, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '火      ', + '水流      ', + '鸟类      ', + '金属\n', + ], + ], + knowledgeIds: '1018125,1018131,1018132', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1200632', + baseId: '1200532', + pid: '0', + title: + '生活中的智慧。
       东汉末年,曹操带兵去攻打张绣。时值盛夏,曹操的军队已经走了很多天了,十分疲乏。这一路上又都是荒山秃岭,方圆数十里都没有水源。头顶烈日,战士们被晒得头昏眼花,大汗淋漓,大家都口干舌燥,每走几里路,就有人因中暑而倒地身亡。曹操灵机一动,脑子里蹦出个好点子。他大声喊道:“ ”只见战士们精神振作起来,鼓足力气加紧向前赶去。就这样,曹操终于率领军队走到了有水源的地方。
你觉得曹操说的是下面哪句话?()', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 1, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'D', + titleAnalyze: + '从题目描述中,可以得知曹操的军队在盛夏时节,经历了长时间的行军,面临极度的疲劳和缺水的困境。在这种情况下,曹操需要一种能迅速提振士气,激发战士们求生欲望的方法。
D项“前方不远处就有一大片梅林,又酸又甜的大梅子等着咱们呢!” 这句话不仅给出了一个具体的目标——梅林,还描绘了大梅子又酸又甜的诱人画面。在极度口渴的情况下,这样的描述极有可能激发战士们的求生欲望,让他们为了吃到梅子而鼓起最后的力气前行。
故选:D。
', + titleAnalyzePicture: null, + subjectId: 1, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '大家赶快走,前面就有水源。', + '大家不想被饥渴打败吧?相信自己,胜利就在前方。', + '大家快走,不想被渴死的,就使劲往前走!', + '前方不远处就有一大片梅林,又酸又甜的大梅子等着咱们呢!', + ], + ], + knowledgeIds: '1018153,1018186', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1294156', + baseId: '1294056', + pid: '0', + title: + '《西游记》中,治疗朱紫国国王的药物里有两味药比较特殊,其中一味百草霜是 ①  ,还有一味是 ② 。()', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'D', + titleAnalyze: null, + titleAnalyzePicture: null, + subjectId: 1, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '①锅底灰  ②驴尿', + '①瓦上霜  ②马尿', + '①瓦上霜 ​ ②驴尿', + '①锅底灰 ​ ②马尿', + ], + ], + knowledgeIds: '1018578', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '2054075', + baseId: '2053975', + pid: '0', + title: + '阅读下面关于“紫禁城里过大年”活动的文字,完成后面小题。

为了迎接春节的到来,故宫早已张灯结【甲】,其中最让人期待的是消失了两百年的天灯和万寿灯。安设天灯和万寿灯的地点共三处【乙】一是乾清宫,二是皇极殿,三是建福宫。乾清宫前的万寿灯灯楼颇为引人注目。灯楼的内部安装了六扇仙人风扇,即围绕一个木柱嵌有六扇绘有仙人的扇面,这六扇仙人可以转动,像走马灯。灯楼下部有云托,上有八叉蹲龙,蹲龙上对应有八仙人。四周的灯联正反两面均有文字,每副对联对仗工整,其内容为歌舞升平、吉庆祥瑞等。研究人员在复原天灯和万寿灯的过程中,采用了锻铜工艺技术,这项工艺技术源自中国传统的铜浮雕,让康乾盛世的过年景象重现今日。

在【甲】【乙】两处分别填入汉字和标点符号,正确一项是()', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'A', + titleAnalyze: + '张灯结彩:形容节日或有喜庆的事的繁华景象。用“彩”。“安设天灯和万寿灯的地点共三处”有提示下文的作用,应该用冒号。故答案选A。', + titleAnalyzePicture: null, + subjectId: 1, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '【甲】采     【乙】冒号', + '【甲】彩     【乙】破折号', + '【甲】采     【乙】冒号', + '【甲】采     【乙】破折号', + ], + ], + knowledgeIds: '1018532,1018544,1018556', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '2054078', + baseId: '2053978', + pid: '0', + title: '下边加粗字的音、形、义都正确的一组是()', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'A', + titleAnalyze: + 'A项,正确。注意“御聘”的意思,御,指皇帝。聘,聘用的(人)。B项,有误。“害人听闻”的准确书写“骇人听闻”,骇:震惊。C项,有误。“赏赐”的准确读音“shǎng cì”。D项,有误。“花盖”的准确书写“华盖”。', + titleAnalyzePicture: null, + subjectId: 1, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '忙)    御聘:皇帝请的人', + '滑)     害人听闻:听了令人震惊', + '赏chì)     精致:精细别致', + 'huá)     随声附和:跟着别人说', + ], + ], + knowledgeIds: '1018529,1018532,1018537,1018585', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1000604', + baseId: '1000504', + pid: '0', + title: + ' 若$$a > 0 > b$$,且$$a+b > 0$$,以下不等式正确的个数是( 
$$①\\dfrac{1}{a}< \\dfrac{1}{b};②\\dfrac{1}{a}> \\dfrac{1}{b};$$$$③{a}^{3}b< a{b}^{3};④{a}^{3}< a{b}^{2};$$$$⑤{a}^{2}b< {b}^{3}.$$', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 3, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'B', + titleAnalyze: + '
解:$$∵a > 0 > b$$,且$$a+b > 0$$,不妨令$$a=2、b=-1$$,
可得$$(2)、(3)$$和$$(5)$$正确,而$$(1)$$和$$(4)$$不正确.
故选:B.
', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [['$$2 $$ ', '$$3 $$ ', '$$4 $$ ', '$$5$$']], + knowledgeIds: '25248,1015542,1015543', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1000641', + baseId: '1000541', + pid: '0', + title: '', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 3, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: '', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + ['$$2\\ 020−\\sqrt{5}$$', '$$2\\ 021+\\sqrt{5}$$', '$$6-{\\sqrt{5}}$$', '$$6+{\\sqrt{5}}$$'], + ], + knowledgeIds: '25269,25284', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1008351', + baseId: '1008251', + pid: '0', + title: + '

$$1.58×10^{6}$$米的百万分之一大约是( 

', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'A', + titleAnalyze: + '

解:$$1.58×10^{6}$$米的百万分之一为$$1.58×10^{6}\\times \\dfrac {1} {{10}^{6}}=1.58$$(米),

相当于初中生的身高.
故选:A', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + ['初中学生李平的身高 ', '教室黑板的长度', '教室中课桌的宽度', '三层楼房的高度'], + ], + knowledgeIds: '20124,1015225', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1072969', + baseId: '1072869', + pid: '0', + title: + '甲$$\\div $$乙$$=8\\dotsi \\dotsi 3$$,如果甲、乙都乘$$100$$,那么商 ,余数 。横线上应填()。', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 121, + difficulty: 1, + stagePid: 1, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: + '分析:商的变化规律:被除数和除数同时扩大相同的倍数(0除外),商不变,但余数也随之扩大相同的倍数;被除数和除数同时缩小为原来的几倍,商不变,但余数也随之缩小为原来的几倍。
解:3×100=300
甲÷乙=8……3,如果甲、乙都乘100,那么商不变,余数是300。
故选:C。', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '乘$$100$$        乘$$10000$$', + '乘$$100$$        乘$$100$$', + '不变           乘$$100$$', + ], + ], + knowledgeIds: '1009612,1015058', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1073564', + baseId: '1073464', + pid: '0', + title: + '在一块正方形纸片上剪下一个圆形和一个扇形(如图所示),恰好能围成一个圆锥模型。如果扇形的半径为 $$a$$,圆的半径为 $$b$$,那么 $$a : b =$$( )。
', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 121, + difficulty: 3, + stagePid: 1, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'B', + titleAnalyze: + '

分析:圆锥的侧面展开扇形的弧长等于圆锥的底面周长,列出关系式即可得所求。

解:扇形的弧长等于圆锥底面周长。
所以 2πa÷4=2πb 
则     a:b=4:1 
故选:B。

', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [['$$3\\colon 1$$', '$$4\\colon 1$$', '$$7\\colon 2$$', '$$9\\colon 2$$']], + knowledgeIds: '20669', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1178584', + baseId: '1178484', + pid: '0', + title: '

下列说法不正确的是( ).

', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'D', + titleAnalyze: + '

解:A.依次连接任意四边形各边中点所得的四边形是平行四边形;
B.依次连接对角线相等的四边形各边中点所得的四边形是菱形;

C.依次连接对角线垂直的四边形各边中点所得的四边形是矩形;

D.顺次连接任意一个对角线相等且互相垂直的四边中点,所得四边形是正方形,故D选项错误

故选:D

', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '依次连接任意四边形各边中点所得的四边形是平行四边形

', + '依次连接对角线相等的四边形各边中点所得的四边形是菱形

', + '依次连接对角线垂直的四边形各边中点所得的四边形是矩形

', + '依次连接一组对边相等且垂直的四边形各边中点所得的四边形是正方形', + ], + ], + knowledgeIds: '20420,20423,20426,20429,21200', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1178640', + baseId: '1178540', + pid: '0', + title: + '某校准备开设特色活动课,各科目的计划招生人数和报名人数,列前三位的如下表所示:
科目小制作足球英语口语
计划人数$$100$$$$90$$$$60$$
科目小制作英语口语中国象棋
报名人数$$280$$$$250$$$$200$$
若计划招生人数和报名人数的比值越大,表示学校开设该科目相对学生需要的满足指数就越高.那么根据以上数据,满足指数最高的科目是( )', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'A', + titleAnalyze: + '解:由表知,小制作:$$ \\dfrac {100}{280}≈0.36$$
英语口语:$$ \\dfrac {60}{250}=0.24$$
足球:计划招生$$90$$人,报名数不在前三名,即少于$$200$$人,所以比值大于$$ \\dfrac {90}{200}$$,即大于$$0.45$$
中国象棋:报名$$200$$人,计划数不在前三名,即少于$$60$$人,所以比值小于$$ \\dfrac {60}{200}$$,即小于$$0.3$$
$$∴$$足球科目的满足指数最高(即比值最大).
故选:A.', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [['足球', '小制作', '英语口语', '中国象棋']], + knowledgeIds: '20548', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1691230', + baseId: '1691130', + pid: '0', + title: + '

$$abc < 0$$$$a+b+c=0$$,则$$\\dfrac{b+c}{\\left|a\\right|}+\\dfrac{a+c}{\\left|b\\right|}+\\dfrac{a+b}{\\left|c\\right|}=$$ ( 

', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'A', + titleAnalyze: + '解: $$abc < 0 $$$$a+b+c=0 $$
$$a $$$$b $$$$c $$中一负两正.
$$ \\dfrac{b+c}{\\left|a\\right|}+ \\dfrac{a+c}{\\left|b\\right|}+ \\dfrac{a+b}{\\left|c\\right|}= \\dfrac{-a}{\\left|a\\right|}+ \\dfrac{-b}{\\left|b\\right|}+ \\dfrac{-c}{\\left|c\\right|}=-1 $$
故选:A
', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '$$-1$$ ', + '$$1$$$$-1$$ ', + '$$2$$$$-2$$ ', + '$$0$$$$-2$$', + ], + ], + knowledgeIds: '1015212,1015214,1015215', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1708343', + baseId: '1708243', + pid: '0', + title: + '如果 ,那么 的值是()', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: + '分析:设 $$ =k$$,得出$$x=2k$$$$y=3k$$,代入求出即可.
解:设 $$ =k$$
$$x=2k$$$$y=3k$$
$$= $$$$ =-5$$.
故选:C.', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '$$5$$', + '$$1$$', + '$$-5$$', + '$$-1$$', + ], + ], + knowledgeIds: '20147,20508', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1734323', + baseId: '1734223', + pid: '0', + title: '比较下面各组的两个数,能用“$$>$$”连接的有( )。', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 121, + difficulty: 2, + stagePid: 1, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: + '解:A、由于π=3.1415926……,因此3.14<π;
B、$$\\dfrac {1} {2}$$×$$\\dfrac {6} {5}$$=$$\\dfrac {3} {5}$$;
C、$$\\dfrac {3} {4}$$>$$\\dfrac {8} {9}$$×$$\\dfrac {3} {4}$$;
D、$$0.\\dot{7} \\dot{5}$$=0.75757575.......
$$0.7\\overset.{5}$$=0.75555555......
$$0.7\\overset.{5}$$<$$0.\\dot{7} \\dot{5}$$
故选:C。', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '$$3.14$$ ​ $$π$$', + '$$\\dfrac{1}{2}×\\dfrac{6}{5}$$ ​ $$\\dfrac{3}{5}$$', + '$$\\dfrac{3}{4}$$ ​$$\\dfrac{8}{9}×\\dfrac{3}{4}$$', + '$$0.7\\dot{5}$$ ​$$0.\\dot{7}\\dot{5}$$', + ], + ], + knowledgeIds: '1009644,1009651,1015121', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1806965', + baseId: '1806865', + pid: '0', + title: + '

$$A(a,-b)$$$$B(-b,a) $$表示同一个点,那么这个点一定在( ).

', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'B', + titleAnalyze: + '

解:∵点$$A(a,-b)$$,点$$B(-b,a)$$表示同一点,

$$a=-b$$
∴这一点一定在第一、三象限的角平分线上.
故选:B

', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '第二、四象限的角平分线上', + '第一、三象限的角平分线上', + '平行于$$x $$轴的直线上', + '平行于$$y $$轴的直线上', + ], + ], + knowledgeIds: '20279,1015467', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1836821', + baseId: '1836721', + pid: '0', + title: + '张阿姨准备在某商场购买一件衣服、一双鞋和一套化妆品,这三件物品的原价和优惠方式如下表所示:

欲购买的商品

原价(元$$) $$

优惠方式

一件衣服

$$420$$

每付现金$$200$$元,返购物券$$200$$元,且付款时可以使用购物券

一双鞋

$$280$$

每付现金$$200$$元,返购物券$$200$$元,但付款时不可以使用购物券

一套化妆品

$$300$$

付款时可以使用购物券,但不返购物券

    请帮助张阿姨分析一下,选择一个最省钱的购买方案,此时,张阿姨购买这三件物品实际所付出的钱的总数为  ( ).', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'B', + titleAnalyze: + '分析:本题的关键是从统计表中获取信息,读懂政策,依政策出方案;本题考查从统计表中获取信息的能力;统计表可以将大量数据的分类结果清晰、一目了然地表达出来.
解:因为买鞋不可以使用购物券,所以先花$$280$$元买一双鞋,
同时可获得$$200$$元购物券,先花$$220$$元和$$200$$元购物券买一件衣服,同时可获得$$200$$元购物券,
再用买衣服获得的$$200$$元购物券与$$100$$元现金再买一套化妆品,
即共花掉:$$280+220+100=600$$元.
故选:B.', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '$$500$$元', + '$$600$$元', + '$$700$$元', + '$$800$$元', + ], + ], + knowledgeIds: '20548', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1841341', + baseId: '1841241', + pid: '0', + title: + ' 判断下列命题正确的是( )', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 3, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'B', + titleAnalyze: + '
幂函数$$\n y= \\dfrac{1}{x} $$不经过$$\n \\left(0,0\\right) ,$$故A错;
C答案中未指明单调区间,故错;
幂函数$$ y=x ^{n}$$当$$ n < 0$$时在$$ (0 , + \\infty )$$上是减函数,故D错.
故选B.
', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '幂函数的图象都经过点$$\n(1 , 1)$$和点$$\n(0 , 0)$$', + '幂函数的图象不可能在第四象限', + '幂函数$$\ny=x ^{n}$$当$$\nn > 0$$时是增函数', + '幂函数$$\ny=x ^{n}$$当$$\nn > 0$$时在$$\n(0 , + \\infty )$$上是减函数', + ], + ], + knowledgeIds: '1015851', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1960971', + baseId: '1960871', + pid: '0', + title: + '将甲、乙,丙、丁四人的跳远成绩制成条形统计图。如果用一条直线表示四人的平均成绩,如图中最合理的是(  )。', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 121, + difficulty: 3, + stagePid: 1, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: '解:C选项图中线的位置在最高和最低之间,因此符合平均成绩。
故选:C。
', + titleAnalyzePicture: null, + subjectId: 2, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '
f7fafa76-66b2-4977-8a0e-f38bfd9dd079.jpg', + '', + '', + '', + ], + ], + knowledgeIds: '1015150', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1579110', + baseId: '1579010', + pid: '0', + title: + '
What we need   better laws to preserve the environment and still allow our country  .
', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 3, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'D', + titleAnalyze: + '
“what we need”是主语从句,谓语动词的单复数取决于它所表达的含义,根据better laws可知,这里是表达复数概念,故第一个空填are;allow sb. to do sth. 允许某人做某事,故第二个空填to grow。故选D。
句意:我们需要的是更好的法律来保护环境,同时还能让我们的国家发展。
', + titleAnalyzePicture: null, + subjectId: 3, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + 'is, to grow\n ', + 'is, growing\n ', + 'are, growing\n ', + 'are, to grow', + ], + ], + knowledgeIds: '1017390', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1584635', + baseId: '1584535', + pid: '0', + title: + '

Do not let any failures discourage you, for you can never tell      close you may be to victory.

', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 3, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'A', + titleAnalyze: + '
句意:不要让任何失败使你气馁,因为你永远不知道自己离胜利有多近。A. how 多么,怎样;B. that 无含义,只起引导作用;C. which 哪一个;D. where 哪里。由后面close可知,此处需用程度副词how修饰。故选A。
', + titleAnalyzePicture: null, + subjectId: 3, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [['how', 'that', 'which', 'where']], + knowledgeIds: '1017329', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1032430', + baseId: '1032330', + pid: '0', + title: + '目前普遍认为,质子和中子都是由被称为$$\nu$$夸克和$$\nd$$夸克的粒子组成.$$\nu$$夸克带电量为$$\n+ \\dfrac {2}{3} e,\nd$$夸克带电量为$$- \\dfrac {1}{3} e$$,下列说法正确的是$$\n(\\:\\:\\:\\:)$$', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 3, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: + '解:由质子带一个单位正电荷,中子不带电,设质子中$$\n u$$夸克$$、\n d$$夸克个数分别是$$\n x、\n y,\n x、\n y$$取正整数,则有:
$$x\\times  \\dfrac {2}{3}e +y\\times ( - \\dfrac {1}{3}e )=1$$,
解得:$$\n x=2、\n y=1$$;
设中子中$$\n u$$夸克$$\n d$$夸克个数分别是$$\n m、\n n,\n m、\n n$$取正整数。
$$m\\times ( \\dfrac {2}{3}e )+n\\times ( - \\dfrac {1}{3}e )=0$$,
解得:$$\n m=1、\n n=2$$,
故选:$$\n C$$。

', + titleAnalyzePicture: null, + subjectId: 4, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '质子由$$\n1$$个$$\nu$$夸克和$$\n1$$个$$\nd$$夸克组成,中子由$$\n1$$个$$\nu$$夸克和$$\n2$$个$$\nd$$夸克组成', + '质子由$$\n2$$个$$\nu$$夸克和$$\n1$$个$$\nd$$夸克组成,中子由$$\n1$$个$$\nu$$夸克和$$\n1$$个$$\nd$$夸克组成', + '质子由$$\n2$$个$$\nu$$夸克和$$\n1$$个$$\nd$$夸克组成,中子由$$\n1$$个$$\nu$$夸克和$$\n2$$个$$\nd$$夸克组成', + '质子由$$\n1$$个$$\nu$$夸克和$$\n2$$个$$\nd$$夸克组成,中子由$$\n2$$个$$\nu$$夸克和$$\n1$$个$$\nd$$夸克组成', + ], + ], + knowledgeIds: '45287,45469', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1097713', + baseId: '1097613', + pid: '0', + title: + '

下列物质的用途与性质对应不正确的是( 

选项

物质

用途

性质

$$\\mathrm{\\rm{A}}$$

二氧化碳

作气体肥料

二氧化碳既不燃烧,也不支持燃烧

$$\\mathrm{\\rm{B}}$$

熟石灰

改良酸性土壤

熟石灰能与酸发生中和反应

$$\\mathrm{\\rm{C}}$$

氮气

用于食品防腐

氮气化学性质较稳定

$$\\mathrm{\\rm{D}}$$

浓硫酸

用作气体干燥剂

浓硫酸具有吸水性

', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 4, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'A', + titleAnalyze: + '

【分析】

本题主要考查了学生对物质性质的运用能力,物质的性质决定用途,物质的用途反映性质是解决本题的关键。

【解答】

$$\\mathrm{A.}$$二氧化碳是光合作用的原料,所以可以作为气体肥料,而不是利用了二氧化碳不能燃烧也不支持燃烧的性质,故$$\\mathrm{A}$$错误,但符合题意;
$$\\mathrm{B.}$$熟石灰是碱,能够和酸发生中和反应,所以可以用来改良酸性土壤,故$$\\mathrm{B}$$正确,但不符合题意;
$$\\mathrm{C.}$$氮气化学性质较稳定,可以用作食品防腐,故$$\\mathrm{C}$$正确,但不符合题意;

$$\\mathrm{D.}$$浓硫酸具有吸水性,可以用作气体干燥剂,故$$\\mathrm{D}$$正确,但不符合题意。
故选$$\\mathrm{A}$$

', + titleAnalyzePicture: null, + subjectId: 5, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '$$\\mathrm{\\rm{A}}$$ ', + '$$\\mathrm{\\rm{B}}$$ ', + '$$\\mathrm{\\rm{C}}$$ ', + '$$\\mathrm{\\rm{D}}$$', + ], + ], + knowledgeIds: '50206,50270,50272,1016067', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1809530', + baseId: '1809430', + pid: '0', + title: + '通过下列实验,能达到实验目的的是( 

', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'B', + titleAnalyze: + '

A.盐酸和碳酸都不能使酚酞改变颜色,所以不能根据甲试管中溶液颜色深浅,比较盐酸和碳酸的酸性强弱,故A错误;

B.氢氧化钠溶于水放热,而硝酸铵溶于水吸收热量,所以可以根据乙中气球的大小变化,比较$$\\mathrm{\\rm{NaOH}}$$$$\\mathrm{\\rm{NH}}$$$$\\mathrm{\\rm{{\\,\\!}_{4}}}$$$$\\mathrm{\\rm{NO}}$$$$\\mathrm{\\rm{{\\,\\!}_{3}}}$$固体溶解的热效应,故B正确;

C.氢氧化钙微溶于水,丙烧杯中装有$$\\mathrm{\\rm{80g}}$$水,加入$$\\mathrm{\\rm{20g}}$$氢氧化钙,不能全部溶解,不能配制$$\\mathrm{\\rm{20\\% }}$$$$\\mathrm{\\rm{Ca(OH)}}$$$$\\mathrm{\\rm{{\\,\\!}_{2}}}$$溶液,故C错误;

D.烧杯中是冰水,没有达到白磷的着火点,通入氧气白磷不能燃烧,所以不能通过观察丁中的实验现象,说明燃烧的条件之一是必须与氧气接触,故D错误。
故选B。

', + titleAnalyzePicture: null, + subjectId: 5, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '根据甲试管中溶液颜色深浅,比较盐酸和碳酸的酸性强弱

', + '根据乙中气球的大小变化,比较$$\\mathrm{\\rm{NaOH}}$$$$\\mathrm{\\rm{NH_{4}NO_{3}}}$$固体溶解的热效应

', + '丙烧杯中装有$$\\mathrm{\\rm{80g}}$$水,加入$$\\mathrm{\\rm{20g}}$$氢氧化钙,配制$$\\mathrm{\\rm{20\\% }}$$$$\\mathrm{\\rm{Ca(OH)_{2}}}$$溶液

', + '通过观察丁中的实验现象,说明燃烧的条件之一是必须与氧气接触$$\\mathrm{ }$$', + ], + ], + knowledgeIds: '50112,50117,50228,50235,50269,50272', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1910033', + baseId: '1909933', + pid: '0', + title: + '对如图表格信息解读正确的是(  )
京师同文馆课程安排
学程学习内容
第1-2年外语认、读、写和翻译初步,汉文经学
第3年各国地理、历史和翻译选编,汉文经学
第4-8年算学(包括代数、平面几何、立体几何、三角、微积分),天文,测算(包括航海测算),格物(物理),金石(矿物),化学,机器制造,外语翻译,万国公法,汉文经学
', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 3, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: + '本题考查了洋务运动。第二次鸦片战争的失败,刺激了中国的官僚士大夫阶层,为了应对变局,清政府设京师同文馆。由“京师同文馆课程安排”可以看出,京师同文馆学习内容是以科学技术、翻译人才和历史文化为主,体现了服务自强求富的特点。故选:C。
', + titleAnalyzePicture: null, + subjectId: 6, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [['体现全盘西化', '排斥自然科技', '服务自强求富', '侧重政治学说']], + knowledgeIds: '80345,80346,80347', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1145294', + baseId: '1145194', + pid: '0', + title: + '

纤维素酶的测定方法一般是 

', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 1, + stagePid: 3, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: + '

解:通过鉴别培养基上是否形成透明圈来对分解纤维素的微生物进行初步筛选,为确定得到的是纤维素分解菌,需要进行发酵产生纤维素酶的实验,并且进行纤维素酶的测定,测定方法一般是对纤维素酶分解滤纸等纤维素后所产生的葡萄糖进行定量测定。
故选:C。

', + titleAnalyzePicture: null, + subjectId: 8, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '对纤维素进行定量测定 \n
', + '对纤维素分解菌进行定量测定', + '对纤维素酶分解纤维素后所产生的葡萄糖进行定量测定', + '对纤维素酶分解纤维素后所产生的纤维二糖进行定量测定', + ], + ], + knowledgeIds: '63307', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1720205', + baseId: '1720105', + pid: '0', + title: + '

提出用进废退和获得性遗传观点的科学家是 

', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 1, + stagePid: 3, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'A', + titleAnalyze: '拉马克认为生物各种适应性特征的形成都是用进废退和获得性遗传的结果,A正确。
', + titleAnalyzePicture: null, + subjectId: 8, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '拉马克            ', + '达尔文          ', + '萨顿          ', + '摩尔根', + ], + ], + knowledgeIds: '1007252', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1846986', + baseId: '1846886', + pid: '0', + title: + '

生长激素是人体内的重要激素,下列叙述与事实相符的是 

', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 3, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: + '
\n 【分析】\n
本题考查生长激素相关知识,意在考查考生理解能力。\n
【解答】\n
A.生长激素由腺垂体合成并分泌,化学本质是蛋白质,A错误;\n
B.生长激素可促进糖原合成,减少糖的利用,B错误;\n
C.生长激素可促进细胞生长,可作用于全身所有组织,C正确;\n
D.幼年时缺乏生长激素将患侏儒症,D错误。\n
​故选C。\n
', + titleAnalyzePicture: null, + subjectId: 8, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '由腺垂体合成并分泌,其化学本质是吲哚乙酸', + '可促进糖的利用,增加糖原生成', + '可作用于全身所有组织', + '幼年时缺乏生长激素将患呆小症', + ], + ], + knowledgeIds: '60288', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1926921', + baseId: '1926821', + pid: '0', + title: + '以下属于光合作用原理在农业生产上应用的是()


', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'C', + titleAnalyze: + '
【分析】
本题主要考查光合作用的应用。解答此题的关键是熟知光合作用的实质。
【解答】
A.低温冷藏的原理是降低植物的呼吸作用,不符合题意; 
B.阴天移栽能降低植物的蒸腾作用,提高植物的成活率,不符合题意;
C.对农作物进行合理密植能充分利用光能、延长光照时间,延长了光合作用的时间,对农作物进行立体种植充分利用光能,都是光合作用原理在农业生产中的应用,符合题意;
D.松土排涝利于植物根的的呼吸作用,不符合题意。
故选C。
', + titleAnalyzePicture: null, + subjectId: 8, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '低温冷藏           ', + '阴天移栽         ', + '合理密植         ', + '松土排涝 ', + ], + ], + knowledgeIds: '60213', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, + { + id: '1877033', + baseId: '1876933', + pid: '0', + title: '我国是世界人口大国,人口数量约占世界的(  )', + titleType: null, + sourceId: null, + sourceName: null, + examType: null, + titleChannelType: 106, + difficulty: 2, + stagePid: 2, + addrId: null, + voiceUrl: null, + pictureUrl: null, + answer: 'D', + titleAnalyze: + '根据2010年全国第六次人口普查结果,中国总人口为13.7亿,约占世界人口总数的1/5,是世界上人口最多的国家。
故选:D。', + titleAnalyzePicture: null, + subjectId: 9, + status: null, + delFlag: null, + degree: 0, + years: null, + provinces: null, + titleSourceIds: null, + optionList: [ + [ + '
1
2
', + '
1
3
', + '
1
4
', + '
1
5
', + ], + ], + knowledgeIds: '90206', + submitAnswer: null, + correctResult: null, + knowledgeVoList: null, + pidTitle: null, + }, +] diff --git a/src/page/subject/englishBasic/english_basic_categories.json b/src/page/subject/englishBasic/english_basic_categories.json new file mode 100644 index 0000000..31a23fa --- /dev/null +++ b/src/page/subject/englishBasic/english_basic_categories.json @@ -0,0 +1,156 @@ +[ + { + "id": "category_1", + "name": "入门介绍", + "children": [ + { + "id": "1", + "name": "01_欢迎", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/01_欢迎.mp4" + }, + { + "id": "2", + "name": "02_你一定能拿下英语", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/02_你一定能拿下英语.mp4" + }, + { + "id": "3", + "name": "03_英文字母", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/03_英文字母.mp4" + }, + { + "id": "4", + "name": "04_单词的发音", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/04_单词的发音.mp4" + } + ] + }, + { + "id": "category_2", + "name": "音标学习", + "children": [ + { + "id": "5", + "name": "05_音标", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/05_音标.mp4" + }, + { + "id": "6", + "name": "06_元音字母和辅音字母", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/06_元音字母和辅音字母.mp4" + }, + { + "id": "7", + "name": "07_音标练习_01_单元音_e_æ_iː_ɪ_uː_ʊ", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/07_音标练习_01_单元音_e_æ_iː_ɪ_uː_ʊ.mp4" + }, + { + "id": "8", + "name": "08_音标练习_02_双元音_aː_ɔː_aɪ_ɔɪ_eɪ_aʊ_oʊ", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/08_音标练习_02_双元音_aː_ɔː_aɪ_ɔɪ_eɪ_aʊ_oʊ.mp4" + }, + { + "id": "9", + "name": "09_音标练习_03_辅音_pb_td_kg_sz", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/09_音标练习_03_辅音_pb_td_kg_sz.mp4" + }, + { + "id": "10", + "name": "10_音标练习_04_辅音_l_mnŋ", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/10_音标练习_04_辅音_l_mnŋ.mp4" + }, + { + "id": "11", + "name": "11_音标练习_05_辅音_h_j_w_f_v", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/11_音标练习_05_辅音_h_j_w_f_v.mp4" + }, + { + "id": "12", + "name": "12_音标练习_06_辅音_r", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/12_音标练习_06_辅音_r.mp4" + }, + { + "id": "13", + "name": "13_音节01_重读和轻读", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/13_音节01_重读和轻读.mp4" + }, + { + "id": "14", + "name": "14_音节02_划分音节", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/14_音节02_划分音节.mp4" + }, + { + "id": "15", + "name": "15_音标练习_07_ə_ʌ_ʃ_ʒ_tʃ_dʒ_ts_dz_θ_ð", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/15_音标练习_07_ə_ʌ_ʃ_ʒ_tʃ_dʒ_ts_dz_θ_ð.mp4" + }, + { + "id": "16", + "name": "16_音标练习_08_英式_美式_清辅音的浊化", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/16_音标练习_08_英式_美式_清辅音的浊化.mp4" + }, + { + "id": "17", + "name": "17_音节03_开音节_闭音节", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/17_音节03_开音节_闭音节.mp4" + }, + { + "id": "18", + "name": "18_发音规律01_辅音字母", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/18_发音规律01_辅音字母.mp4" + }, + { + "id": "19", + "name": "19_发音规律02_元音字母", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/19_发音规律02_元音字母.mp4" + } + ] + }, + { + "id": "category_3", + "name": "单词记忆", + "children": [ + { + "id": "20", + "name": "20_如何永久记住一个单词", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/20_如何永久记住一个单词.mp4" + } + ] + }, + { + "id": "category_4", + "name": "语法学习", + "children": [ + { + "id": "21", + "name": "21_初识语法01", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/21_初识语法01.mp4" + }, + { + "id": "22", + "name": "22_初识语法02", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/22_初识语法02.mp4" + }, + { + "id": "23", + "name": "23_初识语法03", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/23_初识语法03.mp4" + }, + { + "id": "24", + "name": "24_词性01_动词_名词_形容词", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/24_词性01_动词_名词_形容词.mp4" + }, + { + "id": "25", + "name": "25_词性02_联系", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/25_词性02_联系.mp4" + }, + { + "id": "26", + "name": "26_词性03_单词的多样性", + "url": "https://english-1313840333.cos.ap-guangzhou.myqcloud.com/basic/26_词性03_单词的多样性.mp4" + } + ] + } +] diff --git a/src/page/subject/englishBasic/index.vue b/src/page/subject/englishBasic/index.vue new file mode 100644 index 0000000..a9aa007 --- /dev/null +++ b/src/page/subject/englishBasic/index.vue @@ -0,0 +1,302 @@ + + + + + diff --git a/src/page/subject/explain/index.vue b/src/page/subject/explain/index.vue new file mode 100644 index 0000000..d48e6c9 --- /dev/null +++ b/src/page/subject/explain/index.vue @@ -0,0 +1,294 @@ + + + diff --git a/src/page/subject/explain/parent.vue b/src/page/subject/explain/parent.vue new file mode 100644 index 0000000..bedede4 --- /dev/null +++ b/src/page/subject/explain/parent.vue @@ -0,0 +1,8 @@ + + diff --git a/src/page/subject/freeStudy/views/home/index.vue b/src/page/subject/freeStudy/views/home/index.vue new file mode 100644 index 0000000..a7c0515 --- /dev/null +++ b/src/page/subject/freeStudy/views/home/index.vue @@ -0,0 +1,103 @@ + + + diff --git a/src/page/subject/freeStudy/views/knowledgePoints/Empty.vue b/src/page/subject/freeStudy/views/knowledgePoints/Empty.vue new file mode 100644 index 0000000..5824634 --- /dev/null +++ b/src/page/subject/freeStudy/views/knowledgePoints/Empty.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/page/subject/freeStudy/views/knowledgePoints/KnowledgeCard.vue b/src/page/subject/freeStudy/views/knowledgePoints/KnowledgeCard.vue new file mode 100644 index 0000000..3a28a59 --- /dev/null +++ b/src/page/subject/freeStudy/views/knowledgePoints/KnowledgeCard.vue @@ -0,0 +1,150 @@ + + + diff --git a/src/page/subject/freeStudy/views/knowledgePoints/KnowledgeVideo.vue b/src/page/subject/freeStudy/views/knowledgePoints/KnowledgeVideo.vue new file mode 100644 index 0000000..9740b44 --- /dev/null +++ b/src/page/subject/freeStudy/views/knowledgePoints/KnowledgeVideo.vue @@ -0,0 +1,83 @@ + + + diff --git a/src/page/subject/freeStudy/views/knowledgePoints/TrainRecord.vue b/src/page/subject/freeStudy/views/knowledgePoints/TrainRecord.vue new file mode 100644 index 0000000..8d08794 --- /dev/null +++ b/src/page/subject/freeStudy/views/knowledgePoints/TrainRecord.vue @@ -0,0 +1,241 @@ + + + diff --git a/src/page/subject/freeStudy/views/knowledgePoints/index.vue b/src/page/subject/freeStudy/views/knowledgePoints/index.vue new file mode 100644 index 0000000..cd45906 --- /dev/null +++ b/src/page/subject/freeStudy/views/knowledgePoints/index.vue @@ -0,0 +1,157 @@ + + + diff --git a/src/page/subject/freeStudy/views/textbookDetail/ChapterTree/index.vue b/src/page/subject/freeStudy/views/textbookDetail/ChapterTree/index.vue new file mode 100644 index 0000000..2875201 --- /dev/null +++ b/src/page/subject/freeStudy/views/textbookDetail/ChapterTree/index.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/src/page/subject/freeStudy/views/textbookDetail/ChapterTree/item.vue b/src/page/subject/freeStudy/views/textbookDetail/ChapterTree/item.vue new file mode 100644 index 0000000..3e40e80 --- /dev/null +++ b/src/page/subject/freeStudy/views/textbookDetail/ChapterTree/item.vue @@ -0,0 +1,137 @@ + + + + diff --git a/src/page/subject/freeStudy/views/textbookDetail/RoundSplit.vue b/src/page/subject/freeStudy/views/textbookDetail/RoundSplit.vue new file mode 100644 index 0000000..a7b0ae8 --- /dev/null +++ b/src/page/subject/freeStudy/views/textbookDetail/RoundSplit.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/page/subject/freeStudy/views/textbookDetail/TrainList/index.vue b/src/page/subject/freeStudy/views/textbookDetail/TrainList/index.vue new file mode 100644 index 0000000..ba25dce --- /dev/null +++ b/src/page/subject/freeStudy/views/textbookDetail/TrainList/index.vue @@ -0,0 +1,259 @@ + + + diff --git a/src/page/subject/freeStudy/views/textbookDetail/VideoList/index.vue b/src/page/subject/freeStudy/views/textbookDetail/VideoList/index.vue new file mode 100644 index 0000000..bb70170 --- /dev/null +++ b/src/page/subject/freeStudy/views/textbookDetail/VideoList/index.vue @@ -0,0 +1,270 @@ + + + diff --git a/src/page/subject/freeStudy/views/textbookDetail/index.vue b/src/page/subject/freeStudy/views/textbookDetail/index.vue new file mode 100644 index 0000000..5415b21 --- /dev/null +++ b/src/page/subject/freeStudy/views/textbookDetail/index.vue @@ -0,0 +1,465 @@ + + + diff --git a/src/page/subject/groupPaper/combination/ChapterTree/index.vue b/src/page/subject/groupPaper/combination/ChapterTree/index.vue new file mode 100644 index 0000000..45c7a56 --- /dev/null +++ b/src/page/subject/groupPaper/combination/ChapterTree/index.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/src/page/subject/groupPaper/combination/ChapterTree/item.vue b/src/page/subject/groupPaper/combination/ChapterTree/item.vue new file mode 100644 index 0000000..96cba14 --- /dev/null +++ b/src/page/subject/groupPaper/combination/ChapterTree/item.vue @@ -0,0 +1,94 @@ + + + + diff --git a/src/page/subject/groupPaper/combination/TextbookDia/Chapter.vue b/src/page/subject/groupPaper/combination/TextbookDia/Chapter.vue new file mode 100644 index 0000000..afdb36c --- /dev/null +++ b/src/page/subject/groupPaper/combination/TextbookDia/Chapter.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/src/page/subject/groupPaper/combination/TextbookDia/XTree/index.vue b/src/page/subject/groupPaper/combination/TextbookDia/XTree/index.vue new file mode 100644 index 0000000..85107b7 --- /dev/null +++ b/src/page/subject/groupPaper/combination/TextbookDia/XTree/index.vue @@ -0,0 +1,260 @@ + + + + + diff --git a/src/page/subject/groupPaper/combination/TextbookDia/XTree/item.vue b/src/page/subject/groupPaper/combination/TextbookDia/XTree/item.vue new file mode 100644 index 0000000..bee06d0 --- /dev/null +++ b/src/page/subject/groupPaper/combination/TextbookDia/XTree/item.vue @@ -0,0 +1,116 @@ + + + + diff --git a/src/page/subject/groupPaper/combination/TextbookDia/index.vue b/src/page/subject/groupPaper/combination/TextbookDia/index.vue new file mode 100644 index 0000000..4da447f --- /dev/null +++ b/src/page/subject/groupPaper/combination/TextbookDia/index.vue @@ -0,0 +1,141 @@ + + + diff --git a/src/page/subject/groupPaper/combination/index.vue b/src/page/subject/groupPaper/combination/index.vue new file mode 100644 index 0000000..875f5e0 --- /dev/null +++ b/src/page/subject/groupPaper/combination/index.vue @@ -0,0 +1,327 @@ + + + + + diff --git a/src/page/subject/groupPaper/history/Card.vue b/src/page/subject/groupPaper/history/Card.vue new file mode 100644 index 0000000..5aca340 --- /dev/null +++ b/src/page/subject/groupPaper/history/Card.vue @@ -0,0 +1,203 @@ + + + diff --git a/src/page/subject/groupPaper/history/index.vue b/src/page/subject/groupPaper/history/index.vue new file mode 100644 index 0000000..0a57c5b --- /dev/null +++ b/src/page/subject/groupPaper/history/index.vue @@ -0,0 +1,147 @@ + + + diff --git a/src/page/subject/groupPaper/historyDetail/AnalysisTable.vue b/src/page/subject/groupPaper/historyDetail/AnalysisTable.vue new file mode 100644 index 0000000..b0019b7 --- /dev/null +++ b/src/page/subject/groupPaper/historyDetail/AnalysisTable.vue @@ -0,0 +1,96 @@ + + + diff --git a/src/page/subject/groupPaper/historyDetail/index.vue b/src/page/subject/groupPaper/historyDetail/index.vue new file mode 100644 index 0000000..2464f0c --- /dev/null +++ b/src/page/subject/groupPaper/historyDetail/index.vue @@ -0,0 +1,203 @@ + + + diff --git a/src/page/subject/groupPaper/home/index.vue b/src/page/subject/groupPaper/home/index.vue new file mode 100644 index 0000000..4cdd75a --- /dev/null +++ b/src/page/subject/groupPaper/home/index.vue @@ -0,0 +1,85 @@ + + + diff --git a/src/page/subject/happyRead/classicReading/read/components/NavList.vue b/src/page/subject/happyRead/classicReading/read/components/NavList.vue new file mode 100644 index 0000000..2cf1f30 --- /dev/null +++ b/src/page/subject/happyRead/classicReading/read/components/NavList.vue @@ -0,0 +1,116 @@ + + + diff --git a/src/page/subject/happyRead/classicReading/read/components/ReadBook.vue b/src/page/subject/happyRead/classicReading/read/components/ReadBook.vue new file mode 100644 index 0000000..bf4f48d --- /dev/null +++ b/src/page/subject/happyRead/classicReading/read/components/ReadBook.vue @@ -0,0 +1,154 @@ + + + diff --git a/src/page/subject/happyRead/classicReading/read/interface/index.ts b/src/page/subject/happyRead/classicReading/read/interface/index.ts new file mode 100644 index 0000000..77811ea --- /dev/null +++ b/src/page/subject/happyRead/classicReading/read/interface/index.ts @@ -0,0 +1,62 @@ +export interface NavListType { + name: string + iconName: string + type: number +} +export interface FilterItemType { + createTime: string + createUser: string + updateTime: null + updateUser: null + id: any + typeId: string + value: string + code: string + sort: number + remark: string + status: number + delFlag: number +} +export interface FilterListType { + [key: string]: { all: FilterItemType; other: FilterItemType[] } +} +export interface BookType { + id: any + sort: number + category: number + enName: string + znName: string + author: string + synopsis: string + topic: string + type: string + stageId: string + wordCount: number + coreWordCount: number + sentenceCount: number + lexile: string + level: string + pictureUrl: string + status: number + delFlag: number + seriesBook: number + alreadyReadPercent: number + alreadyReadPageNum: number +} +export interface ShowBookType { + rows: BookType[] +} +// 收藏句子 +export interface SentenceType { + id: any + bookId: string + sentenceId: string + bookContentId: string + startTime: number + endTime: number + sentence: string + znSentence: string + voiceUrl: string + cardNo: number + isPlay?: boolean +} diff --git a/src/page/subject/happyRead/classicReading/read/read.vue b/src/page/subject/happyRead/classicReading/read/read.vue new file mode 100644 index 0000000..b1980e8 --- /dev/null +++ b/src/page/subject/happyRead/classicReading/read/read.vue @@ -0,0 +1,118 @@ + + + diff --git a/src/page/subject/happyRead/classicReading/readDetail/PlayBooks.vue b/src/page/subject/happyRead/classicReading/readDetail/PlayBooks.vue new file mode 100644 index 0000000..3bba6ed --- /dev/null +++ b/src/page/subject/happyRead/classicReading/readDetail/PlayBooks.vue @@ -0,0 +1,209 @@ + + + + + diff --git a/src/page/subject/happyRead/classicReading/readDetail/components/playBooksDetails.vue b/src/page/subject/happyRead/classicReading/readDetail/components/playBooksDetails.vue new file mode 100644 index 0000000..52aa04a --- /dev/null +++ b/src/page/subject/happyRead/classicReading/readDetail/components/playBooksDetails.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/src/page/subject/happyRead/classicReading/readDetail/components/sentence.vue b/src/page/subject/happyRead/classicReading/readDetail/components/sentence.vue new file mode 100644 index 0000000..16bc62f --- /dev/null +++ b/src/page/subject/happyRead/classicReading/readDetail/components/sentence.vue @@ -0,0 +1,458 @@ + + + + + diff --git a/src/page/subject/happyRead/classicReading/readDetail/interface/index.ts b/src/page/subject/happyRead/classicReading/readDetail/interface/index.ts new file mode 100644 index 0000000..a26134e --- /dev/null +++ b/src/page/subject/happyRead/classicReading/readDetail/interface/index.ts @@ -0,0 +1,32 @@ +export interface BookPageType { + current: number + size: number + totalPage: number + totalRows: number + bookReturnList: BookType[] + NewbookPageList: BookType[][] + rainbow: number[] + firstPageBookContentId: string + haveQuiz: number +} +export interface BookType { + id: any + sort: number + category: number + enName: string + znName: string + author: string + synopsis: string + topic: string + type: string + stageId: string + wordCount: number + coreWordCount: number + sentenceCount: number + lexile: string + level: string + pictureUrl: string + status: number + delFlag: number + seriesBook: number +} diff --git a/src/page/subject/happyRead/classicReading/singleBookIntroduction/components/Introduce.vue b/src/page/subject/happyRead/classicReading/singleBookIntroduction/components/Introduce.vue new file mode 100644 index 0000000..7c39702 --- /dev/null +++ b/src/page/subject/happyRead/classicReading/singleBookIntroduction/components/Introduce.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/src/page/subject/happyRead/classicReading/singleBookIntroduction/interface/index.ts b/src/page/subject/happyRead/classicReading/singleBookIntroduction/interface/index.ts new file mode 100644 index 0000000..2430024 --- /dev/null +++ b/src/page/subject/happyRead/classicReading/singleBookIntroduction/interface/index.ts @@ -0,0 +1,70 @@ +export interface BookPageType { + current: number + size: number + totalPage: number + totalRows: number + rows: BookPageRowType[] + rainbow: number[] +} +export interface BookPageRowType { + alreadyRead: boolean + voiceName: string + voiceUrl: string + author: string + bookId: string + createTime: string + enName: string + height: number + id: any + nextId: any + pageNum: number + pageXlargeImage: string + pageXsmallImage: string + pictureUrl: string + previousId: string + sort: number + status: number + totalPageNum: number + voiceList: [] + width: number + znName: string + lastRead: boolean +} +export interface BookDetailType { + id: any + sort: number + category: number + enName: string + znName: string + author: string + synopsis: string + znSynopsis: string + topic: string + type: string + stageId: string + wordCount: number + coreWordCount: number + coreWordList: string + sentenceCount: number + lexile: string + level: string + pictureUrl: string + status: number + delFlag: number + seriesBook: number + pageContentList: BookPageType + pageBookList: any[] | null + collectNum: number + znStage: string + znTopic: string + znType: string + lastReadingHistory: { + id: any + bookId: string + sort: number + pageNum: number + pictureUrl: string + voiceName: string + voiceUrl: string + } +} diff --git a/src/page/subject/happyRead/classicReading/singleBookIntroduction/singleBookIntroduction.vue b/src/page/subject/happyRead/classicReading/singleBookIntroduction/singleBookIntroduction.vue new file mode 100644 index 0000000..8171f1e --- /dev/null +++ b/src/page/subject/happyRead/classicReading/singleBookIntroduction/singleBookIntroduction.vue @@ -0,0 +1,679 @@ + + + + + diff --git a/src/page/subject/happyRead/index.vue b/src/page/subject/happyRead/index.vue new file mode 100644 index 0000000..1756f7d --- /dev/null +++ b/src/page/subject/happyRead/index.vue @@ -0,0 +1,99 @@ + + + diff --git a/src/page/subject/happyRead/phonics/ReportDia.vue b/src/page/subject/happyRead/phonics/ReportDia.vue new file mode 100644 index 0000000..5427c3a --- /dev/null +++ b/src/page/subject/happyRead/phonics/ReportDia.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/src/page/subject/happyRead/phonics/blankFill/components/ChooseTitle.vue b/src/page/subject/happyRead/phonics/blankFill/components/ChooseTitle.vue new file mode 100644 index 0000000..570749d --- /dev/null +++ b/src/page/subject/happyRead/phonics/blankFill/components/ChooseTitle.vue @@ -0,0 +1,115 @@ + + + diff --git a/src/page/subject/happyRead/phonics/blankFill/components/Title.vue b/src/page/subject/happyRead/phonics/blankFill/components/Title.vue new file mode 100644 index 0000000..29d1e5b --- /dev/null +++ b/src/page/subject/happyRead/phonics/blankFill/components/Title.vue @@ -0,0 +1,63 @@ + + + diff --git a/src/page/subject/happyRead/phonics/blankFill/components/WordCard.vue b/src/page/subject/happyRead/phonics/blankFill/components/WordCard.vue new file mode 100644 index 0000000..3e55c1e --- /dev/null +++ b/src/page/subject/happyRead/phonics/blankFill/components/WordCard.vue @@ -0,0 +1,175 @@ + + + diff --git a/src/page/subject/happyRead/phonics/blankFill/index.vue b/src/page/subject/happyRead/phonics/blankFill/index.vue new file mode 100644 index 0000000..7e148de --- /dev/null +++ b/src/page/subject/happyRead/phonics/blankFill/index.vue @@ -0,0 +1,691 @@ + + + diff --git a/src/page/subject/happyRead/phonics/index.vue b/src/page/subject/happyRead/phonics/index.vue new file mode 100644 index 0000000..15f26a9 --- /dev/null +++ b/src/page/subject/happyRead/phonics/index.vue @@ -0,0 +1,283 @@ + + + diff --git a/src/page/subject/happyRead/phonics/load.vue b/src/page/subject/happyRead/phonics/load.vue new file mode 100644 index 0000000..969eceb --- /dev/null +++ b/src/page/subject/happyRead/phonics/load.vue @@ -0,0 +1,171 @@ + + + diff --git a/src/page/subject/happyRead/shortReading/index.vue b/src/page/subject/happyRead/shortReading/index.vue new file mode 100644 index 0000000..8a8b75c --- /dev/null +++ b/src/page/subject/happyRead/shortReading/index.vue @@ -0,0 +1,292 @@ + + + diff --git a/src/page/subject/happyRead/shortReading/readRecord/index.vue b/src/page/subject/happyRead/shortReading/readRecord/index.vue new file mode 100644 index 0000000..2149d03 --- /dev/null +++ b/src/page/subject/happyRead/shortReading/readRecord/index.vue @@ -0,0 +1,370 @@ + + + diff --git a/src/page/subject/happyRead/shortReading/readTopic/components/ReadMeaningSentence.vue b/src/page/subject/happyRead/shortReading/readTopic/components/ReadMeaningSentence.vue new file mode 100644 index 0000000..0d6a1a4 --- /dev/null +++ b/src/page/subject/happyRead/shortReading/readTopic/components/ReadMeaningSentence.vue @@ -0,0 +1,288 @@ + + + + + diff --git a/src/page/subject/happyRead/shortReading/readTopic/components/WordChoose.vue b/src/page/subject/happyRead/shortReading/readTopic/components/WordChoose.vue new file mode 100644 index 0000000..a464e50 --- /dev/null +++ b/src/page/subject/happyRead/shortReading/readTopic/components/WordChoose.vue @@ -0,0 +1,292 @@ + + + + + diff --git a/src/page/subject/happyRead/shortReading/readTopic/index.vue b/src/page/subject/happyRead/shortReading/readTopic/index.vue new file mode 100644 index 0000000..3502ed4 --- /dev/null +++ b/src/page/subject/happyRead/shortReading/readTopic/index.vue @@ -0,0 +1,583 @@ + + + diff --git a/src/page/subject/happyRead/shortReading/readTopic/interface/interface.ts b/src/page/subject/happyRead/shortReading/readTopic/interface/interface.ts new file mode 100644 index 0000000..d08965b --- /dev/null +++ b/src/page/subject/happyRead/shortReading/readTopic/interface/interface.ts @@ -0,0 +1,14 @@ +export interface optionType { + id: any + isRight: number + optionContent: string + optionSort: number + textId: string + titleContent: string + titleSort: number +} + +export interface sentenceChoose { + sentence: string[] + options: optionType[] +} diff --git a/src/page/subject/index.vue b/src/page/subject/index.vue new file mode 100644 index 0000000..6fa3640 --- /dev/null +++ b/src/page/subject/index.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/src/page/subject/languageSense/home/components/ProgressBar.vue b/src/page/subject/languageSense/home/components/ProgressBar.vue new file mode 100644 index 0000000..488a497 --- /dev/null +++ b/src/page/subject/languageSense/home/components/ProgressBar.vue @@ -0,0 +1,89 @@ + + + diff --git a/src/page/subject/languageSense/home/index.vue b/src/page/subject/languageSense/home/index.vue new file mode 100644 index 0000000..1b20528 --- /dev/null +++ b/src/page/subject/languageSense/home/index.vue @@ -0,0 +1,258 @@ + + + diff --git a/src/page/subject/languageSense/sentenceCollect/index.vue b/src/page/subject/languageSense/sentenceCollect/index.vue new file mode 100644 index 0000000..44a0acd --- /dev/null +++ b/src/page/subject/languageSense/sentenceCollect/index.vue @@ -0,0 +1,353 @@ + + + diff --git a/src/page/subject/languageSense/sentenceSort/component/Answer.vue b/src/page/subject/languageSense/sentenceSort/component/Answer.vue new file mode 100644 index 0000000..3738cc7 --- /dev/null +++ b/src/page/subject/languageSense/sentenceSort/component/Answer.vue @@ -0,0 +1,136 @@ + + + diff --git a/src/page/subject/languageSense/sentenceSort/component/CurrentTopic.vue b/src/page/subject/languageSense/sentenceSort/component/CurrentTopic.vue new file mode 100644 index 0000000..a28db86 --- /dev/null +++ b/src/page/subject/languageSense/sentenceSort/component/CurrentTopic.vue @@ -0,0 +1,267 @@ + + + diff --git a/src/page/subject/languageSense/sentenceSort/component/Tools.vue b/src/page/subject/languageSense/sentenceSort/component/Tools.vue new file mode 100644 index 0000000..0bdd95e --- /dev/null +++ b/src/page/subject/languageSense/sentenceSort/component/Tools.vue @@ -0,0 +1,68 @@ + + + diff --git a/src/page/subject/languageSense/sentenceSort/component/TopicItem.vue b/src/page/subject/languageSense/sentenceSort/component/TopicItem.vue new file mode 100644 index 0000000..7463585 --- /dev/null +++ b/src/page/subject/languageSense/sentenceSort/component/TopicItem.vue @@ -0,0 +1,172 @@ + + + diff --git a/src/page/subject/languageSense/sentenceSort/component/WordCard.vue b/src/page/subject/languageSense/sentenceSort/component/WordCard.vue new file mode 100644 index 0000000..46c8f14 --- /dev/null +++ b/src/page/subject/languageSense/sentenceSort/component/WordCard.vue @@ -0,0 +1,242 @@ + + + diff --git a/src/page/subject/languageSense/sentenceSort/component/topic.scss b/src/page/subject/languageSense/sentenceSort/component/topic.scss new file mode 100644 index 0000000..e8e9432 --- /dev/null +++ b/src/page/subject/languageSense/sentenceSort/component/topic.scss @@ -0,0 +1,112 @@ +@use '../../../../../styles/variate.scss' as *; + +.topic-box { + width: 1010px; + display: flex; + flex-direction: column; + box-shadow: 0 0.33vh 0.33vh 0 rgba(0, 0, 0, 0.25); + box-sizing: border-box; + border-radius: 1.67vh; + position: relative; + + .tool { + z-index: 1; + padding: 0.83vh 20px 1.25vh 30px; + display: flex; + align-items: center; + justify-content: space-between; + font-family: $font-text; + font-size: 2.33vh; + + .icons { + display: flex; + align-items: center; + column-gap: 20px; + } + + .sound { + display: flex; + align-items: center; + } + } + + .topic_content { + width: 100%; + + &_title { + font-family: $font-text; + font-size: 2.67vh; + line-height: 4vh; + overflow: hidden; + padding: 1.33vh 32px; + .title { + color: $font-color; + } + } + + &_answer { + padding: 2vh 32px 0.67vh 32px; + display: flex; + flex-wrap: wrap; + gap: 16px; + padding-bottom: 2.17vh; + + &_item { + border-radius: 1.33vh; + color: $font-color; + font-family: $font-text; + font-size: 2.33vh; + height: 4.83vh; + &.istrue, + &.isfalse { + border-radius: 1.67vh; + width: auto; + height: 4.83vh; + padding: 0.67vh 32px; + background: #fff; + border: 0.33vh solid transparent; + box-shadow: none; + } + &.istrue { + border-color: #9cfaf7; + } + &.isfalse { + border-color: #f00a0a; + } + &.isSurrender { + border-color: #ff8d3b; + } + &:last-child { + margin-right: 0; + } + &.iswrong { + &_item { + border-color: #ff8d3b; + } + } + } + } + } + + .hands { + width: 100%; + position: absolute; + padding: 0 180px; + top: -6vh; + display: flex; + justify-content: space-between; + align-items: center; + img { + width: 2.67vh; + height: 10vh; + } + } +} + +.beforeTopic { + .topic-box:first-child { + .hands { + display: none; + } + } +} diff --git a/src/page/subject/languageSense/sentenceSort/index.vue b/src/page/subject/languageSense/sentenceSort/index.vue new file mode 100644 index 0000000..7b23755 --- /dev/null +++ b/src/page/subject/languageSense/sentenceSort/index.vue @@ -0,0 +1,458 @@ + + + diff --git a/src/page/subject/languageSense/sentenceSort/tool.ts b/src/page/subject/languageSense/sentenceSort/tool.ts new file mode 100644 index 0000000..e928e49 --- /dev/null +++ b/src/page/subject/languageSense/sentenceSort/tool.ts @@ -0,0 +1,43 @@ +export function shuffle(array: any[]): any[] { + // 随机乱序处理 + + const arr = array.map(item => { + return { + selected: false, + ...item, + } + }) + return arr.sort(() => 0.5 - Math.random()) +} + +export function changeSymbolPosition(arr: anyObj[]): anyObj[] { + const answerList: anyObj[] = [] + arr.forEach(item => { + if (item.beforeSymbol) { + answerList.push({ + isSymbol: true, + displaySpell: item.beforeSymbol, + }) + } + answerList.push({ + ...item, + }) + if (item.afterSymbol) { + answerList.push({ + isSymbol: true, + displaySpell: item.afterSymbol, + }) + } + }) + return answerList +} + +export const jumpTarget = function (url: string) { + const link = document.createElement('a') + link.href = url as string + document.body.appendChild(link) + link.click() + setTimeout(() => { + document.body.removeChild(link) + }, 0) +} diff --git a/src/page/subject/languageSense/sentenceSortStatistics/index.vue b/src/page/subject/languageSense/sentenceSortStatistics/index.vue new file mode 100644 index 0000000..10d9b3f --- /dev/null +++ b/src/page/subject/languageSense/sentenceSortStatistics/index.vue @@ -0,0 +1,536 @@ + + + diff --git a/src/page/subject/learnWord/components/DataBar.vue b/src/page/subject/learnWord/components/DataBar.vue new file mode 100644 index 0000000..c7f68c6 --- /dev/null +++ b/src/page/subject/learnWord/components/DataBar.vue @@ -0,0 +1,77 @@ + + + diff --git a/src/page/subject/learnWord/components/LevelItem.vue b/src/page/subject/learnWord/components/LevelItem.vue new file mode 100644 index 0000000..26b4bcd --- /dev/null +++ b/src/page/subject/learnWord/components/LevelItem.vue @@ -0,0 +1,378 @@ + + + + + diff --git a/src/page/subject/learnWord/components/LevelList.vue b/src/page/subject/learnWord/components/LevelList.vue new file mode 100644 index 0000000..6863e4a --- /dev/null +++ b/src/page/subject/learnWord/components/LevelList.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/src/page/subject/learnWord/components/Road.vue b/src/page/subject/learnWord/components/Road.vue new file mode 100644 index 0000000..f10ef8c --- /dev/null +++ b/src/page/subject/learnWord/components/Road.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/src/page/subject/learnWord/components/Select.vue b/src/page/subject/learnWord/components/Select.vue new file mode 100644 index 0000000..2666346 --- /dev/null +++ b/src/page/subject/learnWord/components/Select.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/src/page/subject/learnWord/components/UserList.vue b/src/page/subject/learnWord/components/UserList.vue new file mode 100644 index 0000000..6a51b22 --- /dev/null +++ b/src/page/subject/learnWord/components/UserList.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/src/page/subject/learnWord/components/medal.vue b/src/page/subject/learnWord/components/medal.vue new file mode 100644 index 0000000..a36339b --- /dev/null +++ b/src/page/subject/learnWord/components/medal.vue @@ -0,0 +1,250 @@ + + + + + diff --git a/src/page/subject/learnWord/hardMode/components/FailPop.vue b/src/page/subject/learnWord/hardMode/components/FailPop.vue new file mode 100644 index 0000000..1ecb646 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/components/FailPop.vue @@ -0,0 +1,373 @@ + + + + diff --git a/src/page/subject/learnWord/hardMode/components/HardRound-1.vue b/src/page/subject/learnWord/hardMode/components/HardRound-1.vue new file mode 100644 index 0000000..e836e48 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/components/HardRound-1.vue @@ -0,0 +1,461 @@ + + + diff --git a/src/page/subject/learnWord/hardMode/components/Keyboard.vue b/src/page/subject/learnWord/hardMode/components/Keyboard.vue new file mode 100644 index 0000000..41ae823 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/components/Keyboard.vue @@ -0,0 +1,486 @@ + + + + diff --git a/src/page/subject/learnWord/hardMode/components/ResultTable.vue b/src/page/subject/learnWord/hardMode/components/ResultTable.vue new file mode 100644 index 0000000..1cc9518 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/components/ResultTable.vue @@ -0,0 +1,457 @@ + + + + diff --git a/src/page/subject/learnWord/hardMode/components/SuccessPop.vue b/src/page/subject/learnWord/hardMode/components/SuccessPop.vue new file mode 100644 index 0000000..98bed46 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/components/SuccessPop.vue @@ -0,0 +1,659 @@ + + + + diff --git a/src/page/subject/learnWord/hardMode/components/confirmPop.vue b/src/page/subject/learnWord/hardMode/components/confirmPop.vue new file mode 100644 index 0000000..61d2197 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/components/confirmPop.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/page/subject/learnWord/hardMode/hardMode.vue b/src/page/subject/learnWord/hardMode/hardMode.vue new file mode 100644 index 0000000..baa7711 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/hardMode.vue @@ -0,0 +1,876 @@ + + + + diff --git a/src/page/subject/learnWord/hardMode/hooks/useAnimate.ts b/src/page/subject/learnWord/hardMode/hooks/useAnimate.ts new file mode 100644 index 0000000..55385ce --- /dev/null +++ b/src/page/subject/learnWord/hardMode/hooks/useAnimate.ts @@ -0,0 +1,71 @@ +import { ref } from 'vue' +import type { Ref } from 'vue' +import { $sleep } from '@/utils/tool' +import { debounce } from 'lodash-es' +// import useSoundEffect from '@/hooks/useSoundEffect'; +import useCommonAudio from '@/hooks/useCommonAudio' +import { XMessage } from '@/hooks' + +export default function useAnimate( + cb: { 1: () => void; 2: (animateFun: () => void) => void; 3: () => void }, + num: { + glassNum: Ref + bombNum: Ref + }, + inputList: anyObj, +) { + const bombRef = ref() + const glassRef = ref() + const surrenderRef = ref() + + const show_bomb_animate = ref(false) + const propPolish = ref(false) + + const sound = useCommonAudio(true) + + const useProp = debounce( + async (type: number) => { + switch (type) { + case 1: + if (num.glassNum.value <= 0) return + // 使用放大镜失败 + if (inputList.data.length - inputList.data.count <= 2) { + return XMessage.error('空格数少于2,无法使用') + } + propPolish.value = true + sound.play('glisten.mp3') + setTimeout(() => { + propPolish.value = false + }, 1000) + cb[1]() + break + case 2: + if (num.bombNum.value <= 0) return + cb[2](async () => { + show_bomb_animate.value = true + sound.play('bomb.mp3') + await $sleep(1150) + show_bomb_animate.value = false + }) + break + case 3: + cb[3]() + break + } + }, + 1000, + { + leading: true, + trailing: false, + }, + ) + + return { + bombRef, + glassRef, + surrenderRef, + show_bomb_animate, + propPolish, + useProp, + } +} diff --git a/src/page/subject/learnWord/hardMode/hooks/useAnswer.ts b/src/page/subject/learnWord/hardMode/hooks/useAnswer.ts new file mode 100644 index 0000000..05fc23c --- /dev/null +++ b/src/page/subject/learnWord/hardMode/hooks/useAnswer.ts @@ -0,0 +1,619 @@ +import type { Level, Character } from '../interface' +import { useHardModeStore } from '@/stores/learnWord/useLearnWordStore.ts' +import { XMessage } from '@/hooks' + +// import useSoundEffect from '@/hooks/useSoundEffect'; +import useAudio from './useAudio.ts' +import { question_right, question_wrong } from '../../index.ts' +import { useRoute } from 'vue-router' +import learnWordApi from '@/api/subject/learnWord.ts' +import wordTestApi from '@/api/subject/wordTest.ts' +let propsNum: anyObj +nextTick(() => { + propsNum = useHardModeStore() +}) + +// const sound = useSoundEffect(); +export const showNext = ref(false) +const onClickNextFlag = ref(1) +export const totalData = ref([]) +export const WordTest = ref(false) +export const onNetLoading = ref(false) // 是否正在加载保存结果 + +/* 洗牌算法 */ +function shuffle(arr: Character[]) { + for (let i = arr.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)) + const t = arr[i] + arr[i] = arr[j] + arr[j] = t + } +} + +export function useAnswer(handleRight: () => void, handle: anyObj, isWordTest?: boolean) { + const charList = computed(() => { + return answer.data.currentData.charList + }) + + const sound = useAudio() + + onMounted(() => { + if (!useRoute().path.includes('wordTest')) { + window.addEventListener('keydown', inputList.keyBoardInput) + } + }) + + onUnmounted(() => { + window.removeEventListener('keydown', inputList.keyBoardInput) + }) + + // 退出时候更改showNext + const handleChangeNext = () => { + showNext.value = false + } + // 记录单词测试数据 + function saveWordTestApi(istrue = false, isError = false) { + onNetLoading.value = true + wordTestApi + .saveWordTest({ + duration: new Date().getTime() - answer.data.startTime, + questionType: 1, + levelId: answer.data.currentData.levelId, + saveTime: new Date().getTime(), + sessionId: answer.data.currentData.sessionId, + surrender: istrue ? 0 : 1, + testResult: istrue ? (isError ? 0 : 1) : 0, + wordId: answer.data.currentData.wordId, + imageUrl: answer.data.currentData.titlePicture, + meaningId: answer.data.currentData.meaningId, + titleFrom: answer.data.currentData.titleFrom, + levelType: answer.data.currentData.levelType, + }) + .then(res => { + if (!(res?.data.code === 200)) { + wordTestApi + .saveWordTest({ + duration: new Date().getTime() - answer.data.startTime, + questionType: 1, + saveTime: new Date().getTime(), + levelId: answer.data.currentData.levelId, + sessionId: answer.data.currentData.sessionId, + surrender: istrue ? 0 : 1, + testResult: istrue ? (isError ? 0 : 1) : 0, + wordId: answer.data.currentData.wordId, + imageUrl: answer.data.currentData.titlePicture, + meaningId: answer.data.currentData.meaningId, + titleFrom: answer.data.currentData.titleFrom, + levelType: answer.data.currentData.levelType, + }) + .finally(() => { + onNetLoading.value = false + }) + } else { + onNetLoading.value = false + } + }) + } + + // 添加正确字母的索引 + function _addRightIndex(itemMap: any, indexMap: any, exclude: (item: Character) => boolean) { + for (let i = 0; i < charList.value.length; i++) { + const item = charList.value[i] + // 不符合条件的,直接跳过 + if (exclude(item)) continue + // 索引数组 + const itemList = itemMap[item.value] + const listLen = itemList?.length || 0 + if (!listLen) { + // 还没有加过 + itemMap[item.value] = [i] + indexMap[i] = 1 + } else if (listLen < item.maxChoose) { + itemList.push(i) + indexMap[i] = 1 + } + } + } + + /* 道具 */ + const gameProps = { + init() { + this.glass.used.value = 0 + this.bomb.used.value = 0 + }, + glass: { + used: ref(0), + useEffect: function () { + if (propsNum.glassNum <= 0) return + answer.data.useTools = 1 + learnWordApi.postUseItems({ type: 2 }).then((res: any) => { + const emptyCell = inputList.data.length - inputList.data.count + + if (emptyCell <= 2) { + return XMessage.error('空格数少于2,无法使用') + } + // 先清除 + inputList.clear() + + const eliminateNum = Math.floor(1 + (emptyCell - 2) * Math.random()) // 随机获取要消除的个数 + for (let i = 0; i < eliminateNum; i++) { + const emptyPosition = [] // 获取当前的空格子 + for (let j = 0; j < inputList.data.length; j++) { + if (!inputList.data.queen[j]) { + emptyPosition.push(j) + } + } + + const random = Math.floor(emptyPosition.length * Math.random()) + const position = emptyPosition[random] // 随机抽取一个位置 + const character = answer.data.currentData.spell[position] // 随机到要显现的字母 + + /* 将随机到的字母加入到选项框里 */ + let canSelect = true + charList.value.forEach(item => { + if (item.value === character && !item.selected && canSelect) { + inputList.data.queen[position] = item + item.selected = true + item.fixed = true + canSelect = false + inputList.data.count++ + if (position === inputList.data.index) { + inputList.indexAutoIncrement() + } + } + }) + sound.play('fill_in.mp3') + } + propsNum.glassNum-- + gameProps.glass.used.value++ + }) + }, + }, + bomb: { + used: ref(0), + useEffect: function (animateFun: () => void) { + if (propsNum.bombNum <= 0) return + answer.data.useTools = 1 + learnWordApi.postUseItems({ type: 1 }).then(async (res: any) => { + // 所有需要保留的索引 + // item.value为key,索引数组为value + const keepIndexValueMap = {} as any + // 索引为key,1为value + const keepIndexMap = [] as number[] + // 遍历所有的字母,先找出放大镜的字母索引 + // 没有被放大镜选中的字母,直接跳过 + _addRightIndex(keepIndexValueMap, keepIndexMap, item => !item.fixed) + + // 遍历所有的字母,找出除放大镜以外的,其他正确字母的索引 + // 被放大镜选中的字母,直接跳过 + // 被答案字母,直接跳过 + _addRightIndex(keepIndexValueMap, keepIndexMap, item => item.fixed || !item.choose) + + // 拿到需要删除的索引 + const delIndexList: Array = [] // 存储错误选项的索引,用于随机清除 + for (let i = 0; i < charList.value.length; i++) { + const item = charList.value[i] + // 已经被删除了 + if (item.prop) continue + if (keepIndexMap[i]) continue + delIndexList.push(i) + } + + if (delIndexList.length === 0) { + return XMessage.error('已经无法再删除') + } + + animateFun?.() + + setTimeout(() => { + // 先清除 + inputList.clear() + + for (const position of delIndexList) { + const character = charList.value[position] // 随机到要显现的字母 + + /* 将随机到的字母隐藏 */ + character.selected = true + character.prop = true // 标记为道具消除 + } + }, 1300) + + propsNum.bombNum-- + gameProps.bomb.used.value++ + }) + }, + }, + flag: { + useEffect: function () { + answer.showAnswer() + answer.data.result = question_right + answer.data.prop = true // 标记使用了投降道具 + answer.data.useTools = 1 + sound.play('fill_in.mp3') + + if (answer.data.currentData.accent) { + handle.playAccent() + } + + // OpenPop(); + inputList.data.enable = false + answer.data.currentData.usedTime = Math.round( + (new Date().getTime() - answer.data.startTime) / 1000, + ) + propsNum.usedTime += answer.data.currentData.usedTime + // 新增 + showNext.value = true + // 每调用一次postWordRecord接口后就清空道具使用 + gameProps.init() + // setTimeout(() => { + // sound.play('show_nextBtn.mp3') + // }, 1800) + if (WordTest.value) { + saveWordTestApi() + return + } + const postData = { + bomb: gameProps.bomb.used.value, + glass: gameProps.glass.used.value, + surrender: 1, + levelId: propsNum.urlQuery.nextLevelId + ? propsNum.urlQuery.nextLevelId + : propsNum.urlQuery.levelId + ? propsNum.urlQuery.levelId + : answer.data.currentData.levelId, + levelType: 2, + result: 0, + costTime: answer.data.currentData.usedTime, + sessionId: answer.data.currentData.sessionId, + wordId: answer.data.currentData.wordId, + meaningId: answer.data.currentData.meaningId, + useTools: answer.data.useTools, + titleFrom: answer.data.currentData.titleFrom, + } + totalData.value.push(postData) + + learnWordApi + .postWordRecord(postData) + .then(async (res: any) => {}) + .catch(() => { + learnWordApi.postWordRecord(postData) + }) + }, + }, + } + + const inputList = { + data: reactive({ + length: 0, + index: 0, + enable: true, // 输入状态 + queen: [] as any, // 已输入队列 + queenCopy: [] as any, // 已输入队列复制 + count: 0, // 已输入个数 + }), + init() { + this.data.length = answer.data.currentData?.spell?.split('').length + this.reset() + }, + reset() { + this.data.queen = [] + this.data.index = 0 + this.data.enable = true + this.data.count = 0 + }, + choose(charItem: Character, playSound = true) { + if (isWordTest ? !charItem.count : charItem.selected) return // 已选不能再选 + if (!this.data.enable) return + if (this.data.count >= this.data.length) return // 输入框已满不能再输入 + this.data.queen[this.data.index] = isWordTest ? { ...charItem } : charItem + this.data.queenCopy[this.data.index] = charItem + + isWordTest ? charItem.count-- : (charItem.selected = true) + this.data.count++ + // if (playSound) { + // sound.play('fill_in.mp3') + // } + // 索引自增 + this.indexAutoIncrement() + // 如果填写完则自动答题 + if (this.data.count === this.data.length) { + // 进入判断 + answer.answering() + } + }, + + keyBoardInput(e: any) { + const _this = inputList.data + + if (e.key === 'Backspace') { + if (answer.data.result === question_right) return + inputList.backspace() + } + if (_this.enable) { + let canSelect = true + if (!charList.value) return + if (isWordTest) { + return + } + charList.value.forEach(item => { + if (item.value === e.key && canSelect && !item.selected) { + canSelect = false + inputList.choose(item, false) + sound.play('keyBoard.mp3') + } + }) + } + }, + + indexAutoIncrement() { + this.data.index++ + if (this.data.index >= this.data.length) { + this.data.enable = false + } else if (this.data.queen[this.data.index]?.value) { + // 如果自增后的数组索引处已经有值,则继续自增 + this.indexAutoIncrement() + } + }, + // 清除 + clear() { + while (this.data.queen.filter((i: any) => i && !i.fixed).length) { + this.backspace() + } + }, + // 退一格 + backspace() { + if (!this.data.count) return + /* 如果答错则恢复状态重新答题 */ + if (answer.data.result === question_wrong) { + answer.data.result = '' + } + /* 先恢复字母选项的显示再进行删除 */ + for (let index = this.data.queen.length - 1; index >= 0; index--) { + const item = isWordTest ? this.data.queenCopy[index] : this.data.queen[index] + if (item && (isWordTest || !item.fixed)) { + isWordTest ? item.count++ : (item.selected = false) + this.data.queen[index] = undefined + this.data.queenCopy[index] = undefined + + // this.data.queen.splice(index, 1) + // this.data.queenCopy.splice(index, 1) + if (this.data.index > index) { + this.data.index = index + } + this.data.count-- + break + } + } + this.data.enable = true + }, + } + + const answer = { + data: reactive({ + index: 0, + length: 0, + result: null as string | null, // 答题结果 + currentData: {} as Level, + numberOfAnswers: 0, + prop: false, // 标记使用了投降道具(动效针对字母消失) + useTools: 0, // 代表在本个单词答题中有没有使用过任一道具 + hasErrorInThisWord: false, + apiResult: null, + startTime: 0, + }), + load(data: Level) { + if (data.charList) { + shuffle(data.charList) // 将词组选项洗牌 + } + answer.data.currentData = data + this.reset() + inputList.init() + gameProps.init() + showNext.value = false + }, + reset() { + const _this = answer.data + _this.result = null + _this.numberOfAnswers = 0 + _this.startTime = new Date().getTime() + _this.prop = false // 清空投降道具标记 + _this.useTools = 0 + _this.hasErrorInThisWord = false + }, + async answering(surrender = 0) { + try { + const _this = answer.data + const choose = inputList.data.queen.map((item: any) => item?.value).join('') + _this.numberOfAnswers++ + _this.currentData.usedTime = Math.round((new Date().getTime() - _this.startTime) / 1000) + + /* propsNum.usedTime 是所有题目的总时长,每次答完题后需要累加 */ + propsNum.usedTime += _this.currentData.usedTime + + if (choose === _this.currentData.spell) { + _this.result = question_right + inputList.data.enable = false + + // nextTick(() => { + // sound.play('right.mp3') + // }) + + // 使用道具或者做错过则显示下一题按钮和标生按钮,否则直接进入下一题 + if (answer.data.useTools) { + // if (answer.data.useTools || answer.data.hasErrorInThisWord) { + showNext.value = true + } + + if (showNext.value && answer.data.currentData.accent) { + handle.playAccent() + } + setTimeout(() => { + if (!showNext.value) { + handleRight() + } else { + // setTimeout(() => { + // sound.play('show_nextBtn.mp3') + // }, 300) + } + }, 100) + + answer + .updateWordStatus(true) + .then(async () => { + // + }) + .catch(() => { + // uni.showToast({ + // title: '网络异常,请重新作答', + // icon: 'none', + // }); + // inputList.clear(); + // answer.reset(); + }) + } else { + _this.result = question_wrong + answer.data.hasErrorInThisWord = true + + // 错误动效 + const $box = document.getElementById('hardModeBox') + const $inputBox = $box?.getElementsByClassName('input__list')[0] + $inputBox?.classList.add('animate__animated', 'animate__shakeX') + $inputBox?.addEventListener('animationend', e => { + $inputBox?.classList.remove('animate__shakeX') + }) + + nextTick(() => { + sound.play('error.mp3') + }) + _this.startTime = new Date().getTime() + // 每调用一次postWordRecord接口后就清空道具使用 + gameProps.init() + if (WordTest.value) { + saveWordTestApi(true, true) + return + } + const postData = { + bomb: gameProps.bomb.used.value, + glass: gameProps.glass.used.value, + surrender: surrender, + levelId: propsNum.urlQuery.nextLevelId + ? propsNum.urlQuery.nextLevelId + : propsNum.urlQuery.levelId + ? propsNum.urlQuery.levelId + : answer.data.currentData.levelId, + levelType: 2, + result: 0, + costTime: answer.data.currentData.usedTime, + sessionId: answer.data.currentData.sessionId, + wordId: answer.data.currentData.wordId, + meaningId: answer.data.currentData.meaningId, + useTools: answer.data.useTools, + titleFrom: answer.data.currentData.titleFrom, + } + + totalData.value.push(postData) + + learnWordApi + .postWordRecord(postData) + .then((res: any) => {}) + .catch(() => { + learnWordApi.postWordRecord(postData) + }) + } + } catch (err) { + console.log(err) + } + }, + // 点击下一题 + async nextWords() { + showNext.value = false + if (answer.data.apiResult) { + // propsNum.bombNum = answer.data.apiResult.bomb; + // propsNum.glassNum = answer.data.apiResult.glass; + // propsNum.score = answer.data.apiResult.hardScore; + } + const dom = document.querySelector('.page__content__right') + if (dom) { + dom.scrollTop = 0 + } + }, + // 调用接口更新当前单词状态 + async updateWordStatus(isNextWords = false) { + if (WordTest.value) { + saveWordTestApi(true) + return + } + + // if (!answer.data.hasErrorInThisWord) { + propsNum.score += 25 + // } + // if (isNextWords) { + // propsNum.score = res.data.hardScore; + // } else { + // answer.data.apiResult = res.data; + // } + const postData = { + bomb: gameProps.bomb.used.value, + glass: gameProps.glass.used.value, + surrender: 0, + levelId: propsNum.urlQuery.nextLevelId + ? propsNum.urlQuery.nextLevelId + : propsNum.urlQuery.levelId + ? propsNum.urlQuery.levelId + : answer.data.currentData.levelId, + levelType: 2, + result: 1, + costTime: answer.data.currentData.usedTime, + sessionId: answer.data.currentData.sessionId, + wordId: answer.data.currentData.wordId, + meaningId: answer.data.currentData.meaningId, + useTools: answer.data.useTools, + titleFrom: answer.data.currentData.titleFrom, + } + totalData.value.push(postData) + return new Promise((resolve, reject) => { + learnWordApi + .postWordRecord(postData) + .then(res => {}) + .catch(() => { + learnWordApi.postWordRecord(postData) + }) + }) + }, + showAnswer() { + /* 显示正确答案 */ + const answer = this.data.currentData.spell + const answerArr: Array = [] + for (const item of answer) { + let canSelect = true + this.data.currentData.charList.forEach(character => { + if (character.value === item && canSelect) { + answerArr.push(character) + canSelect = false + } + }) + } + + inputList.data.queen = answerArr + }, + } + + watch(onClickNextFlag, (newVal, oldVal) => { + if (newVal !== oldVal) { + answer.nextWords() + } + }) + + return { + gameProps, + inputList, + answer, + showNext, + totalData, + onClickNextFlag, + handleChangeNext, + } +} +export function clear() { + totalData.value = [] +} diff --git a/src/page/subject/learnWord/hardMode/hooks/useAudio.ts b/src/page/subject/learnWord/hardMode/hooks/useAudio.ts new file mode 100644 index 0000000..c1d85c0 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/hooks/useAudio.ts @@ -0,0 +1,25 @@ +import Player from 'xgplayer' +import { globalStore } from '@/stores' +const OSS_URL = import.meta.env.VITE_OSS_URL + +const soundUrl = `${OSS_URL}/xuexiaole_clinet/sound/` + +const useAudio = function () { + // 每个音频生成一个对应的 isPlay 状态 + function play(url: string) { + const { system } = globalStore() + const player = new Player({ + url: soundUrl + url, + id: 'learn-audio', + autoplay: true, + keyShortcut: false, + volume: system.volume.musicVolume / 100, + }) + player.play() + } + return { + play, + } +} + +export default useAudio diff --git a/src/page/subject/learnWord/hardMode/hooks/useNextStage.ts b/src/page/subject/learnWord/hardMode/hooks/useNextStage.ts new file mode 100644 index 0000000..f673738 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/hooks/useNextStage.ts @@ -0,0 +1,72 @@ +import learnWordApi from '@/api/subject/learnWord' +import { useLearnWordStore } from '@/stores/learnWord/useLearnWordStore' +import { nextTick } from 'vue' +import { setCache, getCache } from '@/utils/store' +import { useRouter } from 'vue-router' +import router from '@/router' +import { XMessage } from '@/hooks' + +export default function useNextStage() { + // const router = useRouter(); + const state = useLearnWordStore() + const curStageId = getCache('stage') + const mode = Number(getCache('mode')) + const nextStageIdx = state.stageList.findIndex(item => item.value === curStageId) + + if (nextStageIdx === state.stageList.length - 1) { + return XMessage.error('暂无下一阶关卡') + } else if (nextStageIdx > -1) { + const nextStageId = state.stageList[nextStageIdx + 1].value + learnWordApi.getMixIntrudeIndex(nextStageId).then(async (res: any) => { + if (res.data.code === 200) { + setCache('stage', nextStageId) + state.levelList = res.data.data.levelList + state.showTestButton = res.data.data.showTestButton + state.refreshLevelList = true + switch (mode) { + case 1: + // 入门模式列表 + state.currentTypeList = state.levelList.filter(item => item.type === 1) + break + case 2: + // 进阶模式列表 + state.currentTypeList = state.levelList.filter(item => item.type === 2) + break + case 3: + state.currentTypeList = state.levelList + break + default: + state.currentTypeList = state.levelList + break + } + + await nextTick(() => { + state.hasFilteredNotFull = false + state.currentList = state.currentTypeList.map((item, index) => { + item.index = index + return item + }) + }) + + await nextTick(() => { + if (!state.currentList.length) { + return XMessage.error('暂无关卡') + } + const levelId = state.currentList[0].levelId + let routePath = 'normalMode' + + if (mode === 2) { + routePath = 'hardMode' + } + + state.currentLevelIndex = 0 + router.replace( + `/subject/learnWord/${routePath}?levelId=${levelId}&first=${state.currentLevelIndex === 0 ? 1 : 0}`, + ) + }) + } + }) + } else { + return XMessage.error('出错啦~找不到下一阶') + } +} diff --git a/src/page/subject/learnWord/hardMode/hooks/usePopup.ts b/src/page/subject/learnWord/hardMode/hooks/usePopup.ts new file mode 100644 index 0000000..458ffb5 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/hooks/usePopup.ts @@ -0,0 +1,25 @@ +const usePopup = function () { + const status = ref(false) + + function open(callback?: () => void) { + status.value = true + if (callback && typeof callback === 'function') { + callback() + } + } + + function close(callback?: () => void) { + status.value = false + if (callback && typeof callback === 'function') { + callback() + } + } + + return { + status, + open, + close, + } +} + +export default usePopup diff --git a/src/page/subject/learnWord/hardMode/interface/index.ts b/src/page/subject/learnWord/hardMode/interface/index.ts new file mode 100644 index 0000000..77a15fc --- /dev/null +++ b/src/page/subject/learnWord/hardMode/interface/index.ts @@ -0,0 +1,64 @@ +import type { AppearWord } from '@/page/subject/learnWord/normalMode/interface' + +export interface Level { + accent?: string + levelId: string + sessionId: string + levelType: number + spell: string + title: string + titleType: number + titlePicture: null | string + titleTips: null | string + charList: Array + wordId: string + usedTime?: number + sentenceDisplaySpell: string + [key: string]: any +} + +export interface Character { + value: string + // 是否为答案的字母之一 + choose: boolean + // 答案中有多少个此字母 + maxChoose: number + // 是否被选择到输入框了(包括放大镜选中的) + selected?: boolean + // 是否被放大镜选中了 + fixed?: boolean + // 是否被道具清除了 + prop?: boolean +} + +export interface Statistics { + allRightCount: number + bomb: number + count: number + glass: number + rightCount: number + spell: string + surrender: number + wordId: string + appearWordList: Array + znDesc: string | null + typeAbbr: string | null + wordImg: string | null +} + +export interface contentType { + value: string + count?: number + selected?: boolean + isLong?: boolean + type?: string + isSpecial?: boolean + isIcon?: true + iconName?: string + iconHeight?: number + iconWidth?: number + onActive?: boolean + countTotal?: number + name?: string + hasAnimation?: boolean +} diff --git a/src/page/subject/learnWord/hardMode/styles/animate.scss b/src/page/subject/learnWord/hardMode/styles/animate.scss new file mode 100644 index 0000000..5311ee1 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/styles/animate.scss @@ -0,0 +1,107 @@ +.page__content { + position: relative; + .page__bomb { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + animation: showOnce 1.15s steps(1) forwards; + } +} + +.input__list { + .input__item { + --delay: 0s; + &.animate__prop { + visibility: hidden; + animation: show 0.6s linear forwards; + animation-delay: var(--delay); + } + } +} + +.char__list { + position: relative; + .char__item__box { + .char__item { + visibility: visible; + &.char__item__hidden { + visibility: hidden; + } + + &.char__item__prop { + animation: bomb 1s ease forwards; + } + } + } +} + +.char__list__animate { + &::after { + content: ''; + display: block; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + background: linear-gradient(-45deg, transparent 19%, rgba(#fffef5, 0.8) 37%, transparent 63%); + background-size: 400% 100%; + animation: polish 1.5s ease; + } +} + +@keyframes bomb { + 0% { + transform: scale(1); + opacity: 1; + } + 20% { + transform: scale(1.5); + opacity: 1; + } + 50% { + transform: scale(1); + opacity: 0.8; + } + 100% { + transform: scale(0); + opacity: 0; + } +} + +@keyframes show { + 0% { + transform: scale(1); + visibility: visible; + } + 40% { + transform: scale(1.5); + visibility: visible; + } + 100% { + transform: scale(1); + visibility: visible; + } +} + +@keyframes polish { + 0% { + background-position: 100% 50%; + } + + to { + background-position: 0 50%; + } +} + +@keyframes showOnce { + 0% { + background: url('https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/xuexiaole_clinet/normalMode/bomb.gif') + right center / 50% no-repeat; + } + 100% { + background: unset; + } +} diff --git a/src/page/subject/learnWord/hardMode/styles/page.scss b/src/page/subject/learnWord/hardMode/styles/page.scss new file mode 100644 index 0000000..9aa8c92 --- /dev/null +++ b/src/page/subject/learnWord/hardMode/styles/page.scss @@ -0,0 +1,315 @@ +@use '../../../../../styles/variate.scss' as *; + +* { + box-sizing: border-box; +} +.page__content { + box-sizing: border-box; + height: calc(100% - 54px); + display: flex; + position: relative; + user-select: none; + margin: 2.5vh 0 0; + + ::-webkit-scrollbar { + display: none; + width: 0 !important; + height: 0 !important; + -webkit-appearance: none; + background: transparent; + color: transparent; + } + + .page__content__left { + flex: 1; + padding: 0 110px; + display: flex; + flex-direction: column; + align-items: center; + overflow-y: auto; + overflow-x: hidden; + height: 100%; + .left_content { + // height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + } + .word { + display: flex; + align-items: center; + position: relative; + margin: 2.83vh 0; + .horn { + position: absolute; + left: 100%; + cursor: pointer; + } + } + .spell { + max-width: 480px; + padding: 0 32px; + background-image: url('https://xxl-1313840333.cos.ap-guangzhou.myqcloud.com/xuexiaole_clinet/normalMode/line_word.png'); + background-size: auto 100px; + + color: var(--grey-1, rgba(0, 0, 0, 0.85)); + font-family: Arial; + // font-size: 64px; + font-size: 2.83vh; + font-style: normal; + font-weight: 500; + line-height: 8.33vh; /* 150% */ + } + .horn { + margin-left: 14px; + margin-right: 14px; + width: 72px; + height: 6vh; + flex-shrink: 0; + cursor: pointer; + display: flex; + justify-content: center; + align-items: center; + + img { + width: 100%; + max-height: 100%; + object-fit: contain; + } + } + .round-3 { + width: 100%; + display: flex; + align-items: center; + justify-content: center; + } + .chinese { + width: 100%; + color: var(--grey-3, rgba(0, 0, 0, 0.65)); + font-size: 2.67vh; + } + .explain_form_box { + width: 100%; + // height: 78px; + margin-top: 4vh; + .explain_form { + padding: 1vh 28px; + border-radius: 1.33vh; + border: 0.33vh solid #ffa51f; + background: #fffef2; + color: vrgba(0, 0, 0, 0.65); + font-family: $font-special; + font-size: 2.67vh; + .form { + color: #8409d6; + } + .prototype { + color: #99d609; + } + .form_name { + color: #09c2d6; + } + } + } + .sentence { + color: var(--grey-1, rgba(0, 0, 0, 0.85)); + font-family: $font-text; + font-size: 2.83vh; + font-style: normal; + font-weight: 500; + } + + .phoneticSymbol { + color: var(--grey-3, rgba(0, 0, 0, 0.65)); + font-family: $font-text; + font-size: 2.67vh; + font-style: normal; + font-weight: 400; + line-height: 4.5vh; /* 150% */ + } + .illustration { + margin: 2.67vh 0 0; + width: 480px; + flex: 1; + // min-height: 0; + // height: 480px; + // background-color: #fff01f; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; + img { + width: 100%; + max-height: 100%; + object-fit: contain; + } + } + } + .page__content__right { + width: 880px; + padding: 0 80px 2.67vh; + overflow-y: auto; + overflow-x: hidden; + padding-right: 110px; + .game-props__list { + display: flex; + justify-content: space-around; + margin-bottom: 3.5vh; + // margin-bottom: 84px; + // 8.24 默认显示 单词释义、词性 + .game-props__item { + width: 124px; + height: 7.17vh; + position: relative; + cursor: pointer; + .game-props__item__icon { + width: 8.33vh; + height: 8.33vh; + } + .game-props__item__num { + position: absolute; + left: 76px; + top: 4.33vh; + width: 4vh; + height: 4vh; + border-radius: 50%; + background-color: #fffef5; + color: #736d20; + font-size: 2.67vh; + font-weight: 500; + } + } + .game-props__item--gray { + margin: 0.58vh 0; + width: 124px; + height: 7.17vh; + img { + width: 100%; + max-height: 100%; + object-fit: contain; + } + } + } + .btn__detail__box { + display: flex; + flex-direction: column; + align-items: center; + margin-bottom: 5.33vh; + // margin-bottom: 32px; + // 8.24 默认显示 单词释义、词性 + .btn__detail { + display: flex; + align-items: center; + margin-bottom: 1vh; + .btn__detail__icon { + width: 6vh; + height: 6vh; + margin-right: 14px; + } + } + .btn__detail__text { + color: rgba(0, 0, 0, 0.65); + font-family: $font-text; + font-size: 2.33vh; + } + .yinbiao { + margin-top: 1.83vh; + display: flex; + align-items: center; + justify-content: center; + .icon { + margin-right: 18px; + } + } + } + .input__list__box { + // padding: 0 68px; + margin-bottom: 4.67vh; + display: flex; + justify-content: center; + .closeBtn { + cursor: pointer; + position: absolute; + right: -96px; + top: -0.67vh; + width: 6.67vh; + img { + width: 100%; + max-height: 100%; + object-fit: contain; + } + } + } + .input__list { + position: relative; + display: flex; + + .input__item { + width: 5.33vh; + height: 5.33vh; + border-radius: 0.83vh; + border: 0.17vh solid var(--1, #d9d163); + background: var(--unnamed, #fffef5); + display: flex; + align-items: center; + justify-content: center; + color: var(--grey-2, rgba(0, 0, 0, 0.75)); + font-size: 4vh; + font-weight: 500; + &.right { + border: 0.17vh solid var(--3, #8fcc00); + background: var(--3, #c1f052); + } + &.error { + border: 0.17vh solid #d9574e; + background: #d9574e; + } + } + } + .char__list { + display: flex; + flex-wrap: wrap; + gap: 18px; + + .char__item__box { + width: 5.83vh; + height: 5.83vh; + // margin-bottom: 1vh; + // &:not(:nth-child(8n)) { + // margin-right: 18px; + // } + } + .char__item { + width: 100%; + height: 100%; + text-align: center; + border-radius: 0.83vh; + background-color: #faeb1e; + text-align: center; + line-height: 5.83vh; + color: #403c08; + font-weight: 500; + font-size: 4vh; + cursor: pointer; + } + } + } + .page__content__line { + border-left: 0.08vh dashed #d9d163; + } +} +@keyframes flicker { + 0% { + opacity: 1; + } + 50% { + opacity: 1; + } + 51% { + opacity: 0; + } + 100% { + opacity: 0; + } +} diff --git a/src/page/subject/learnWord/hooks/useInfiniteScroll.ts b/src/page/subject/learnWord/hooks/useInfiniteScroll.ts new file mode 100644 index 0000000..7e33357 --- /dev/null +++ b/src/page/subject/learnWord/hooks/useInfiniteScroll.ts @@ -0,0 +1,44 @@ +// import type { Word } from '../interfaces/index'; + +const useInfiniteScroll = (loadList, pageSize = 30) => { + let current = 0 + let total = 0 + let data = [] + const size = pageSize + + function setData(list) { + data = list + total = data.length + current = 1 + loadList.value = [] + load() + } + + function load() { + if (!data.length) { + loadList.value = [] + } else { + if (loadList.value.length >= data.length) return + const newLoad = data.slice(0, current * size) + loadList.value = newLoad + if (current * size <= total) { + current++ + } + } + } + + function handleScroll() { + const scrollTop = document.getElementsByClassName('level__page')[0].scrollTop + if (scrollTop < 10) { + load() + } + } + + return { + setData, + load, + handleScroll, + } +} + +export default useInfiniteScroll diff --git a/src/page/subject/learnWord/index.ts b/src/page/subject/learnWord/index.ts new file mode 100644 index 0000000..72d7b89 --- /dev/null +++ b/src/page/subject/learnWord/index.ts @@ -0,0 +1,2 @@ +export const question_right = 'right' +export const question_wrong = 'wrong' diff --git a/src/page/subject/learnWord/index.vue b/src/page/subject/learnWord/index.vue new file mode 100644 index 0000000..a25e222 --- /dev/null +++ b/src/page/subject/learnWord/index.vue @@ -0,0 +1,970 @@ + + + + + + diff --git a/src/page/subject/learnWord/interface/index.ts b/src/page/subject/learnWord/interface/index.ts new file mode 100644 index 0000000..4cddbf2 --- /dev/null +++ b/src/page/subject/learnWord/interface/index.ts @@ -0,0 +1,39 @@ +export interface Stage { + id: any + name: string + sortValue: number + status: 0 | 1 +} + +export interface UniSelectItem { + label: string + value: string +} + +export interface LevelDataItem { + friends?: Array | null + isOpen?: boolean + levelId: string + recordId?: string | null + star: number + type?: 1 | 2 + road?: string + levelNum: number + levelType: number + index: number + stageName: string +} + +export interface Friend { + name?: string + avatar?: string | null + avatarUrl?: string | null + nickName: string + sex: number +} + +export interface Mode { + prop: string + name?: string + value?: number +} diff --git a/src/page/subject/learnWord/normalMode/components/FailPop.vue b/src/page/subject/learnWord/normalMode/components/FailPop.vue new file mode 100644 index 0000000..8ea4d3a --- /dev/null +++ b/src/page/subject/learnWord/normalMode/components/FailPop.vue @@ -0,0 +1,402 @@ + + + + diff --git a/src/page/subject/learnWord/normalMode/components/PictureOptions.vue b/src/page/subject/learnWord/normalMode/components/PictureOptions.vue new file mode 100644 index 0000000..3ce7b89 --- /dev/null +++ b/src/page/subject/learnWord/normalMode/components/PictureOptions.vue @@ -0,0 +1,198 @@ + + + + diff --git a/src/page/subject/learnWord/normalMode/components/ProgressBar.vue b/src/page/subject/learnWord/normalMode/components/ProgressBar.vue new file mode 100644 index 0000000..8a293ba --- /dev/null +++ b/src/page/subject/learnWord/normalMode/components/ProgressBar.vue @@ -0,0 +1,146 @@ + + + diff --git a/src/page/subject/learnWord/normalMode/components/ResultTable.vue b/src/page/subject/learnWord/normalMode/components/ResultTable.vue new file mode 100644 index 0000000..bbca6cf --- /dev/null +++ b/src/page/subject/learnWord/normalMode/components/ResultTable.vue @@ -0,0 +1,265 @@ + + + + diff --git a/src/page/subject/learnWord/normalMode/components/SemanticReview.vue b/src/page/subject/learnWord/normalMode/components/SemanticReview.vue new file mode 100644 index 0000000..a7e89b3 --- /dev/null +++ b/src/page/subject/learnWord/normalMode/components/SemanticReview.vue @@ -0,0 +1,169 @@ + + + diff --git a/src/page/subject/learnWord/normalMode/components/SingleChoice.vue b/src/page/subject/learnWord/normalMode/components/SingleChoice.vue new file mode 100644 index 0000000..496bcf2 --- /dev/null +++ b/src/page/subject/learnWord/normalMode/components/SingleChoice.vue @@ -0,0 +1,557 @@ + + + diff --git a/src/page/subject/learnWord/normalMode/components/SuccessPop.vue b/src/page/subject/learnWord/normalMode/components/SuccessPop.vue new file mode 100644 index 0000000..9eaa019 --- /dev/null +++ b/src/page/subject/learnWord/normalMode/components/SuccessPop.vue @@ -0,0 +1,663 @@ + + + + diff --git a/src/page/subject/learnWord/normalMode/components/TestBtn.vue b/src/page/subject/learnWord/normalMode/components/TestBtn.vue new file mode 100644 index 0000000..94dd6ff --- /dev/null +++ b/src/page/subject/learnWord/normalMode/components/TestBtn.vue @@ -0,0 +1,55 @@ + + + diff --git a/src/page/subject/learnWord/normalMode/components/TextOptions.vue b/src/page/subject/learnWord/normalMode/components/TextOptions.vue new file mode 100644 index 0000000..154a0de --- /dev/null +++ b/src/page/subject/learnWord/normalMode/components/TextOptions.vue @@ -0,0 +1,277 @@ + + + diff --git a/src/page/subject/learnWord/normalMode/hooks/useAnswer.ts b/src/page/subject/learnWord/normalMode/hooks/useAnswer.ts new file mode 100644 index 0000000..f50da85 --- /dev/null +++ b/src/page/subject/learnWord/normalMode/hooks/useAnswer.ts @@ -0,0 +1,125 @@ +import type { Exercises, Option } from '../interface' +import { $sleep } from '@/utils/tool' +import useCommonAudio from '@/hooks/useCommonAudio' +import { useAudio } from '@/hooks' +import { question_right, question_wrong } from '../..' + +/* 答题程序,实现答题逻辑,调用正确和错误时的回调函数 */ +export default function useAnswer(handle: anyObj, getRightRect?: () => void) { + onMounted(() => { + window.addEventListener('keydown', keyBoardInput2) + }) + onUnmounted(() => { + window.removeEventListener('keydown', keyBoardInput2) + }) + function keyBoardInput2(e: any) { + const _this = answer.data + let selected = null + if (e.key === 'a' || e.key === 'A' || e.key === '1') { + selected = _this.currentData.optionList[0] + } else if (e.key === 'b' || e.key === 'B' || e.key === '2') { + selected = _this.currentData.optionList[1] + } else if (e.key === 'c' || e.key === 'C' || e.key === '3') { + selected = _this.currentData.optionList[2] + } else if (e.key === 'd' || e.key === 'D' || e.key === '4') { + selected = _this.currentData.optionList[3] + } + if (selected) { + answer.answering(selected.answer, selected) + } + } + + const sound = useCommonAudio(true) + const answer = { + data: reactive({ + canClick: true, + result: null as string | null, + currentData: {} as Exercises, + startTime: 0, + }), + load(data: any) { + const _this = this.data + _this.currentData = data + _this.startTime = new Date().getTime() + _this.currentData.optionList?.forEach(item => { + item.result = '' + }) + _this.result = null + _this.canClick = true + }, + async answering(result: boolean, optionItem: Option, isSpecial = false) { + const _this = answer.data + // console.log('点击'); + if (!_this.canClick) return // 答对时自动进入下一关,在此之前不允许再次点击 + // if (!_this.canClick && !optionItem.accent) + // return; + // else if (!_this.canClick && optionItem.accent) { + // if (_this.result === question_right) return; + // useAudio({ + // url: optionItem.accent, + // autoplay: true, + // }); + // return; + // } + _this.canClick = false + _this.currentData.usedTime = Math.round((new Date().getTime() - _this.startTime) / 1000) + + if (result) { + _this.result = question_right + optionItem.result = question_right + if (optionItem.accent) { + let did = false + function handleRight() { + if (did) return + did = true + handle.handleRight(_this.currentData) + } + // 播放声音最多等待1500毫秒 + setTimeout(handleRight, 1250) + useAudio({ + url: optionItem.accent, + autoplay: true, + onEnded() { + handleRight() + }, + onError() { + // 播放失败了,代码也要往下走 + handleRight() + }, + }) + return + } + // sound.play('right.mp3') + + await $sleep(500) + handle.handleRight(_this.currentData) + } else { + _this.result = question_wrong + if (!isSpecial) { + optionItem.result = question_wrong + sound.play('error.mp3') + + // 延迟展示正确答案 + // await $sleep(800) + } + /* 显示正确答案 */ + _this.currentData.optionList.forEach(item => { + if (item.answer) { + item.result = question_right + } + }) + + // sound.play('show_answer.mp3') + // await $sleep(300) + // sound.play('show_answer.mp3') + handle.handleError({ ..._this.currentData, surrender: isSpecial ? 1 : 0 }) + // await $sleep(500) + if (!handle.noNeedNext) { + sound.play('show_nextBtn.mp3') + } + } + }, + } + + return answer +} diff --git a/src/page/subject/learnWord/normalMode/hooks/useLoad.ts b/src/page/subject/learnWord/normalMode/hooks/useLoad.ts new file mode 100644 index 0000000..64d1b0f --- /dev/null +++ b/src/page/subject/learnWord/normalMode/hooks/useLoad.ts @@ -0,0 +1,75 @@ +import { XMessage } from '@/hooks' + +export default function useLoad() { + const size = ref(0) + const loadSize = ref(0) + const loadProgress = ref('0%') + const loaded = ref(false) + const arrTool = ref([]) + const showAgainLoad = ref(false) // 重新加载按钮 + + function init(arr: string[]) { + showAgainLoad.value = false + arrTool.value = arr + size.value = arr.length + loadSize.value = 0 + loaded.value = false + loadProgress.value = '0%' + getLoadTime() + if (arr.length) { + arr.forEach(i => { + load({ src: i }) + }) + } else { + loadProgress.value = '100%' + loaded.value = true + } + } + function getLoadTime() { + // 加载时长超过8秒 显示重新加载 + setTimeout(() => { + showAgainLoad.value = true + }, 8000) + } + + function loadAgain() { + init(arrTool.value) + } + + function loadTool() { + if (loaded.value) return + loadSize.value++ + loadProgress.value = Math.round((loadSize.value / size.value) * 100) + '%' + setTimeout(() => { + loaded.value = Number(loadProgress.value.replace('%', '')) >= 100 + }, 500) + } + + function load(item: { src: string; numberOfFail?: number }) { + const img = new Image() + img.src = item.src + img.addEventListener('load', () => { + loadTool() + }) + img.addEventListener('error', () => { + item.numberOfFail ? item.numberOfFail++ : (item.numberOfFail = 1) + if (item.numberOfFail && item.numberOfFail > 1) { + XMessage.error('加载失败,网络异常') + + loadTool() + } else { + load(item) + } + }) + } + + return { + size, + loadSize, + loadProgress, + showAgainLoad, + loaded, + loadAgain, + init, + } +} diff --git a/src/page/subject/learnWord/normalMode/hooks/usePopup.ts b/src/page/subject/learnWord/normalMode/hooks/usePopup.ts new file mode 100644 index 0000000..458ffb5 --- /dev/null +++ b/src/page/subject/learnWord/normalMode/hooks/usePopup.ts @@ -0,0 +1,25 @@ +const usePopup = function () { + const status = ref(false) + + function open(callback?: () => void) { + status.value = true + if (callback && typeof callback === 'function') { + callback() + } + } + + function close(callback?: () => void) { + status.value = false + if (callback && typeof callback === 'function') { + callback() + } + } + + return { + status, + open, + close, + } +} + +export default usePopup diff --git a/src/page/subject/learnWord/normalMode/hooks/useStarAnimate.ts b/src/page/subject/learnWord/normalMode/hooks/useStarAnimate.ts new file mode 100644 index 0000000..8267aff --- /dev/null +++ b/src/page/subject/learnWord/normalMode/hooks/useStarAnimate.ts @@ -0,0 +1,78 @@ +import useCommonAudio from '@/hooks/useCommonAudio' + +interface Point { + x: number + y: number +} + +export default function useStarAnimate() { + const screenWidthRatio = window.innerWidth / 1920 + const starRect = ref() + const starX = computed(() => + starRect.value ? starRect.value.top - 600 * screenWidthRatio + 'px' : 0, + ) + const starY = computed(() => + starRect.value + ? starRect.value.left - (300 * screenWidthRatio) / 2 + starRect.value.width / 2 + 'px' + : 0, + ) + const sound = useCommonAudio(true) + + // 坐标系是以左上角为原点,向下为y轴正方向,向右为x轴正方向 + const flyToRect = ref() + const flyRotate = computed(() => { + const angleRes = angleOfTriangle( + { + x: flyToRect.value?.right, + y: flyToRect.value?.top, + }, + { + x: starRect.value?.left, + y: flyToRect.value?.top, + }, + { + x: starRect.value?.left, + y: starRect.value?.top, + }, + ) + return angleRes.c * (flyToRect.value?.right > starRect.value?.left ? 1 : -1) + 'deg' + }) + + async function getRightRect() { + const data = await document.querySelector('.progress__rate')?.getBoundingClientRect() + flyToRect.value = data + const dataT = await document.querySelector('.right')?.getBoundingClientRect() + starRect.value = dataT + if (flyToRect.value) { + sound.play('star_answer.mp3') + } + } + + const distance = (p1: Point, p2: Point) => { + return Math.sqrt((p1.x - p2.x) ** 2 + (p1.y - p2.y) ** 2) + } + + const angleOfTriangle = (A: Point, B: Point, C: Point) => { + const angle = (radian: number) => (180 * radian) / Math.PI + const a = distance(B, C) + const b = distance(A, C) + const c = distance(A, B) + const angleA = Math.acos((b * b + c * c - a * a) / (2 * b * c)) + const angleB = Math.acos((a * a + c * c - b * b) / (2 * a * c)) + const angleC = Math.acos((a * a + b * b - c * c) / (2 * a * b)) + return { + a: Number.isNaN(angleA) ? 180 : angle(angleA), + b: Number.isNaN(angleB) ? 180 : angle(angleB), + c: Number.isNaN(angleC) ? 180 : angle(angleC), + } + } + + return { + starRect, + starX, + starY, + flyToRect, + flyRotate, + getRightRect, + } +} diff --git a/src/page/subject/learnWord/normalMode/interface/index.ts b/src/page/subject/learnWord/normalMode/interface/index.ts new file mode 100644 index 0000000..c5f1b7d --- /dev/null +++ b/src/page/subject/learnWord/normalMode/interface/index.ts @@ -0,0 +1,70 @@ +/* 习题单词 */ +export interface Exercises { + accent?: string + levelId: string + levelType?: number + score: number + sessionId?: string + title?: string | null + titlePicture: string | null + titleTips?: string | null + wordId: string + optionList: Array