ソースを参照

Merge remote-tracking branch 'origin/20240604-dev' into 20240604-dev

JutarryWu 1 週間 前
コミット
dfb8e74bda
12 ファイル変更1762 行追加283 行削除
  1. 215 210
      src/types/components.d.ts
  2. 1 0
      src/views/gameCenter/components/games/WorkingMemory/index.vue
  3. 299 0
      src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionName/index.vue
  4. 35 0
      src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionName/topics.json
  5. 299 0
      src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionParaphraseWords/index.vue
  6. 35 0
      src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionParaphraseWords/topics.json
  7. 299 0
      src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionRetell/index.vue
  8. 35 0
      src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionRetell/topics.json
  9. 299 0
      src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionRetellingSeries/index.vue
  10. 35 0
      src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionRetellingSeries/topics.json
  11. 209 73
      src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/index.vue
  12. 1 0
      src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/index.vue

+ 215 - 210
src/types/components.d.ts

@@ -7,217 +7,222 @@ export {}
 
 declare module 'vue' {
   export interface GlobalComponents {
-    Ability: typeof import('./../views/gameCenter/components/games/WorkingMemory/components/ability/index.vue')['default']
-    AddTester: typeof import('./../views/tester/components/AddTester/index.vue')['default']
-    ADLPower: typeof import('./../views/gameCenter/components/games/ADLPower/index.vue')['default']
-    AppLink: typeof import('./../components/AppLink/index.vue')['default']
-    AppMain: typeof import('./../layout/components/AppMain/index.vue')['default']
-    AssignTraining: typeof import('./../views/gameCenter/components/games/AssignTraining/index.vue')['default']
-    ATMainShow: typeof import('./../views/gameCenter/components/games/AssignTraining/components/ATMainShow/index.vue')['default']
-    Avatar: typeof import('./../components/Chat/Avatar/index.vue')['default']
-    BarChart: typeof import('./../views/dashboard/components/BarChart.vue')['default']
-    Blend: typeof import('./../views/gameCenter/components/games/WorkingMemory/components/blend/index.vue')['default']
-    Breadcrumb: typeof import('./../components/Breadcrumb/index.vue')['default']
-    BreadthTraining: typeof import('./../views/gameCenter/components/games/BreadthTraining/index.vue')['default']
-    BTRandomPentagram: typeof import('./../views/gameCenter/components/games/BreadthTraining/components/BTRandomPentagram/index.vue')['default']
-    CalculationExercises: typeof import('./../views/gameCenter/components/games/CalculationExercises/index.vue')['default']
-    CalculationRules: typeof import('./../views/gameCenter/components/games/CalculationRules/index.vue')['default']
-    CaseAdd: typeof import('./../views/tester/components/CaseInformation/CaseAdd/index.vue')['default']
-    CaseInformation: typeof import('./../views/tester/components/CaseInformation/index.vue')['default']
-    CaseLog: typeof import('./../views/tester/components/CaseInformation/CaseLog/index.vue')['default']
-    CATAuditoryTrainingRecognition: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/CATAuditoryTrainingRecognition/index.vue')['default']
-    CATAuditoryTrainingRightOrWrongResponse: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/CATAuditoryTrainingRightOrWrongResponse/index.vue')['default']
-    CATAuditoryTrainingSentenceImgMatching: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/CATAuditoryTrainingSentenceImgMatching/index.vue')['default']
-    CATAuditoryTrainingWordImgMatching: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/CATAuditoryTrainingWordImgMatching/index.vue')['default']
-    CExercisesMainShow: typeof import('./../views/gameCenter/components/games/CalculationExercises/components/CExercisesMainShow/index.vue')['default']
-    CharacterMemory: typeof import('./../views/gameCenter/components/games/CharacterMemory/index.vue')['default']
-    CharacterMemoryChild: typeof import('./../views/gameCenter/components/games/CharacterMemory/components/CharacterMemoryChild/index.vue')['default']
-    ChatComponent: typeof import('./../components/Chat/ChatComponent/index.vue')['default']
-    CocosDialog: typeof import('./../views/gameCenter/components/games/CocosDialog/index.vue')['default']
-    CognitiveAbility5EC301: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbility5EC301/index.vue')['default']
-    CognitiveAbilitySellingTest: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilitySellingTest/index.vue')['default']
-    CognitiveAbilityStarShapedSales: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityStarShapedSales/index.vue')['default']
-    CognitiveAbilityTask: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/index.vue')['default']
-    CognitiveAbilityTaskAuditoryTraining: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/index.vue')['default']
-    CognitiveAbilityTaskBoston: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskBoston/index.vue')['default']
-    CognitiveAbilityTaskDemo: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTask-demo/index.vue')['default']
-    CognitiveAbilityTaskDigitalMemoryTest: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskDigitalMemoryTest/index.vue')['default']
-    CognitiveAbilityTaskDrawClock: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskDrawClock/index.vue')['default']
-    CognitiveAbilityTaskMMSE: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskMMSE/index.vue')['default']
-    CognitiveAbilityTaskMoca: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskMoca/index.vue')['default']
-    CognitiveAbilityTaskOralExpression: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/index.vue')['default']
-    CognitiveAbilityTaskVisualTraining: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/index.vue')['default']
-    CognitiveAbilityWisconsin: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityWisconsin/index.vue')['default']
-    Computation: typeof import('./../views/gameCenter/components/games/Computation/index.vue')['default']
-    ConceptFormation: typeof import('./../views/gameCenter/components/games/ConceptFormation/index.vue')['default']
-    CountingDots: typeof import('./../views/gameCenter/components/games/CountingDots/index.vue')['default']
-    CountingDotsChild: typeof import('./../views/gameCenter/components/games/CountingDots/components/CountingDotsChild/index.vue')['default']
-    CRRuleShow: typeof import('./../views/gameCenter/components/games/CalculationRules/components/CRRuleShow/index.vue')['default']
-    CTopicShow: typeof import('./../views/gameCenter/components/games/Computation/components/CTopicShow/index.vue')['default']
-    DeptTree: typeof import('./../views/system/user/components/dept-tree.vue')['default']
-    DiagramMap: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/diagramMap/index.vue')['default']
-    Dictionary: typeof import('./../components/Dictionary/index.vue')['default']
-    DigitalUnderstanding: typeof import('./../views/gameCenter/components/games/DigitalUnderstanding/index.vue')['default']
-    DUMainShow: typeof import('./../views/gameCenter/components/games/DigitalUnderstanding/components/DUMainShow/index.vue')['default']
-    EditDiv: typeof import('./../components/Chat/EditDiv/index.vue')['default']
-    ElBacktop: typeof import('element-plus/es')['ElBacktop']
-    ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
-    ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
-    ElButton: typeof import('element-plus/es')['ElButton']
-    ElCarousel: typeof import('element-plus/es')['ElCarousel']
-    ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem']
-    ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
-    ElCol: typeof import('element-plus/es')['ElCol']
-    ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
-    ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
-    ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
-    ElDialog: typeof import('element-plus/es')['ElDialog']
-    ElDivider: typeof import('element-plus/es')['ElDivider']
-    ElDrawer: typeof import('element-plus/es')['ElDrawer']
-    ElDropdown: typeof import('element-plus/es')['ElDropdown']
-    ElDropdownItem: typeof import('element-plus/es')['ElDropdownItem']
-    ElDropdownMenu: typeof import('element-plus/es')['ElDropdownMenu']
-    ElForm: typeof import('element-plus/es')['ElForm']
-    ElFormItem: typeof import('element-plus/es')['ElFormItem']
-    ElIcon: typeof import('element-plus/es')['ElIcon']
-    ElImage: typeof import('element-plus/es')['ElImage']
-    ElInput: typeof import('element-plus/es')['ElInput']
-    ElMenu: typeof import('element-plus/es')['ElMenu']
-    ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
-    ElOption: typeof import('element-plus/es')['ElOption']
-    ElPageHeader: typeof import('element-plus/es')['ElPageHeader']
-    ElPagination: typeof import('element-plus/es')['ElPagination']
-    ElProgress: typeof import('element-plus/es')['ElProgress']
-    ElRadio: typeof import('element-plus/es')['ElRadio']
-    ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
-    ElRow: typeof import('element-plus/es')['ElRow']
-    ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
-    ElSelect: typeof import('element-plus/es')['ElSelect']
-    ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
-    ElSwitch: typeof import('element-plus/es')['ElSwitch']
-    ElTag: typeof import('element-plus/es')['ElTag']
-    ElTooltip: typeof import('element-plus/es')['ElTooltip']
-    ElWatermark: typeof import('element-plus/es')['ElWatermark']
-    EmojiSelector: typeof import('./../components/Chat/emoji-selector/index.vue')['default']
-    Essay: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/essay/index.vue')['default']
-    Execute: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/execute/index.vue')['default']
-    FileUpload: typeof import('./../components/Upload/FileUpload.vue')['default']
-    FindNumberTraining: typeof import('./../views/gameCenter/components/games/FindNumberTraining/index.vue')['default']
-    Fish: typeof import('./../views/gameCenter/components/games/SuppressionControlTest/components/fish/index.vue')['default']
-    FixedTransfer: typeof import('./../views/gameCenter/components/games/FixedTransfer/index.vue')['default']
-    FluidDnd: typeof import('./../views/gameCenter/components/games/DigitalUnderstanding/components/FluidDnd/index.vue')['default']
-    FormatCountDown: typeof import('./../components/FormatCountDown/index.vue')['default']
-    FunnelChart: typeof import('./../views/dashboard/components/FunnelChart.vue')['default']
-    GithubCorner: typeof import('./../components/GithubCorner/index.vue')['default']
-    Hamburger: typeof import('./../components/Hamburger/index.vue')['default']
-    IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
-    IEpArrowLeft: typeof import('~icons/ep/arrow-left')['default']
-    IEpArrowRight: typeof import('~icons/ep/arrow-right')['default']
-    IEpClose: typeof import('~icons/ep/close')['default']
-    IEpRefresh: typeof import('~icons/ep/refresh')['default']
-    IEpSearch: typeof import('~icons/ep/search')['default']
-    IEpTimer: typeof import('~icons/ep/timer')['default']
-    IEpUpload: typeof import('~icons/ep/upload')['default']
-    IndexBack: typeof import('./../components/Chat/emoji-selector/index-back.vue')['default']
-    IndexBarA: typeof import('./../views/dashboard/components/IndexBarA.vue')['default']
-    IndexBarS: typeof import('./../views/dashboard/components/IndexBarS.vue')['default']
-    IndexProgressBar: typeof import('./../views/dashboard/components/IndexProgressBar.vue')['default']
-    IndexSmallPieS: typeof import('./../views/dashboard/components/IndexSmallPieS.vue')['default']
-    IndexSmallTitle: typeof import('./../views/dashboard/components/IndexSmallTitle.vue')['default']
-    IndexSmoothLineS: typeof import('./../views/dashboard/components/IndexSmoothLineS.vue')['default']
-    InputWithBorder: typeof import('./../components/WuInput/InputWithBorder/index.vue')['default']
-    Introduction: typeof import('./../views/gameCenter/components/Introduction/index.vue')['default']
-    LangSelect: typeof import('./../components/LangSelect/index.vue')['default']
-    LayoutSelect: typeof import('./../layout/components/Settings/components/LayoutSelect.vue')['default']
-    LogicalReasoning: typeof import('./../views/gameCenter/components/games/LogicalReasoning/index.vue')['default']
-    Login: typeof import('./../views/login/components/login/index.vue')['default']
-    MapWord: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/mapWord/index.vue')['default']
-    MessageItem: typeof import('./../components/Chat/MessageItem/index.vue')['default']
-    MultiUpload: typeof import('./../components/Upload/MultiUpload.vue')['default']
-    MyFullScreenDialog: typeof import('./../components/MyFullScreenDialog/index.vue')['default']
-    NavBar: typeof import('./../layout/components/NavBar/index.vue')['default']
-    NavbarLeft: typeof import('./../layout/components/NavBar/components/NavbarLeft.vue')['default']
-    NavbarRight: typeof import('./../layout/components/NavBar/components/NavbarRight.vue')['default']
-    NumMdel: typeof import('./../views/gameCenter/components/games/LogicalReasoning/components/numMdel/index.vue')['default']
-    ObjectRecognition: typeof import('./../views/gameCenter/components/games/ObjectRecognition/index.vue')['default']
-    PageContent: typeof import('./../components/CURD/PageContent.vue')['default']
-    PageForm: typeof import('./../components/CURD/PageForm.vue')['default']
-    PageModal: typeof import('./../components/CURD/PageModal.vue')['default']
-    PageSearch: typeof import('./../components/CURD/PageSearch.vue')['default']
-    Pagination: typeof import('./../components/Pagination/index.vue')['default']
-    PicturePuzzle: typeof import('./../views/gameCenter/components/games/PicturePuzzle/index.vue')['default']
-    PicturePuzzleChild: typeof import('./../views/gameCenter/components/games/PicturePuzzle/components/PicturePuzzleChild/index.vue')['default']
-    PieChart: typeof import('./../views/dashboard/components/PieChart.vue')['default']
-    RadarChart: typeof import('./../views/dashboard/components/RadarChart.vue')['default']
-    Register: typeof import('./../views/login/components/register/index.vue')['default']
-    RehabilitationEvaluationLog: typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationLog/index.vue')['default']
-    RehabilitationEvaluationLogDetail: typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationLogDetail/index.vue')['default']
-    RehabilitationEvaluationLogIntro: typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationLogIntro/index.vue')['default']
-    RehabilitationEvaluationMgr: typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationMgr/index.vue')['default']
-    RehabilitationEvaluationMgrCognition: typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationMgr/components/RehabilitationEvaluationMgrCognition/index.vue')['default']
-    RehabilitationEvaluationMgrScale: typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationMgr/components/RehabilitationEvaluationMgrScale/index.vue')['default']
-    RehabilitationEvaluationReport: typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationReport/index.vue')['default']
-    RehabilitationEvaluationReportLog: typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationReportLog/index.vue')['default']
-    RehabilitationEvaluationResultDetail: typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationResultDetail/index.vue')['default']
-    RehabilitationEvaluationResultList: typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationResultList/index.vue')['default']
-    RehabilitationEvaluationScaleTestPage: typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationScaleTestPage/index.vue')['default']
-    RehabilitationGoals: typeof import('./../views/tester/components/RehabilitationGoals/index.vue')['default']
-    RehabilitationTrainingAchievement: typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingAchievement/index.vue')['default']
-    RehabilitationTrainingAdd: typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingAdd/index.vue')['default']
-    RehabilitationTrainingAddTestItem: typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingAdd/components/RehabilitationTrainingAddTestItem/index.vue')['default']
-    RehabilitationTrainingDetailAnalysis: typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingAchievement/components/RehabilitationTrainingDetailAnalysis/index.vue')['default']
-    RehabilitationTrainingList: typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingList/index.vue')['default']
-    RehabilitationTrainingTestItem: typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingList/components/RehabilitationTrainingTestItem/index.vue')['default']
-    ResetPsw: typeof import('./../views/login/components/resetPsw/index.vue')['default']
-    ResidualDialog: typeof import('./../components/ResidualDialog/index.vue')['default']
-    ResidueRecognition: typeof import('./../views/gameCenter/components/games/ResidueRecognition/index.vue')['default']
-    RightToLeftDiv: typeof import('./../components/MoveDiv/RightToLeftDiv/index.vue')['default']
-    RouterLink: typeof import('vue-router')['RouterLink']
-    RouterView: typeof import('vue-router')['RouterView']
-    SeriesInference: typeof import('./../views/gameCenter/components/games/SeriesInference/index.vue')['default']
-    SeriesInferenceChild: typeof import('./../views/gameCenter/components/games/SeriesInference/components/SeriesInferenceChild/index.vue')['default']
-    Settings: typeof import('./../layout/components/Settings/index.vue')['default']
-    SetTransferTest: typeof import('./../views/gameCenter/components/games/SetTransferTest/index.vue')['default']
-    Sidebar: typeof import('./../layout/components/Sidebar/index.vue')['default']
-    SidebarLogo: typeof import('./../layout/components/Sidebar/components/SidebarLogo.vue')['default']
-    SidebarMenu: typeof import('./../layout/components/Sidebar/components/SidebarMenu.vue')['default']
-    SidebarMenuItem: typeof import('./../layout/components/Sidebar/components/SidebarMenuItem.vue')['default']
-    SidebarMenuItemTitle: typeof import('./../layout/components/Sidebar/components/SidebarMenuItemTitle.vue')['default']
-    SidebarMixTopMenu: typeof import('./../layout/components/Sidebar/components/SidebarMixTopMenu.vue')['default']
-    SimpleTitle: typeof import('./../components/SimpleTitle/index.vue')['default']
-    SingleUpload: typeof import('./../components/Upload/SingleUpload.vue')['default']
-    SizeSelect: typeof import('./../components/SizeSelect/index.vue')['default']
-    SpatialPositioning: typeof import('./../views/gameCenter/components/games/SpatialPositioning/index.vue')['default']
-    SuppressionControlTest: typeof import('./../views/gameCenter/components/games/SuppressionControlTest/index.vue')['default']
-    SvgIcon: typeof import('./../components/SvgIcon/index.vue')['default']
-    TableHeaderDiv: typeof import('./../views/tester/manage/manage/components/TableHeaderDiv/index.vue')['default']
-    TableInfoItem: typeof import('./../views/tester/manage/manage/components/TableInfoItem/index.vue')['default']
-    TableInfoLine: typeof import('./../views/tester/manage/manage/components/TableInfoLine/index.vue')['default']
-    TableSelect: typeof import('./../components/TableSelect/index.vue')['default']
-    TagsView: typeof import('./../layout/components/TagsView/index.vue')['default']
-    TesterManageTableButtons: typeof import('./../views/tester/manage/manage/components/TesterManageTableButtons/index.vue')['default']
-    TesterPersonalInfo: typeof import('./../views/tester/components/TesterPersonalInfo/index.vue')['default']
-    ThemeColorPicker: typeof import('./../layout/components/Settings/components/ThemeColorPicker.vue')['default']
-    TopRightClose: typeof import('./../components/Close/TopRightClose/index.vue')['default']
-    TotalScore: typeof import('./../components/TotalScore/index.vue')['default']
-    TransferTraining: typeof import('./../views/gameCenter/components/games/TransferTraining/index.vue')['default']
-    TTimerBtn: typeof import('./../components/Button/TTimerBtn/index.vue')['default']
-    TTShapeShow: typeof import('./../views/gameCenter/components/games/TransferTraining/components/TTShapeShow/index.vue')['default']
-    UserImport: typeof import('./../views/system/user/components/user-import.vue')['default']
-    VerbalMemory: typeof import('./../views/gameCenter/components/games/VerbalMemory/index.vue')['default']
-    VideoTemp: typeof import('./../components/VideoTemp/index.vue')['default']
-    VirtualKeyboardNumberInput: typeof import('./../views/gameCenter/components/games/AssignTraining/components/VirtualKeyboardNumberInput/index.vue')['default']
-    VoiceImp: typeof import('./../components/VoiceImp/index.vue')['default']
-    WangEditor: typeof import('./../components/WangEditor/index.vue')['default']
-    WaterTitle: typeof import('./../components/WaterTitle/index.vue')['default']
-    WordMap: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/wordMap/index.vue')['default']
-    Words: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/Words/index.vue')['default']
-    WordWord: typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/wordWord/index.vue')['default']
-    WorkingMemory: typeof import('./../views/gameCenter/components/games/WorkingMemory/index.vue')['default']
-    WuCountDown: typeof import('./../components/WuCountDown/index.vue')['default']
-    WuIsCorrect: typeof import('./../components/WuIsCorrect/index.vue')['default']
+    Ability: (typeof import('./../views/gameCenter/components/games/WorkingMemory/components/ability/index.vue'))['default']
+    AddTester: (typeof import('./../views/tester/components/AddTester/index.vue'))['default']
+    ADLPower: (typeof import('./../views/gameCenter/components/games/ADLPower/index.vue'))['default']
+    AppLink: (typeof import('./../components/AppLink/index.vue'))['default']
+    AppMain: (typeof import('./../layout/components/AppMain/index.vue'))['default']
+    AssignTraining: (typeof import('./../views/gameCenter/components/games/AssignTraining/index.vue'))['default']
+    ATMainShow: (typeof import('./../views/gameCenter/components/games/AssignTraining/components/ATMainShow/index.vue'))['default']
+    Avatar: (typeof import('./../components/Chat/Avatar/index.vue'))['default']
+    BarChart: (typeof import('./../views/dashboard/components/BarChart.vue'))['default']
+    Blend: (typeof import('./../views/gameCenter/components/games/WorkingMemory/components/blend/index.vue'))['default']
+    Breadcrumb: (typeof import('./../components/Breadcrumb/index.vue'))['default']
+    BreadthTraining: (typeof import('./../views/gameCenter/components/games/BreadthTraining/index.vue'))['default']
+    BTRandomPentagram: (typeof import('./../views/gameCenter/components/games/BreadthTraining/components/BTRandomPentagram/index.vue'))['default']
+    CalculationExercises: (typeof import('./../views/gameCenter/components/games/CalculationExercises/index.vue'))['default']
+    CalculationRules: (typeof import('./../views/gameCenter/components/games/CalculationRules/index.vue'))['default']
+    CaseAdd: (typeof import('./../views/tester/components/CaseInformation/CaseAdd/index.vue'))['default']
+    CaseInformation: (typeof import('./../views/tester/components/CaseInformation/index.vue'))['default']
+    CaseLog: (typeof import('./../views/tester/components/CaseInformation/CaseLog/index.vue'))['default']
+    OralExpressionName: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionName/index.vue'))['default']
+    OralExpressionParaphraseWords: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionParaphraseWords/index.vue'))['default']
+    OralExpressionRetell: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionRetell/index.vue'))['default']
+    OralExpressionRetellingSeries: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionRetellingSeries/index.vue'))['default']
+
+    CATAuditoryTrainingRecognition: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/CATAuditoryTrainingRecognition/index.vue'))['default']
+    CATAuditoryTrainingRightOrWrongResponse: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/CATAuditoryTrainingRightOrWrongResponse/index.vue'))['default']
+    CATAuditoryTrainingSentenceImgMatching: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/CATAuditoryTrainingSentenceImgMatching/index.vue'))['default']
+    CATAuditoryTrainingWordImgMatching: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/CATAuditoryTrainingWordImgMatching/index.vue'))['default']
+    CExercisesMainShow: (typeof import('./../views/gameCenter/components/games/CalculationExercises/components/CExercisesMainShow/index.vue'))['default']
+    CharacterMemory: (typeof import('./../views/gameCenter/components/games/CharacterMemory/index.vue'))['default']
+    CharacterMemoryChild: (typeof import('./../views/gameCenter/components/games/CharacterMemory/components/CharacterMemoryChild/index.vue'))['default']
+    ChatComponent: (typeof import('./../components/Chat/ChatComponent/index.vue'))['default']
+    CocosDialog: (typeof import('./../views/gameCenter/components/games/CocosDialog/index.vue'))['default']
+    CognitiveAbility5EC301: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbility5EC301/index.vue'))['default']
+    CognitiveAbilitySellingTest: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilitySellingTest/index.vue'))['default']
+    CognitiveAbilityStarShapedSales: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityStarShapedSales/index.vue'))['default']
+    CognitiveAbilityTask: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/index.vue'))['default']
+    CognitiveAbilityTaskAuditoryTraining: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/index.vue'))['default']
+    CognitiveAbilityTaskBoston: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskBoston/index.vue'))['default']
+    CognitiveAbilityTaskDemo: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTask-demo/index.vue'))['default']
+    CognitiveAbilityTaskDigitalMemoryTest: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskDigitalMemoryTest/index.vue'))['default']
+    CognitiveAbilityTaskDrawClock: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskDrawClock/index.vue'))['default']
+    CognitiveAbilityTaskMMSE: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskMMSE/index.vue'))['default']
+    CognitiveAbilityTaskMoca: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskMoca/index.vue'))['default']
+    CognitiveAbilityTaskOralExpression: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/index.vue'))['default']
+    CognitiveAbilityTaskVisualTraining: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/index.vue'))['default']
+    CognitiveAbilityWisconsin: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityWisconsin/index.vue'))['default']
+    Computation: (typeof import('./../views/gameCenter/components/games/Computation/index.vue'))['default']
+    ConceptFormation: (typeof import('./../views/gameCenter/components/games/ConceptFormation/index.vue'))['default']
+    CountingDots: (typeof import('./../views/gameCenter/components/games/CountingDots/index.vue'))['default']
+    CountingDotsChild: (typeof import('./../views/gameCenter/components/games/CountingDots/components/CountingDotsChild/index.vue'))['default']
+    CRRuleShow: (typeof import('./../views/gameCenter/components/games/CalculationRules/components/CRRuleShow/index.vue'))['default']
+    CTopicShow: (typeof import('./../views/gameCenter/components/games/Computation/components/CTopicShow/index.vue'))['default']
+    DeptTree: (typeof import('./../views/system/user/components/dept-tree.vue'))['default']
+    DiagramMap: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/diagramMap/index.vue'))['default']
+    Dictionary: (typeof import('./../components/Dictionary/index.vue'))['default']
+    DigitalUnderstanding: (typeof import('./../views/gameCenter/components/games/DigitalUnderstanding/index.vue'))['default']
+    DUMainShow: (typeof import('./../views/gameCenter/components/games/DigitalUnderstanding/components/DUMainShow/index.vue'))['default']
+    EditDiv: (typeof import('./../components/Chat/EditDiv/index.vue'))['default']
+    ElBacktop: (typeof import('element-plus/es'))['ElBacktop']
+    ElBreadcrumb: (typeof import('element-plus/es'))['ElBreadcrumb']
+    ElBreadcrumbItem: (typeof import('element-plus/es'))['ElBreadcrumbItem']
+    ElButton: (typeof import('element-plus/es'))['ElButton']
+    ElCarousel: (typeof import('element-plus/es'))['ElCarousel']
+    ElCarouselItem: (typeof import('element-plus/es'))['ElCarouselItem']
+    ElCheckbox: (typeof import('element-plus/es'))['ElCheckbox']
+    ElCol: (typeof import('element-plus/es'))['ElCol']
+    ElColorPicker: (typeof import('element-plus/es'))['ElColorPicker']
+    ElConfigProvider: (typeof import('element-plus/es'))['ElConfigProvider']
+    ElDatePicker: (typeof import('element-plus/es'))['ElDatePicker']
+    ElDialog: (typeof import('element-plus/es'))['ElDialog']
+    ElDivider: (typeof import('element-plus/es'))['ElDivider']
+    ElDrawer: (typeof import('element-plus/es'))['ElDrawer']
+    ElDropdown: (typeof import('element-plus/es'))['ElDropdown']
+    ElDropdownItem: (typeof import('element-plus/es'))['ElDropdownItem']
+    ElDropdownMenu: (typeof import('element-plus/es'))['ElDropdownMenu']
+    ElForm: (typeof import('element-plus/es'))['ElForm']
+    ElFormItem: (typeof import('element-plus/es'))['ElFormItem']
+    ElIcon: (typeof import('element-plus/es'))['ElIcon']
+    ElImage: (typeof import('element-plus/es'))['ElImage']
+    ElInput: (typeof import('element-plus/es'))['ElInput']
+    ElMenu: (typeof import('element-plus/es'))['ElMenu']
+    ElMenuItem: (typeof import('element-plus/es'))['ElMenuItem']
+    ElOption: (typeof import('element-plus/es'))['ElOption']
+    ElPageHeader: (typeof import('element-plus/es'))['ElPageHeader']
+    ElPagination: (typeof import('element-plus/es'))['ElPagination']
+    ElProgress: (typeof import('element-plus/es'))['ElProgress']
+    ElRadio: (typeof import('element-plus/es'))['ElRadio']
+    ElRadioGroup: (typeof import('element-plus/es'))['ElRadioGroup']
+    ElRow: (typeof import('element-plus/es'))['ElRow']
+    ElScrollbar: (typeof import('element-plus/es'))['ElScrollbar']
+    ElSelect: (typeof import('element-plus/es'))['ElSelect']
+    ElSubMenu: (typeof import('element-plus/es'))['ElSubMenu']
+    ElSwitch: (typeof import('element-plus/es'))['ElSwitch']
+    ElTag: (typeof import('element-plus/es'))['ElTag']
+    ElTooltip: (typeof import('element-plus/es'))['ElTooltip']
+    ElWatermark: (typeof import('element-plus/es'))['ElWatermark']
+    EmojiSelector: (typeof import('./../components/Chat/emoji-selector/index.vue'))['default']
+    Essay: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/essay/index.vue'))['default']
+    Execute: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/execute/index.vue'))['default']
+    FileUpload: (typeof import('./../components/Upload/FileUpload.vue'))['default']
+    FindNumberTraining: (typeof import('./../views/gameCenter/components/games/FindNumberTraining/index.vue'))['default']
+    Fish: (typeof import('./../views/gameCenter/components/games/SuppressionControlTest/components/fish/index.vue'))['default']
+    FixedTransfer: (typeof import('./../views/gameCenter/components/games/FixedTransfer/index.vue'))['default']
+    FluidDnd: (typeof import('./../views/gameCenter/components/games/DigitalUnderstanding/components/FluidDnd/index.vue'))['default']
+    FormatCountDown: (typeof import('./../components/FormatCountDown/index.vue'))['default']
+    FunnelChart: (typeof import('./../views/dashboard/components/FunnelChart.vue'))['default']
+    GithubCorner: (typeof import('./../components/GithubCorner/index.vue'))['default']
+    Hamburger: (typeof import('./../components/Hamburger/index.vue'))['default']
+    IconSelect: (typeof import('./../components/IconSelect/index.vue'))['default']
+    IEpArrowLeft: (typeof import('~icons/ep/arrow-left'))['default']
+    IEpArrowRight: (typeof import('~icons/ep/arrow-right'))['default']
+    IEpClose: (typeof import('~icons/ep/close'))['default']
+    IEpRefresh: (typeof import('~icons/ep/refresh'))['default']
+    IEpSearch: (typeof import('~icons/ep/search'))['default']
+    IEpTimer: (typeof import('~icons/ep/timer'))['default']
+    IEpUpload: (typeof import('~icons/ep/upload'))['default']
+    IndexBack: (typeof import('./../components/Chat/emoji-selector/index-back.vue'))['default']
+    IndexBarA: (typeof import('./../views/dashboard/components/IndexBarA.vue'))['default']
+    IndexBarS: (typeof import('./../views/dashboard/components/IndexBarS.vue'))['default']
+    IndexProgressBar: (typeof import('./../views/dashboard/components/IndexProgressBar.vue'))['default']
+    IndexSmallPieS: (typeof import('./../views/dashboard/components/IndexSmallPieS.vue'))['default']
+    IndexSmallTitle: (typeof import('./../views/dashboard/components/IndexSmallTitle.vue'))['default']
+    IndexSmoothLineS: (typeof import('./../views/dashboard/components/IndexSmoothLineS.vue'))['default']
+    InputWithBorder: (typeof import('./../components/WuInput/InputWithBorder/index.vue'))['default']
+    Introduction: (typeof import('./../views/gameCenter/components/Introduction/index.vue'))['default']
+    LangSelect: (typeof import('./../components/LangSelect/index.vue'))['default']
+    LayoutSelect: (typeof import('./../layout/components/Settings/components/LayoutSelect.vue'))['default']
+    LogicalReasoning: (typeof import('./../views/gameCenter/components/games/LogicalReasoning/index.vue'))['default']
+    Login: (typeof import('./../views/login/components/login/index.vue'))['default']
+    MapWord: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/mapWord/index.vue'))['default']
+    MessageItem: (typeof import('./../components/Chat/MessageItem/index.vue'))['default']
+    MultiUpload: (typeof import('./../components/Upload/MultiUpload.vue'))['default']
+    MyFullScreenDialog: (typeof import('./../components/MyFullScreenDialog/index.vue'))['default']
+    NavBar: (typeof import('./../layout/components/NavBar/index.vue'))['default']
+    NavbarLeft: (typeof import('./../layout/components/NavBar/components/NavbarLeft.vue'))['default']
+    NavbarRight: (typeof import('./../layout/components/NavBar/components/NavbarRight.vue'))['default']
+    NumMdel: (typeof import('./../views/gameCenter/components/games/LogicalReasoning/components/numMdel/index.vue'))['default']
+    ObjectRecognition: (typeof import('./../views/gameCenter/components/games/ObjectRecognition/index.vue'))['default']
+    PageContent: (typeof import('./../components/CURD/PageContent.vue'))['default']
+    PageForm: (typeof import('./../components/CURD/PageForm.vue'))['default']
+    PageModal: (typeof import('./../components/CURD/PageModal.vue'))['default']
+    PageSearch: (typeof import('./../components/CURD/PageSearch.vue'))['default']
+    Pagination: (typeof import('./../components/Pagination/index.vue'))['default']
+    PicturePuzzle: (typeof import('./../views/gameCenter/components/games/PicturePuzzle/index.vue'))['default']
+    PicturePuzzleChild: (typeof import('./../views/gameCenter/components/games/PicturePuzzle/components/PicturePuzzleChild/index.vue'))['default']
+    PieChart: (typeof import('./../views/dashboard/components/PieChart.vue'))['default']
+    RadarChart: (typeof import('./../views/dashboard/components/RadarChart.vue'))['default']
+    Register: (typeof import('./../views/login/components/register/index.vue'))['default']
+    RehabilitationEvaluationLog: (typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationLog/index.vue'))['default']
+    RehabilitationEvaluationLogDetail: (typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationLogDetail/index.vue'))['default']
+    RehabilitationEvaluationLogIntro: (typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationLogIntro/index.vue'))['default']
+    RehabilitationEvaluationMgr: (typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationMgr/index.vue'))['default']
+    RehabilitationEvaluationMgrCognition: (typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationMgr/components/RehabilitationEvaluationMgrCognition/index.vue'))['default']
+    RehabilitationEvaluationMgrScale: (typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationMgr/components/RehabilitationEvaluationMgrScale/index.vue'))['default']
+    RehabilitationEvaluationReport: (typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationReport/index.vue'))['default']
+    RehabilitationEvaluationReportLog: (typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationReportLog/index.vue'))['default']
+    RehabilitationEvaluationResultDetail: (typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationResultDetail/index.vue'))['default']
+    RehabilitationEvaluationResultList: (typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationResultList/index.vue'))['default']
+    RehabilitationEvaluationScaleTestPage: (typeof import('./../views/tester/components/RehabilitationEvaluation/RehabilitationEvaluationScaleTestPage/index.vue'))['default']
+    RehabilitationGoals: (typeof import('./../views/tester/components/RehabilitationGoals/index.vue'))['default']
+    RehabilitationTrainingAchievement: (typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingAchievement/index.vue'))['default']
+    RehabilitationTrainingAdd: (typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingAdd/index.vue'))['default']
+    RehabilitationTrainingAddTestItem: (typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingAdd/components/RehabilitationTrainingAddTestItem/index.vue'))['default']
+    RehabilitationTrainingDetailAnalysis: (typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingAchievement/components/RehabilitationTrainingDetailAnalysis/index.vue'))['default']
+    RehabilitationTrainingList: (typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingList/index.vue'))['default']
+    RehabilitationTrainingTestItem: (typeof import('./../views/tester/components/RehabilitationTraining/RehabilitationTrainingList/components/RehabilitationTrainingTestItem/index.vue'))['default']
+    ResetPsw: (typeof import('./../views/login/components/resetPsw/index.vue'))['default']
+    ResidualDialog: (typeof import('./../components/ResidualDialog/index.vue'))['default']
+    ResidueRecognition: (typeof import('./../views/gameCenter/components/games/ResidueRecognition/index.vue'))['default']
+    RightToLeftDiv: (typeof import('./../components/MoveDiv/RightToLeftDiv/index.vue'))['default']
+    RouterLink: (typeof import('vue-router'))['RouterLink']
+    RouterView: (typeof import('vue-router'))['RouterView']
+    SeriesInference: (typeof import('./../views/gameCenter/components/games/SeriesInference/index.vue'))['default']
+    SeriesInferenceChild: (typeof import('./../views/gameCenter/components/games/SeriesInference/components/SeriesInferenceChild/index.vue'))['default']
+    Settings: (typeof import('./../layout/components/Settings/index.vue'))['default']
+    SetTransferTest: (typeof import('./../views/gameCenter/components/games/SetTransferTest/index.vue'))['default']
+    Sidebar: (typeof import('./../layout/components/Sidebar/index.vue'))['default']
+    SidebarLogo: (typeof import('./../layout/components/Sidebar/components/SidebarLogo.vue'))['default']
+    SidebarMenu: (typeof import('./../layout/components/Sidebar/components/SidebarMenu.vue'))['default']
+    SidebarMenuItem: (typeof import('./../layout/components/Sidebar/components/SidebarMenuItem.vue'))['default']
+    SidebarMenuItemTitle: (typeof import('./../layout/components/Sidebar/components/SidebarMenuItemTitle.vue'))['default']
+    SidebarMixTopMenu: (typeof import('./../layout/components/Sidebar/components/SidebarMixTopMenu.vue'))['default']
+    SimpleTitle: (typeof import('./../components/SimpleTitle/index.vue'))['default']
+    SingleUpload: (typeof import('./../components/Upload/SingleUpload.vue'))['default']
+    SizeSelect: (typeof import('./../components/SizeSelect/index.vue'))['default']
+    SpatialPositioning: (typeof import('./../views/gameCenter/components/games/SpatialPositioning/index.vue'))['default']
+    SuppressionControlTest: (typeof import('./../views/gameCenter/components/games/SuppressionControlTest/index.vue'))['default']
+    SvgIcon: (typeof import('./../components/SvgIcon/index.vue'))['default']
+    TableHeaderDiv: (typeof import('./../views/tester/manage/manage/components/TableHeaderDiv/index.vue'))['default']
+    TableInfoItem: (typeof import('./../views/tester/manage/manage/components/TableInfoItem/index.vue'))['default']
+    TableInfoLine: (typeof import('./../views/tester/manage/manage/components/TableInfoLine/index.vue'))['default']
+    TableSelect: (typeof import('./../components/TableSelect/index.vue'))['default']
+    TagsView: (typeof import('./../layout/components/TagsView/index.vue'))['default']
+    TesterManageTableButtons: (typeof import('./../views/tester/manage/manage/components/TesterManageTableButtons/index.vue'))['default']
+    TesterPersonalInfo: (typeof import('./../views/tester/components/TesterPersonalInfo/index.vue'))['default']
+    ThemeColorPicker: (typeof import('./../layout/components/Settings/components/ThemeColorPicker.vue'))['default']
+    TopRightClose: (typeof import('./../components/Close/TopRightClose/index.vue'))['default']
+    TotalScore: (typeof import('./../components/TotalScore/index.vue'))['default']
+    TransferTraining: (typeof import('./../views/gameCenter/components/games/TransferTraining/index.vue'))['default']
+    TTimerBtn: (typeof import('./../components/Button/TTimerBtn/index.vue'))['default']
+    TTShapeShow: (typeof import('./../views/gameCenter/components/games/TransferTraining/components/TTShapeShow/index.vue'))['default']
+    UserImport: (typeof import('./../views/system/user/components/user-import.vue'))['default']
+    VerbalMemory: (typeof import('./../views/gameCenter/components/games/VerbalMemory/index.vue'))['default']
+    VideoTemp: (typeof import('./../components/VideoTemp/index.vue'))['default']
+    VirtualKeyboardNumberInput: (typeof import('./../views/gameCenter/components/games/AssignTraining/components/VirtualKeyboardNumberInput/index.vue'))['default']
+    VoiceImp: (typeof import('./../components/VoiceImp/index.vue'))['default']
+    WangEditor: (typeof import('./../components/WangEditor/index.vue'))['default']
+    WaterTitle: (typeof import('./../components/WaterTitle/index.vue'))['default']
+    WordMap: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/wordMap/index.vue'))['default']
+    Words: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/Words/index.vue'))['default']
+    WordWord: (typeof import('./../views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/components/wordWord/index.vue'))['default']
+    WorkingMemory: (typeof import('./../views/gameCenter/components/games/WorkingMemory/index.vue'))['default']
+    WuCountDown: (typeof import('./../components/WuCountDown/index.vue'))['default']
+    WuIsCorrect: (typeof import('./../components/WuIsCorrect/index.vue'))['default']
   }
   export interface ComponentCustomProperties {
-    vLoading: typeof import('element-plus/es')['ElLoadingDirective']
+    vLoading: (typeof import('element-plus/es'))['ElLoadingDirective']
   }
 }

+ 1 - 0
src/views/gameCenter/components/games/WorkingMemory/index.vue

@@ -332,6 +332,7 @@ const nextOnce = () => {
       console.log(gameList, '游戏数据')
       clearInterval(timerId)
       clearInterval(divShowInteval)
+      handleClose(() => {})
       // sendData()
       return
     }

+ 299 - 0
src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionName/index.vue

@@ -0,0 +1,299 @@
+<template>
+  <section class="auditory-word-img-matching-container flex-center flex-col wh-full relative">
+    <water-title title="词图匹配" />
+    <div v-if="isMainWin" class="text-[42px] text-[#0F308C]">
+      {{ Topics.question }}
+    </div>
+
+    <div v-if="!isMainWin && showTopics" class="flex-center flex-col text-100px text-[#0F308C]">
+      {{ TopicsVal[currentIndex].correct }}
+    </div>
+    <div class="w-80% h-60% my-30px flex-center flex-col">
+      <template v-if="showTopics">
+        <el-image
+          v-if="isMainWin"
+          src="/static/image/cognitiveAbility/SpeechTraining/Auditory/play.png"
+          fit="contain"
+          class="w-[140px] h-[140px] mb-40px cursor-pointer hover:scale-101"
+          @click="handlePlay"
+        />
+        <div class="w-full flex flex-row justify-around">
+          <div v-for="(item, index) in TopicsVal[currentIndex].choices" :key="index" class="flex flex-col items-center">
+            <div class="w-180px h-180px flex-center cursor-pointer" @click="handleItemClick(item, index)">
+              <el-image
+                :src="`/static/image/cognitiveAbility/SpeechTraining/Visual/${item}.png`"
+                fit="contain"
+                class="w-[180px] h-[180px] cursor-pointer mt-30px rounded-8px"
+              />
+            </div>
+            <el-image
+              :src="`/static/image/cognitiveAbility/SpeechTraining/${useClickIndex === index || item === TopicsVal[currentIndex].userAnswer ? 'Options-right' : 'Options-Blank'}.png`"
+              fit="contain"
+              class="w-[60px] h-[60px] mt-30px"
+            />
+          </div>
+        </div>
+      </template>
+    </div>
+
+    <div v-if="!isMainWin" class="w-[300px] h-[140px]">
+      <el-image
+        v-if="showSubmitBtn"
+        src="/static/image/cognitiveAbility/SpeechTraining/verify-bg.png"
+        fit="contain"
+        class="w-[300px] h-[140px] cursor-pointer hover:scale-101"
+        @click="handleSubmit"
+      />
+    </div>
+
+    <div
+      v-if="isMainWin"
+      class="absolute bottom-[24px] left-10% w-80% h-140px flex flex-row items-center justify-between"
+    >
+      <div class="flex flex-row items-center">
+        <template v-if="showScoreArea">
+          <span class="text-[#0F308C] text-[42px]">请评分:</span>
+          <div
+            v-for="(item, index) in [0, 1, 2]"
+            :key="index"
+            class="w-[140px] flex flex-row items-center cursor-pointer"
+            @click="handleScore(item)"
+          >
+            <el-image
+              :src="`/static/image/cognitiveAbility/SpeechTraining/${
+                index === scoreIndex ? 'Options-right' : 'Options-Blank'
+              }.png`"
+              fit="contain"
+              class="w-[40px] h-[40px] cursor-pointer"
+            />
+            <span class="text-[36px] text-[#0F308C] ml-12px">{{ item }}</span>
+          </div>
+        </template>
+      </div>
+      <el-image
+        v-if="showNextBtn"
+        src="/static/image/cognitiveAbility/SpeechTraining/next.png"
+        fit="contain"
+        class="w-[300px] h-[140px] cursor-pointer hover:scale-101"
+        @click="handleNext()"
+      />
+    </div>
+    <div
+      v-if="!isMainWin && showScoreArea"
+      class="df-bg absolute bottom-[44px] left-10% w-280px h-120px flex flex-row items-end justify-between"
+    >
+      <div class="text-[#2569CA] text-[58px] ml-[158px] pb-[10px] score-text">
+        {{ TopicsVal[currentIndex].score }}<span>分</span>
+      </div>
+    </div>
+
+    <VoiceImp ref="VoiceImpRef" />
+  </section>
+</template>
+
+<script setup lang="ts">
+/*
+ * 组件名: CATAuditoryTrainingWordImgMatching
+ * 组件用途: 常规听康复训练 - 词图匹配
+ * 创建日期: 2024/11/12
+ * 编写者: JutarryWu
+ */
+
+import { formatSeconds, isJSON } from '@/utils'
+
+defineOptions({
+  name: 'CATAuditoryTrainingWordImgMatching',
+  inheritAttrs: false
+})
+
+import Topics from './topics.json'
+
+interface TopicsType {
+  choices: string[]
+  correct: string
+  userAnswer: string
+  score: string
+}
+
+const props = defineProps({})
+const emits = defineEmits(['gameOver'])
+
+const isMainWin = ref(false)
+const showNextBtn = ref(false) // 主屏 - 显示下一题按钮标识
+const showScoreArea = ref(false) // 主屏 - 显示评分标识
+const showSubmitBtn = ref(false) // 副屏 - 显示确定按钮标识
+let isSubmitting = false // 是否正在提交标识
+const showTopics = ref(false) // 显示题目选项标识
+const VoiceImpRef = ref()
+const currentIndex = ref(0) // 当前题目索引
+const TopicsVal = ref<TopicsType[]>([])
+const useClickIndex = ref(-1) // 副屏 - 患者点击的选项索引
+const scoreIndex = ref(-1) // 主屏 - 医生评分选项索引
+let taskBeginTime = 0 // 任务开始时间
+
+const handleScore = (index: number) => {
+  TopicsVal.value[currentIndex.value].score = index + ''
+  showNextBtn.value = true
+  if (isMainWin.value) {
+    scoreIndex.value = index
+    localStorage.setItem('tow-win-auditory-word-img-matching-score', index + '')
+  }
+}
+
+const handleNext = () => {
+  if (TopicsVal.value[currentIndex.value].userAnswer === '') {
+    showTopics.value = true
+    showNextBtn.value = false
+    localStorage.setItem('tow-win-auditory-word-img-matching-show-topics', currentIndex.value + '')
+  } else {
+    let tempCount = TopicsVal.value.filter((item) => item.userAnswer !== '').length
+    if (tempCount === TopicsVal.value.length) {
+      isSubmitting = true
+      localStorage.setItem('tow-win-auditory-word-img-matching-isSubmitting', 'YES')
+    } else {
+      currentIndex.value++
+      showScoreArea.value = false
+      scoreIndex.value = -1
+      handleNext()
+    }
+  }
+}
+
+const handlePlay = () => {
+  localStorage.setItem('two-win-auditory-word-img-matching-item-check', TopicsVal.value[currentIndex.value].correct)
+}
+
+const handleItemClick = (item: string, index: number) => {
+  if (isSubmitting) return // 如果再提交进程中,不响应点击事件
+  if (!isMainWin.value) {
+    VoiceImpRef.value.videoPlay()
+    TopicsVal.value[currentIndex.value].userAnswer = item
+    useClickIndex.value = index
+    showSubmitBtn.value = true
+    localStorage.setItem(
+      'two-win-auditory-word-img-matching-submit-answer',
+      TopicsVal.value[currentIndex.value].userAnswer
+    )
+  }
+}
+
+const handleSubmit = () => {
+  if (TopicsVal.value[currentIndex.value].userAnswer === '') {
+    ElMessage.warning('请先完成当前题目!')
+    return
+  }
+  VoiceImpRef.value.videoPlay(
+    TopicsVal.value[currentIndex.value].userAnswer === TopicsVal.value[currentIndex.value].correct ? 'right' : 'error'
+  )
+  showSubmitBtn.value = false
+  localStorage.setItem('two-win-auditory-word-img-matching-try-over', 'YES')
+}
+
+async function exec() {
+  isMainWin.value = window.location.href.includes('win=main')
+  if (isMainWin.value) {
+    TopicsVal.value = Topics.topics
+      .map((item) => {
+        item.choices = item.choices.sort(() => Math.random() - 0.5)
+        return item
+      })
+      .sort(() => Math.random() - 0.5)
+    localStorage.setItem('two-win-auditory-word-img-matching-init-data', JSON.stringify(TopicsVal.value))
+    setTimeout(() => {
+      showNextBtn.value = true
+    }, 6600)
+  } else {
+    taskBeginTime = Date.now()
+    VoiceImpRef.value.videoPlay(
+      'Speech-Auditory',
+      'static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/1.mp3'
+    )
+  }
+}
+
+onMounted(() => {
+  exec()
+
+  window.addEventListener('storage', (val) => {
+    if (isMainWin.value) {
+      if (val.key === 'two-win-auditory-word-img-matching-submit-answer') {
+        TopicsVal.value[currentIndex.value].userAnswer = val.newValue!
+        localStorage.removeItem('two-win-auditory-word-img-matching-submit-answer')
+      }
+
+      if (val.key === 'two-win-auditory-word-img-matching-try-over') {
+        // showNextBtn.value = true
+        showScoreArea.value = true
+        localStorage.removeItem('two-win-auditory-word-img-matching-try-over')
+      }
+    } else {
+      if (val.key === 'two-win-auditory-word-img-matching-init-data' && isJSON(val.newValue!)) {
+        TopicsVal.value = JSON.parse(val.newValue!) as TopicsType[]
+        localStorage.removeItem('two-win-auditory-word-img-matching-init-data')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-show-topics') {
+        showTopics.value = true
+        currentIndex.value = Number(val.newValue!)
+        useClickIndex.value = -1
+        showScoreArea.value = false
+        scoreIndex.value = -1
+        VoiceImpRef.value.videoPlay(
+          'Speech-Auditory',
+          `static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/${TopicsVal.value[currentIndex.value].correct}.mp3`
+        )
+        localStorage.removeItem('tow-win-auditory-word-img-matching-show-topics')
+      }
+
+      if (val.key === 'two-win-auditory-word-img-matching-item-check') {
+        VoiceImpRef.value.videoPlay(
+          'Speech-Auditory',
+          `static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/${val.newValue}-tips.mp3`
+        )
+        localStorage.removeItem('two-win-auditory-word-img-matching-item-check')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-score') {
+        showScoreArea.value = true
+        handleScore(Number(val.newValue))
+        localStorage.removeItem('tow-win-auditory-word-img-matching-score')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-isSubmitting' && val.newValue === 'YES') {
+        isSubmitting = true
+        emits('gameOver', {
+          min: formatSeconds(Date.now() - taskBeginTime),
+          content: JSON.stringify({
+            question: Topics.question,
+            topics: TopicsVal.value
+          }),
+          score:
+            TopicsVal.value.reduce((accumulator, current) => {
+              return accumulator + Number(current.score)
+            }, 0) + ''
+        })
+        localStorage.removeItem('tow-win-auditory-word-img-matching-isSubmitting')
+      }
+    }
+  })
+})
+</script>
+
+<style scoped lang="scss">
+.df-bg {
+  cursor: pointer;
+  background-image: url('/static/image/cognitiveAbility/SpeechTraining/df-bg.png');
+  background-size: 100% 100%;
+  background-position: center center;
+  background-repeat: repeat;
+  //font-family: 楷体;
+  text-align: center;
+}
+.score-text {
+  text-shadow:
+    0 3px 0 #b2a98f,
+    0 10px 16px rgba(0, 0, 0, 0.15),
+    0 10px 2px rgba(0, 0, 0, 0.1),
+    0 10px 20px rgba(0, 0, 0, 0.1);
+}
+</style>

+ 35 - 0
src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionName/topics.json

@@ -0,0 +1,35 @@
+{
+  "question": "请仔细听播放的词语,请你从下面的选项中选出与该词语匹配的图片",
+  "topics": [
+    {
+      "choices": ["杯子", "小碗"],
+      "correct": "杯子",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["勺子", "筷子", "叉子"],
+      "correct": "筷子",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["笔", "橡皮", "书包", "书"],
+      "correct": "书",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["冰箱", "茶桌", "电视", "衣柜", "床"],
+      "correct": "电视",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["小草", "松树", "玫瑰", "向日葵", "苹果", "花花"],
+      "correct": "松树",
+      "userAnswer": "",
+      "score": ""
+    }
+  ]
+}

+ 299 - 0
src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionParaphraseWords/index.vue

@@ -0,0 +1,299 @@
+<template>
+  <section class="auditory-word-img-matching-container flex-center flex-col wh-full relative">
+    <water-title title="词图匹配" />
+    <div v-if="isMainWin" class="text-[42px] text-[#0F308C]">
+      {{ Topics.question }}
+    </div>
+
+    <div v-if="!isMainWin && showTopics" class="flex-center flex-col text-100px text-[#0F308C]">
+      {{ TopicsVal[currentIndex].correct }}
+    </div>
+    <div class="w-80% h-60% my-30px flex-center flex-col">
+      <template v-if="showTopics">
+        <el-image
+          v-if="isMainWin"
+          src="/static/image/cognitiveAbility/SpeechTraining/Auditory/play.png"
+          fit="contain"
+          class="w-[140px] h-[140px] mb-40px cursor-pointer hover:scale-101"
+          @click="handlePlay"
+        />
+        <div class="w-full flex flex-row justify-around">
+          <div v-for="(item, index) in TopicsVal[currentIndex].choices" :key="index" class="flex flex-col items-center">
+            <div class="w-180px h-180px flex-center cursor-pointer" @click="handleItemClick(item, index)">
+              <el-image
+                :src="`/static/image/cognitiveAbility/SpeechTraining/Visual/${item}.png`"
+                fit="contain"
+                class="w-[180px] h-[180px] cursor-pointer mt-30px rounded-8px"
+              />
+            </div>
+            <el-image
+              :src="`/static/image/cognitiveAbility/SpeechTraining/${useClickIndex === index || item === TopicsVal[currentIndex].userAnswer ? 'Options-right' : 'Options-Blank'}.png`"
+              fit="contain"
+              class="w-[60px] h-[60px] mt-30px"
+            />
+          </div>
+        </div>
+      </template>
+    </div>
+
+    <div v-if="!isMainWin" class="w-[300px] h-[140px]">
+      <el-image
+        v-if="showSubmitBtn"
+        src="/static/image/cognitiveAbility/SpeechTraining/verify-bg.png"
+        fit="contain"
+        class="w-[300px] h-[140px] cursor-pointer hover:scale-101"
+        @click="handleSubmit"
+      />
+    </div>
+
+    <div
+      v-if="isMainWin"
+      class="absolute bottom-[24px] left-10% w-80% h-140px flex flex-row items-center justify-between"
+    >
+      <div class="flex flex-row items-center">
+        <template v-if="showScoreArea">
+          <span class="text-[#0F308C] text-[42px]">请评分:</span>
+          <div
+            v-for="(item, index) in [0, 1, 2]"
+            :key="index"
+            class="w-[140px] flex flex-row items-center cursor-pointer"
+            @click="handleScore(item)"
+          >
+            <el-image
+              :src="`/static/image/cognitiveAbility/SpeechTraining/${
+                index === scoreIndex ? 'Options-right' : 'Options-Blank'
+              }.png`"
+              fit="contain"
+              class="w-[40px] h-[40px] cursor-pointer"
+            />
+            <span class="text-[36px] text-[#0F308C] ml-12px">{{ item }}</span>
+          </div>
+        </template>
+      </div>
+      <el-image
+        v-if="showNextBtn"
+        src="/static/image/cognitiveAbility/SpeechTraining/next.png"
+        fit="contain"
+        class="w-[300px] h-[140px] cursor-pointer hover:scale-101"
+        @click="handleNext()"
+      />
+    </div>
+    <div
+      v-if="!isMainWin && showScoreArea"
+      class="df-bg absolute bottom-[44px] left-10% w-280px h-120px flex flex-row items-end justify-between"
+    >
+      <div class="text-[#2569CA] text-[58px] ml-[158px] pb-[10px] score-text">
+        {{ TopicsVal[currentIndex].score }}<span>分</span>
+      </div>
+    </div>
+
+    <VoiceImp ref="VoiceImpRef" />
+  </section>
+</template>
+
+<script setup lang="ts">
+/*
+ * 组件名: CATAuditoryTrainingWordImgMatching
+ * 组件用途: 常规听康复训练 - 词图匹配
+ * 创建日期: 2024/11/12
+ * 编写者: JutarryWu
+ */
+
+import { formatSeconds, isJSON } from '@/utils'
+
+defineOptions({
+  name: 'CATAuditoryTrainingWordImgMatching',
+  inheritAttrs: false
+})
+
+import Topics from './topics.json'
+
+interface TopicsType {
+  choices: string[]
+  correct: string
+  userAnswer: string
+  score: string
+}
+
+const props = defineProps({})
+const emits = defineEmits(['gameOver'])
+
+const isMainWin = ref(false)
+const showNextBtn = ref(false) // 主屏 - 显示下一题按钮标识
+const showScoreArea = ref(false) // 主屏 - 显示评分标识
+const showSubmitBtn = ref(false) // 副屏 - 显示确定按钮标识
+let isSubmitting = false // 是否正在提交标识
+const showTopics = ref(false) // 显示题目选项标识
+const VoiceImpRef = ref()
+const currentIndex = ref(0) // 当前题目索引
+const TopicsVal = ref<TopicsType[]>([])
+const useClickIndex = ref(-1) // 副屏 - 患者点击的选项索引
+const scoreIndex = ref(-1) // 主屏 - 医生评分选项索引
+let taskBeginTime = 0 // 任务开始时间
+
+const handleScore = (index: number) => {
+  TopicsVal.value[currentIndex.value].score = index + ''
+  showNextBtn.value = true
+  if (isMainWin.value) {
+    scoreIndex.value = index
+    localStorage.setItem('tow-win-auditory-word-img-matching-score', index + '')
+  }
+}
+
+const handleNext = () => {
+  if (TopicsVal.value[currentIndex.value].userAnswer === '') {
+    showTopics.value = true
+    showNextBtn.value = false
+    localStorage.setItem('tow-win-auditory-word-img-matching-show-topics', currentIndex.value + '')
+  } else {
+    let tempCount = TopicsVal.value.filter((item) => item.userAnswer !== '').length
+    if (tempCount === TopicsVal.value.length) {
+      isSubmitting = true
+      localStorage.setItem('tow-win-auditory-word-img-matching-isSubmitting', 'YES')
+    } else {
+      currentIndex.value++
+      showScoreArea.value = false
+      scoreIndex.value = -1
+      handleNext()
+    }
+  }
+}
+
+const handlePlay = () => {
+  localStorage.setItem('two-win-auditory-word-img-matching-item-check', TopicsVal.value[currentIndex.value].correct)
+}
+
+const handleItemClick = (item: string, index: number) => {
+  if (isSubmitting) return // 如果再提交进程中,不响应点击事件
+  if (!isMainWin.value) {
+    VoiceImpRef.value.videoPlay()
+    TopicsVal.value[currentIndex.value].userAnswer = item
+    useClickIndex.value = index
+    showSubmitBtn.value = true
+    localStorage.setItem(
+      'two-win-auditory-word-img-matching-submit-answer',
+      TopicsVal.value[currentIndex.value].userAnswer
+    )
+  }
+}
+
+const handleSubmit = () => {
+  if (TopicsVal.value[currentIndex.value].userAnswer === '') {
+    ElMessage.warning('请先完成当前题目!')
+    return
+  }
+  VoiceImpRef.value.videoPlay(
+    TopicsVal.value[currentIndex.value].userAnswer === TopicsVal.value[currentIndex.value].correct ? 'right' : 'error'
+  )
+  showSubmitBtn.value = false
+  localStorage.setItem('two-win-auditory-word-img-matching-try-over', 'YES')
+}
+
+async function exec() {
+  isMainWin.value = window.location.href.includes('win=main')
+  if (isMainWin.value) {
+    TopicsVal.value = Topics.topics
+      .map((item) => {
+        item.choices = item.choices.sort(() => Math.random() - 0.5)
+        return item
+      })
+      .sort(() => Math.random() - 0.5)
+    localStorage.setItem('two-win-auditory-word-img-matching-init-data', JSON.stringify(TopicsVal.value))
+    setTimeout(() => {
+      showNextBtn.value = true
+    }, 6600)
+  } else {
+    taskBeginTime = Date.now()
+    VoiceImpRef.value.videoPlay(
+      'Speech-Auditory',
+      'static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/1.mp3'
+    )
+  }
+}
+
+onMounted(() => {
+  exec()
+
+  window.addEventListener('storage', (val) => {
+    if (isMainWin.value) {
+      if (val.key === 'two-win-auditory-word-img-matching-submit-answer') {
+        TopicsVal.value[currentIndex.value].userAnswer = val.newValue!
+        localStorage.removeItem('two-win-auditory-word-img-matching-submit-answer')
+      }
+
+      if (val.key === 'two-win-auditory-word-img-matching-try-over') {
+        // showNextBtn.value = true
+        showScoreArea.value = true
+        localStorage.removeItem('two-win-auditory-word-img-matching-try-over')
+      }
+    } else {
+      if (val.key === 'two-win-auditory-word-img-matching-init-data' && isJSON(val.newValue!)) {
+        TopicsVal.value = JSON.parse(val.newValue!) as TopicsType[]
+        localStorage.removeItem('two-win-auditory-word-img-matching-init-data')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-show-topics') {
+        showTopics.value = true
+        currentIndex.value = Number(val.newValue!)
+        useClickIndex.value = -1
+        showScoreArea.value = false
+        scoreIndex.value = -1
+        VoiceImpRef.value.videoPlay(
+          'Speech-Auditory',
+          `static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/${TopicsVal.value[currentIndex.value].correct}.mp3`
+        )
+        localStorage.removeItem('tow-win-auditory-word-img-matching-show-topics')
+      }
+
+      if (val.key === 'two-win-auditory-word-img-matching-item-check') {
+        VoiceImpRef.value.videoPlay(
+          'Speech-Auditory',
+          `static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/${val.newValue}-tips.mp3`
+        )
+        localStorage.removeItem('two-win-auditory-word-img-matching-item-check')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-score') {
+        showScoreArea.value = true
+        handleScore(Number(val.newValue))
+        localStorage.removeItem('tow-win-auditory-word-img-matching-score')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-isSubmitting' && val.newValue === 'YES') {
+        isSubmitting = true
+        emits('gameOver', {
+          min: formatSeconds(Date.now() - taskBeginTime),
+          content: JSON.stringify({
+            question: Topics.question,
+            topics: TopicsVal.value
+          }),
+          score:
+            TopicsVal.value.reduce((accumulator, current) => {
+              return accumulator + Number(current.score)
+            }, 0) + ''
+        })
+        localStorage.removeItem('tow-win-auditory-word-img-matching-isSubmitting')
+      }
+    }
+  })
+})
+</script>
+
+<style scoped lang="scss">
+.df-bg {
+  cursor: pointer;
+  background-image: url('/static/image/cognitiveAbility/SpeechTraining/df-bg.png');
+  background-size: 100% 100%;
+  background-position: center center;
+  background-repeat: repeat;
+  //font-family: 楷体;
+  text-align: center;
+}
+.score-text {
+  text-shadow:
+    0 3px 0 #b2a98f,
+    0 10px 16px rgba(0, 0, 0, 0.15),
+    0 10px 2px rgba(0, 0, 0, 0.1),
+    0 10px 20px rgba(0, 0, 0, 0.1);
+}
+</style>

+ 35 - 0
src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionParaphraseWords/topics.json

@@ -0,0 +1,35 @@
+{
+  "question": "请仔细听播放的词语,请你从下面的选项中选出与该词语匹配的图片",
+  "topics": [
+    {
+      "choices": ["杯子", "小碗"],
+      "correct": "杯子",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["勺子", "筷子", "叉子"],
+      "correct": "筷子",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["笔", "橡皮", "书包", "书"],
+      "correct": "书",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["冰箱", "茶桌", "电视", "衣柜", "床"],
+      "correct": "电视",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["小草", "松树", "玫瑰", "向日葵", "苹果", "花花"],
+      "correct": "松树",
+      "userAnswer": "",
+      "score": ""
+    }
+  ]
+}

+ 299 - 0
src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionRetell/index.vue

@@ -0,0 +1,299 @@
+<template>
+  <section class="auditory-word-img-matching-container flex-center flex-col wh-full relative">
+    <water-title title="词图匹配" />
+    <div v-if="isMainWin" class="text-[42px] text-[#0F308C]">
+      {{ Topics.question }}
+    </div>
+
+    <div v-if="!isMainWin && showTopics" class="flex-center flex-col text-100px text-[#0F308C]">
+      {{ TopicsVal[currentIndex].correct }}
+    </div>
+    <div class="w-80% h-60% my-30px flex-center flex-col">
+      <template v-if="showTopics">
+        <el-image
+          v-if="isMainWin"
+          src="/static/image/cognitiveAbility/SpeechTraining/Auditory/play.png"
+          fit="contain"
+          class="w-[140px] h-[140px] mb-40px cursor-pointer hover:scale-101"
+          @click="handlePlay"
+        />
+        <div class="w-full flex flex-row justify-around">
+          <div v-for="(item, index) in TopicsVal[currentIndex].choices" :key="index" class="flex flex-col items-center">
+            <div class="w-180px h-180px flex-center cursor-pointer" @click="handleItemClick(item, index)">
+              <el-image
+                :src="`/static/image/cognitiveAbility/SpeechTraining/Visual/${item}.png`"
+                fit="contain"
+                class="w-[180px] h-[180px] cursor-pointer mt-30px rounded-8px"
+              />
+            </div>
+            <el-image
+              :src="`/static/image/cognitiveAbility/SpeechTraining/${useClickIndex === index || item === TopicsVal[currentIndex].userAnswer ? 'Options-right' : 'Options-Blank'}.png`"
+              fit="contain"
+              class="w-[60px] h-[60px] mt-30px"
+            />
+          </div>
+        </div>
+      </template>
+    </div>
+
+    <div v-if="!isMainWin" class="w-[300px] h-[140px]">
+      <el-image
+        v-if="showSubmitBtn"
+        src="/static/image/cognitiveAbility/SpeechTraining/verify-bg.png"
+        fit="contain"
+        class="w-[300px] h-[140px] cursor-pointer hover:scale-101"
+        @click="handleSubmit"
+      />
+    </div>
+
+    <div
+      v-if="isMainWin"
+      class="absolute bottom-[24px] left-10% w-80% h-140px flex flex-row items-center justify-between"
+    >
+      <div class="flex flex-row items-center">
+        <template v-if="showScoreArea">
+          <span class="text-[#0F308C] text-[42px]">请评分:</span>
+          <div
+            v-for="(item, index) in [0, 1, 2]"
+            :key="index"
+            class="w-[140px] flex flex-row items-center cursor-pointer"
+            @click="handleScore(item)"
+          >
+            <el-image
+              :src="`/static/image/cognitiveAbility/SpeechTraining/${
+                index === scoreIndex ? 'Options-right' : 'Options-Blank'
+              }.png`"
+              fit="contain"
+              class="w-[40px] h-[40px] cursor-pointer"
+            />
+            <span class="text-[36px] text-[#0F308C] ml-12px">{{ item }}</span>
+          </div>
+        </template>
+      </div>
+      <el-image
+        v-if="showNextBtn"
+        src="/static/image/cognitiveAbility/SpeechTraining/next.png"
+        fit="contain"
+        class="w-[300px] h-[140px] cursor-pointer hover:scale-101"
+        @click="handleNext()"
+      />
+    </div>
+    <div
+      v-if="!isMainWin && showScoreArea"
+      class="df-bg absolute bottom-[44px] left-10% w-280px h-120px flex flex-row items-end justify-between"
+    >
+      <div class="text-[#2569CA] text-[58px] ml-[158px] pb-[10px] score-text">
+        {{ TopicsVal[currentIndex].score }}<span>分</span>
+      </div>
+    </div>
+
+    <VoiceImp ref="VoiceImpRef" />
+  </section>
+</template>
+
+<script setup lang="ts">
+/*
+ * 组件名: CATAuditoryTrainingWordImgMatching
+ * 组件用途: 常规听康复训练 - 词图匹配
+ * 创建日期: 2024/11/12
+ * 编写者: JutarryWu
+ */
+
+import { formatSeconds, isJSON } from '@/utils'
+
+defineOptions({
+  name: 'CATAuditoryTrainingWordImgMatching',
+  inheritAttrs: false
+})
+
+import Topics from './topics.json'
+
+interface TopicsType {
+  choices: string[]
+  correct: string
+  userAnswer: string
+  score: string
+}
+
+const props = defineProps({})
+const emits = defineEmits(['gameOver'])
+
+const isMainWin = ref(false)
+const showNextBtn = ref(false) // 主屏 - 显示下一题按钮标识
+const showScoreArea = ref(false) // 主屏 - 显示评分标识
+const showSubmitBtn = ref(false) // 副屏 - 显示确定按钮标识
+let isSubmitting = false // 是否正在提交标识
+const showTopics = ref(false) // 显示题目选项标识
+const VoiceImpRef = ref()
+const currentIndex = ref(0) // 当前题目索引
+const TopicsVal = ref<TopicsType[]>([])
+const useClickIndex = ref(-1) // 副屏 - 患者点击的选项索引
+const scoreIndex = ref(-1) // 主屏 - 医生评分选项索引
+let taskBeginTime = 0 // 任务开始时间
+
+const handleScore = (index: number) => {
+  TopicsVal.value[currentIndex.value].score = index + ''
+  showNextBtn.value = true
+  if (isMainWin.value) {
+    scoreIndex.value = index
+    localStorage.setItem('tow-win-auditory-word-img-matching-score', index + '')
+  }
+}
+
+const handleNext = () => {
+  if (TopicsVal.value[currentIndex.value].userAnswer === '') {
+    showTopics.value = true
+    showNextBtn.value = false
+    localStorage.setItem('tow-win-auditory-word-img-matching-show-topics', currentIndex.value + '')
+  } else {
+    let tempCount = TopicsVal.value.filter((item) => item.userAnswer !== '').length
+    if (tempCount === TopicsVal.value.length) {
+      isSubmitting = true
+      localStorage.setItem('tow-win-auditory-word-img-matching-isSubmitting', 'YES')
+    } else {
+      currentIndex.value++
+      showScoreArea.value = false
+      scoreIndex.value = -1
+      handleNext()
+    }
+  }
+}
+
+const handlePlay = () => {
+  localStorage.setItem('two-win-auditory-word-img-matching-item-check', TopicsVal.value[currentIndex.value].correct)
+}
+
+const handleItemClick = (item: string, index: number) => {
+  if (isSubmitting) return // 如果再提交进程中,不响应点击事件
+  if (!isMainWin.value) {
+    VoiceImpRef.value.videoPlay()
+    TopicsVal.value[currentIndex.value].userAnswer = item
+    useClickIndex.value = index
+    showSubmitBtn.value = true
+    localStorage.setItem(
+      'two-win-auditory-word-img-matching-submit-answer',
+      TopicsVal.value[currentIndex.value].userAnswer
+    )
+  }
+}
+
+const handleSubmit = () => {
+  if (TopicsVal.value[currentIndex.value].userAnswer === '') {
+    ElMessage.warning('请先完成当前题目!')
+    return
+  }
+  VoiceImpRef.value.videoPlay(
+    TopicsVal.value[currentIndex.value].userAnswer === TopicsVal.value[currentIndex.value].correct ? 'right' : 'error'
+  )
+  showSubmitBtn.value = false
+  localStorage.setItem('two-win-auditory-word-img-matching-try-over', 'YES')
+}
+
+async function exec() {
+  isMainWin.value = window.location.href.includes('win=main')
+  if (isMainWin.value) {
+    TopicsVal.value = Topics.topics
+      .map((item) => {
+        item.choices = item.choices.sort(() => Math.random() - 0.5)
+        return item
+      })
+      .sort(() => Math.random() - 0.5)
+    localStorage.setItem('two-win-auditory-word-img-matching-init-data', JSON.stringify(TopicsVal.value))
+    setTimeout(() => {
+      showNextBtn.value = true
+    }, 6600)
+  } else {
+    taskBeginTime = Date.now()
+    VoiceImpRef.value.videoPlay(
+      'Speech-Auditory',
+      'static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/1.mp3'
+    )
+  }
+}
+
+onMounted(() => {
+  exec()
+
+  window.addEventListener('storage', (val) => {
+    if (isMainWin.value) {
+      if (val.key === 'two-win-auditory-word-img-matching-submit-answer') {
+        TopicsVal.value[currentIndex.value].userAnswer = val.newValue!
+        localStorage.removeItem('two-win-auditory-word-img-matching-submit-answer')
+      }
+
+      if (val.key === 'two-win-auditory-word-img-matching-try-over') {
+        // showNextBtn.value = true
+        showScoreArea.value = true
+        localStorage.removeItem('two-win-auditory-word-img-matching-try-over')
+      }
+    } else {
+      if (val.key === 'two-win-auditory-word-img-matching-init-data' && isJSON(val.newValue!)) {
+        TopicsVal.value = JSON.parse(val.newValue!) as TopicsType[]
+        localStorage.removeItem('two-win-auditory-word-img-matching-init-data')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-show-topics') {
+        showTopics.value = true
+        currentIndex.value = Number(val.newValue!)
+        useClickIndex.value = -1
+        showScoreArea.value = false
+        scoreIndex.value = -1
+        VoiceImpRef.value.videoPlay(
+          'Speech-Auditory',
+          `static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/${TopicsVal.value[currentIndex.value].correct}.mp3`
+        )
+        localStorage.removeItem('tow-win-auditory-word-img-matching-show-topics')
+      }
+
+      if (val.key === 'two-win-auditory-word-img-matching-item-check') {
+        VoiceImpRef.value.videoPlay(
+          'Speech-Auditory',
+          `static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/${val.newValue}-tips.mp3`
+        )
+        localStorage.removeItem('two-win-auditory-word-img-matching-item-check')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-score') {
+        showScoreArea.value = true
+        handleScore(Number(val.newValue))
+        localStorage.removeItem('tow-win-auditory-word-img-matching-score')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-isSubmitting' && val.newValue === 'YES') {
+        isSubmitting = true
+        emits('gameOver', {
+          min: formatSeconds(Date.now() - taskBeginTime),
+          content: JSON.stringify({
+            question: Topics.question,
+            topics: TopicsVal.value
+          }),
+          score:
+            TopicsVal.value.reduce((accumulator, current) => {
+              return accumulator + Number(current.score)
+            }, 0) + ''
+        })
+        localStorage.removeItem('tow-win-auditory-word-img-matching-isSubmitting')
+      }
+    }
+  })
+})
+</script>
+
+<style scoped lang="scss">
+.df-bg {
+  cursor: pointer;
+  background-image: url('/static/image/cognitiveAbility/SpeechTraining/df-bg.png');
+  background-size: 100% 100%;
+  background-position: center center;
+  background-repeat: repeat;
+  //font-family: 楷体;
+  text-align: center;
+}
+.score-text {
+  text-shadow:
+    0 3px 0 #b2a98f,
+    0 10px 16px rgba(0, 0, 0, 0.15),
+    0 10px 2px rgba(0, 0, 0, 0.1),
+    0 10px 20px rgba(0, 0, 0, 0.1);
+}
+</style>

+ 35 - 0
src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionRetell/topics.json

@@ -0,0 +1,35 @@
+{
+  "question": "请仔细听播放的词语,请你从下面的选项中选出与该词语匹配的图片",
+  "topics": [
+    {
+      "choices": ["杯子", "小碗"],
+      "correct": "杯子",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["勺子", "筷子", "叉子"],
+      "correct": "筷子",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["笔", "橡皮", "书包", "书"],
+      "correct": "书",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["冰箱", "茶桌", "电视", "衣柜", "床"],
+      "correct": "电视",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["小草", "松树", "玫瑰", "向日葵", "苹果", "花花"],
+      "correct": "松树",
+      "userAnswer": "",
+      "score": ""
+    }
+  ]
+}

+ 299 - 0
src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionRetellingSeries/index.vue

@@ -0,0 +1,299 @@
+<template>
+  <section class="auditory-word-img-matching-container flex-center flex-col wh-full relative">
+    <water-title title="词图匹配" />
+    <div v-if="isMainWin" class="text-[42px] text-[#0F308C]">
+      {{ Topics.question }}
+    </div>
+
+    <div v-if="!isMainWin && showTopics" class="flex-center flex-col text-100px text-[#0F308C]">
+      {{ TopicsVal[currentIndex].correct }}
+    </div>
+    <div class="w-80% h-60% my-30px flex-center flex-col">
+      <template v-if="showTopics">
+        <el-image
+          v-if="isMainWin"
+          src="/static/image/cognitiveAbility/SpeechTraining/Auditory/play.png"
+          fit="contain"
+          class="w-[140px] h-[140px] mb-40px cursor-pointer hover:scale-101"
+          @click="handlePlay"
+        />
+        <div class="w-full flex flex-row justify-around">
+          <div v-for="(item, index) in TopicsVal[currentIndex].choices" :key="index" class="flex flex-col items-center">
+            <div class="w-180px h-180px flex-center cursor-pointer" @click="handleItemClick(item, index)">
+              <el-image
+                :src="`/static/image/cognitiveAbility/SpeechTraining/Visual/${item}.png`"
+                fit="contain"
+                class="w-[180px] h-[180px] cursor-pointer mt-30px rounded-8px"
+              />
+            </div>
+            <el-image
+              :src="`/static/image/cognitiveAbility/SpeechTraining/${useClickIndex === index || item === TopicsVal[currentIndex].userAnswer ? 'Options-right' : 'Options-Blank'}.png`"
+              fit="contain"
+              class="w-[60px] h-[60px] mt-30px"
+            />
+          </div>
+        </div>
+      </template>
+    </div>
+
+    <div v-if="!isMainWin" class="w-[300px] h-[140px]">
+      <el-image
+        v-if="showSubmitBtn"
+        src="/static/image/cognitiveAbility/SpeechTraining/verify-bg.png"
+        fit="contain"
+        class="w-[300px] h-[140px] cursor-pointer hover:scale-101"
+        @click="handleSubmit"
+      />
+    </div>
+
+    <div
+      v-if="isMainWin"
+      class="absolute bottom-[24px] left-10% w-80% h-140px flex flex-row items-center justify-between"
+    >
+      <div class="flex flex-row items-center">
+        <template v-if="showScoreArea">
+          <span class="text-[#0F308C] text-[42px]">请评分:</span>
+          <div
+            v-for="(item, index) in [0, 1, 2]"
+            :key="index"
+            class="w-[140px] flex flex-row items-center cursor-pointer"
+            @click="handleScore(item)"
+          >
+            <el-image
+              :src="`/static/image/cognitiveAbility/SpeechTraining/${
+                index === scoreIndex ? 'Options-right' : 'Options-Blank'
+              }.png`"
+              fit="contain"
+              class="w-[40px] h-[40px] cursor-pointer"
+            />
+            <span class="text-[36px] text-[#0F308C] ml-12px">{{ item }}</span>
+          </div>
+        </template>
+      </div>
+      <el-image
+        v-if="showNextBtn"
+        src="/static/image/cognitiveAbility/SpeechTraining/next.png"
+        fit="contain"
+        class="w-[300px] h-[140px] cursor-pointer hover:scale-101"
+        @click="handleNext()"
+      />
+    </div>
+    <div
+      v-if="!isMainWin && showScoreArea"
+      class="df-bg absolute bottom-[44px] left-10% w-280px h-120px flex flex-row items-end justify-between"
+    >
+      <div class="text-[#2569CA] text-[58px] ml-[158px] pb-[10px] score-text">
+        {{ TopicsVal[currentIndex].score }}<span>分</span>
+      </div>
+    </div>
+
+    <VoiceImp ref="VoiceImpRef" />
+  </section>
+</template>
+
+<script setup lang="ts">
+/*
+ * 组件名: CATAuditoryTrainingWordImgMatching
+ * 组件用途: 常规听康复训练 - 词图匹配
+ * 创建日期: 2024/11/12
+ * 编写者: JutarryWu
+ */
+
+import { formatSeconds, isJSON } from '@/utils'
+
+defineOptions({
+  name: 'CATAuditoryTrainingWordImgMatching',
+  inheritAttrs: false
+})
+
+import Topics from './topics.json'
+
+interface TopicsType {
+  choices: string[]
+  correct: string
+  userAnswer: string
+  score: string
+}
+
+const props = defineProps({})
+const emits = defineEmits(['gameOver'])
+
+const isMainWin = ref(false)
+const showNextBtn = ref(false) // 主屏 - 显示下一题按钮标识
+const showScoreArea = ref(false) // 主屏 - 显示评分标识
+const showSubmitBtn = ref(false) // 副屏 - 显示确定按钮标识
+let isSubmitting = false // 是否正在提交标识
+const showTopics = ref(false) // 显示题目选项标识
+const VoiceImpRef = ref()
+const currentIndex = ref(0) // 当前题目索引
+const TopicsVal = ref<TopicsType[]>([])
+const useClickIndex = ref(-1) // 副屏 - 患者点击的选项索引
+const scoreIndex = ref(-1) // 主屏 - 医生评分选项索引
+let taskBeginTime = 0 // 任务开始时间
+
+const handleScore = (index: number) => {
+  TopicsVal.value[currentIndex.value].score = index + ''
+  showNextBtn.value = true
+  if (isMainWin.value) {
+    scoreIndex.value = index
+    localStorage.setItem('tow-win-auditory-word-img-matching-score', index + '')
+  }
+}
+
+const handleNext = () => {
+  if (TopicsVal.value[currentIndex.value].userAnswer === '') {
+    showTopics.value = true
+    showNextBtn.value = false
+    localStorage.setItem('tow-win-auditory-word-img-matching-show-topics', currentIndex.value + '')
+  } else {
+    let tempCount = TopicsVal.value.filter((item) => item.userAnswer !== '').length
+    if (tempCount === TopicsVal.value.length) {
+      isSubmitting = true
+      localStorage.setItem('tow-win-auditory-word-img-matching-isSubmitting', 'YES')
+    } else {
+      currentIndex.value++
+      showScoreArea.value = false
+      scoreIndex.value = -1
+      handleNext()
+    }
+  }
+}
+
+const handlePlay = () => {
+  localStorage.setItem('two-win-auditory-word-img-matching-item-check', TopicsVal.value[currentIndex.value].correct)
+}
+
+const handleItemClick = (item: string, index: number) => {
+  if (isSubmitting) return // 如果再提交进程中,不响应点击事件
+  if (!isMainWin.value) {
+    VoiceImpRef.value.videoPlay()
+    TopicsVal.value[currentIndex.value].userAnswer = item
+    useClickIndex.value = index
+    showSubmitBtn.value = true
+    localStorage.setItem(
+      'two-win-auditory-word-img-matching-submit-answer',
+      TopicsVal.value[currentIndex.value].userAnswer
+    )
+  }
+}
+
+const handleSubmit = () => {
+  if (TopicsVal.value[currentIndex.value].userAnswer === '') {
+    ElMessage.warning('请先完成当前题目!')
+    return
+  }
+  VoiceImpRef.value.videoPlay(
+    TopicsVal.value[currentIndex.value].userAnswer === TopicsVal.value[currentIndex.value].correct ? 'right' : 'error'
+  )
+  showSubmitBtn.value = false
+  localStorage.setItem('two-win-auditory-word-img-matching-try-over', 'YES')
+}
+
+async function exec() {
+  isMainWin.value = window.location.href.includes('win=main')
+  if (isMainWin.value) {
+    TopicsVal.value = Topics.topics
+      .map((item) => {
+        item.choices = item.choices.sort(() => Math.random() - 0.5)
+        return item
+      })
+      .sort(() => Math.random() - 0.5)
+    localStorage.setItem('two-win-auditory-word-img-matching-init-data', JSON.stringify(TopicsVal.value))
+    setTimeout(() => {
+      showNextBtn.value = true
+    }, 6600)
+  } else {
+    taskBeginTime = Date.now()
+    VoiceImpRef.value.videoPlay(
+      'Speech-Auditory',
+      'static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/1.mp3'
+    )
+  }
+}
+
+onMounted(() => {
+  exec()
+
+  window.addEventListener('storage', (val) => {
+    if (isMainWin.value) {
+      if (val.key === 'two-win-auditory-word-img-matching-submit-answer') {
+        TopicsVal.value[currentIndex.value].userAnswer = val.newValue!
+        localStorage.removeItem('two-win-auditory-word-img-matching-submit-answer')
+      }
+
+      if (val.key === 'two-win-auditory-word-img-matching-try-over') {
+        // showNextBtn.value = true
+        showScoreArea.value = true
+        localStorage.removeItem('two-win-auditory-word-img-matching-try-over')
+      }
+    } else {
+      if (val.key === 'two-win-auditory-word-img-matching-init-data' && isJSON(val.newValue!)) {
+        TopicsVal.value = JSON.parse(val.newValue!) as TopicsType[]
+        localStorage.removeItem('two-win-auditory-word-img-matching-init-data')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-show-topics') {
+        showTopics.value = true
+        currentIndex.value = Number(val.newValue!)
+        useClickIndex.value = -1
+        showScoreArea.value = false
+        scoreIndex.value = -1
+        VoiceImpRef.value.videoPlay(
+          'Speech-Auditory',
+          `static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/${TopicsVal.value[currentIndex.value].correct}.mp3`
+        )
+        localStorage.removeItem('tow-win-auditory-word-img-matching-show-topics')
+      }
+
+      if (val.key === 'two-win-auditory-word-img-matching-item-check') {
+        VoiceImpRef.value.videoPlay(
+          'Speech-Auditory',
+          `static/voice/cognitiveAbility/SpeechTraining/Auditory/WordImgMatching/${val.newValue}-tips.mp3`
+        )
+        localStorage.removeItem('two-win-auditory-word-img-matching-item-check')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-score') {
+        showScoreArea.value = true
+        handleScore(Number(val.newValue))
+        localStorage.removeItem('tow-win-auditory-word-img-matching-score')
+      }
+
+      if (val.key === 'tow-win-auditory-word-img-matching-isSubmitting' && val.newValue === 'YES') {
+        isSubmitting = true
+        emits('gameOver', {
+          min: formatSeconds(Date.now() - taskBeginTime),
+          content: JSON.stringify({
+            question: Topics.question,
+            topics: TopicsVal.value
+          }),
+          score:
+            TopicsVal.value.reduce((accumulator, current) => {
+              return accumulator + Number(current.score)
+            }, 0) + ''
+        })
+        localStorage.removeItem('tow-win-auditory-word-img-matching-isSubmitting')
+      }
+    }
+  })
+})
+</script>
+
+<style scoped lang="scss">
+.df-bg {
+  cursor: pointer;
+  background-image: url('/static/image/cognitiveAbility/SpeechTraining/df-bg.png');
+  background-size: 100% 100%;
+  background-position: center center;
+  background-repeat: repeat;
+  //font-family: 楷体;
+  text-align: center;
+}
+.score-text {
+  text-shadow:
+    0 3px 0 #b2a98f,
+    0 10px 16px rgba(0, 0, 0, 0.15),
+    0 10px 2px rgba(0, 0, 0, 0.1),
+    0 10px 20px rgba(0, 0, 0, 0.1);
+}
+</style>

+ 35 - 0
src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/OralExpressionRetellingSeries/topics.json

@@ -0,0 +1,35 @@
+{
+  "question": "请仔细听播放的词语,请你从下面的选项中选出与该词语匹配的图片",
+  "topics": [
+    {
+      "choices": ["杯子", "小碗"],
+      "correct": "杯子",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["勺子", "筷子", "叉子"],
+      "correct": "筷子",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["笔", "橡皮", "书包", "书"],
+      "correct": "书",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["冰箱", "茶桌", "电视", "衣柜", "床"],
+      "correct": "电视",
+      "userAnswer": "",
+      "score": ""
+    },
+    {
+      "choices": ["小草", "松树", "玫瑰", "向日葵", "苹果", "花花"],
+      "correct": "松树",
+      "userAnswer": "",
+      "score": ""
+    }
+  ]
+}

+ 209 - 73
src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskOralExpression/index.vue

@@ -17,51 +17,78 @@
       v-else
       class="absolute top-[50%] left-[50%] translate-[-50%] w-[1600px] h-[960px] rounded-[8px] bg-[#ffffffff] shadow-lg flex-center flex-col"
     >
-      <!--模式选择-->
-      <div v-if="modeSelect === -1" class="absolute wh-full top-0 left-0 bg-[#ffffff9f] z-3999 flex-center">
-        <div class="choice-bg w-800px h-400px flex-center flex-col">
-          <span class="inline-block text-45px text-black mb-36px mt-28px">请您选择任务模式:</span>
-          <div class="flex flex-row w-76% justify-between mt-18px">
-            <el-image
-              src="/static/image/cognitiveAbility/SpeechTraining/tips-one.png"
-              fit="contain"
-              class="w-[280px] h-[90px] cursor-pointer"
-              :class="{ 'scale-113': modeActive === 0 }"
-              @click="modeSelectFn(0, isMainWin ? 1 : 0)"
-            />
-            <el-image
-              src="/static/image/cognitiveAbility/SpeechTraining/tips-all.png"
-              fit="contain"
-              class="w-[280px] h-[90px] cursor-pointer"
-              :class="{ 'scale-113': modeActive === 1 }"
-              @click="modeSelectFn(1, isMainWin ? 1 : 0)"
-            />
+      <template v-if="taskBegin">
+        <!-- 语音辨识 -->
+        <OralExpressionName
+          v-if="checkItems[0].active && checkItems[0].isTraining && !checkItems[0].isFinish"
+          @game-over="childTaskOver"
+        />
+
+        <!-- 词图匹配 -->
+        <OralExpressionParaphraseWords
+          v-if="checkItems[1].active && checkItems[1].isTraining && !checkItems[1].isFinish"
+          @game-over="childTaskOver"
+        />
+
+        <!-- 句图匹配 -->
+        <OralExpressionRetell
+          v-if="checkItems[2].active && checkItems[2].isTraining && !checkItems[2].isFinish"
+          @game-over="childTaskOver"
+        />
+
+        <!-- 是非反应 -->
+        <OralExpressionRetellingSeries
+          v-if="checkItems[3].active && checkItems[3].isTraining && !checkItems[3].isFinish"
+          @game-over="childTaskOver"
+        />
+      </template>
+      <template v-else>
+        <!--模式选择-->
+        <div v-if="modeSelect === -1" class="absolute wh-full top-0 left-0 bg-[#ffffff9f] z-3999 flex-center">
+          <div class="choice-bg w-800px h-400px flex-center flex-col">
+            <span class="inline-block text-45px text-black mb-36px mt-28px">请您选择任务模式:</span>
+            <div class="flex flex-row w-76% justify-between mt-18px">
+              <el-image
+                src="/static/image/cognitiveAbility/SpeechTraining/tips-one.png"
+                fit="contain"
+                class="w-[280px] h-[90px] cursor-pointer"
+                :class="{ 'scale-113': modeActive === 0 }"
+                @click="modeSelectFn(0, isMainWin ? 1 : 0)"
+              />
+              <el-image
+                src="/static/image/cognitiveAbility/SpeechTraining/tips-all.png"
+                fit="contain"
+                class="w-[280px] h-[90px] cursor-pointer"
+                :class="{ 'scale-113': modeActive === 1 }"
+                @click="modeSelectFn(1, isMainWin ? 1 : 0)"
+              />
+            </div>
           </div>
         </div>
-      </div>
-      <el-image
-        src="/static/image/cognitiveAbility/SpeechTraining/OralExpression/bg-title.png"
-        fit="contain"
-        class="w-[1120px] h-[160px]"
-      />
-      <div class="w-[1120px] mt-100px flex flex-wrap flex-row justify-between">
-        <div
-          v-for="(item, index) in checkItems"
-          :key="index"
-          class="w-[300px] h-[70px] flex-center fw-700 text-[34px] color-[#ffffff] mb-[18px] cursor-pointer hover:scale-102"
-          :class="[item.active ? 'active' : 'normal']"
-          @click="checkItemFn(item, isMainWin ? 1 : 0)"
-        >
-          {{ item.name }}
+        <el-image
+          src="/static/image/cognitiveAbility/SpeechTraining/Auditory/bg-title.png"
+          fit="contain"
+          class="w-[1120px] h-[160px]"
+        />
+        <div class="w-[1120px] mt-100px flex flex-wrap flex-row justify-between">
+          <div
+            v-for="(item, index) in checkItems"
+            :key="index"
+            class="w-[300px] h-[70px] flex-center fw-700 text-[34px] color-[#ffffff] mb-[18px] cursor-pointer hover:scale-102"
+            :class="[item.active ? 'active' : 'normal']"
+            @click="checkItemFn(item, isMainWin ? 1 : 0)"
+          >
+            {{ item.name }}
+          </div>
         </div>
-      </div>
-      <el-image
-        v-if="!isMainWin"
-        src="/static/image/cognitiveAbility/SpeechTraining/start-bg.png"
-        fit="contain"
-        class="w-[280px] h-[90px] mt-140px cursor-pointer hover:scale-101"
-        @click="startTask"
-      />
+        <el-image
+          v-if="!isMainWin"
+          src="/static/image/cognitiveAbility/SpeechTraining/start-bg.png"
+          fit="contain"
+          class="w-[280px] h-[90px] mt-140px cursor-pointer hover:scale-101"
+          @click="startTask"
+        />
+      </template>
     </div>
 
     <VoiceImp ref="VoiceImpRef" />
@@ -70,25 +97,29 @@
 
 <script setup lang="ts">
 /*
- * 组件名: CognitiveAbilityTaskOralExpressionTraining
- * 组件用途: 常规康复训练 - 口语练习
+ * 组件名: CognitiveAbilityTaskAuditoryTraining
+ * 组件用途: 常规康复训练
  * 创建日期: 2024/7/16
  * 编写者: JutarryWu
  */
-import EvaluationSTRecordInfoAPI from '@/api/tester/evaluation/stRecord'
+import SpeechTrainingAPI, { SpeechTrainingVO } from '@/api/tester/evaluation/speechTraining'
 import { useThrottleFn } from '@vueuse/core'
 import { useUserStore } from '@/store'
 import { isJSON } from '@/utils'
+import CATAuditoryTrainingShortStory from '@/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/CATAuditoryTrainingShortStory/index.vue'
+import CATAuditoryTrainingExecuteInstructions from '@/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskAuditoryTraining/CATAuditoryTrainingExecuteInstructions/index.vue'
 interface CheckItem {
-  key: string
+  key: number
   name: string
-  active: boolean
+  active: boolean // 是否选中
+  isTraining: boolean // 是否为当前训练
+  isFinish: boolean // 是否完成
 }
 
 const isMainWin = ref(false)
 
 defineOptions({
-  name: 'CognitiveAbilityTaskOralExpressionTraining',
+  name: 'CognitiveAbilityTaskAuditoryTraining',
   inheritAttrs: false
 })
 
@@ -111,21 +142,23 @@ const emits = defineEmits(['showResult', 'close'])
 const userStore = useUserStore()
 const showCountDown = ref(false)
 const countDownBegin = ref(false)
+const taskBegin = ref(false) // 子任务是否开始标识
 const countDownStr = ref('测试马上开始!')
 const loading = ref(false)
 const VoiceImpRef = ref()
 
 const modeSelect = ref(-1) // -1: 未选择,0: 单流程模式,1: 全流程模式
 const modeActive = ref(-1) // -1: 未选择,0: 单流程模式,1: 全流程模式
+let modeCurrentIndex = -1 // 当前子任务索引
 
 const dialogVisible = ref(false) // 学历弹窗
 const checkItems = ref<CheckItem[]>([
-  { key: '1', name: '语音辨识', active: false },
-  { key: '2', name: '词图匹配', active: false },
-  { key: '3', name: '句图匹配', active: false },
-  { key: '4', name: '是非反应', active: false },
-  { key: '5', name: '执行指令', active: false },
-  { key: '6', name: '听短文回答故事', active: false }
+  { key: 1, name: '语音辨识', active: false, isTraining: false, isFinish: false },
+  { key: 2, name: '词图匹配', active: false, isTraining: false, isFinish: false },
+  { key: 3, name: '句图匹配', active: false, isTraining: false, isFinish: false },
+  { key: 4, name: '是非反应', active: false, isTraining: false, isFinish: false },
+  { key: 5, name: '执行指令', active: false, isTraining: false, isFinish: false },
+  { key: 6, name: '短文理解', active: false, isTraining: false, isFinish: false }
 ])
 
 const closeDialog = () => {
@@ -153,12 +186,12 @@ const checkItemFn = useThrottleFn((item: CheckItem, flag: number = 0) => {
     let tempIndex = -1
     checkItems.value.forEach((item2, index) => {
       item2.active = false
-      if (item2.key === item.key) tempIndex = index
+      if (item2.key === item.key) modeCurrentIndex = index
     })
-    checkItems.value[tempIndex].active = true
+    checkItems.value[modeCurrentIndex].active = true
     if (!isMainWin.value) {
       VoiceImpRef.value.videoPlay()
-      localStorage.setItem('two-win-OralExpression-item-check', JSON.stringify(item))
+      localStorage.setItem('two-win-auditory-item-check', JSON.stringify(item))
     }
   }
 })
@@ -172,12 +205,13 @@ const modeSelectFn = useThrottleFn((mode: number, flag: number = 0) => {
   if (modeActive.value !== -1 || flag === 1) return
   if (!isMainWin.value) {
     VoiceImpRef.value.videoPlay('right')
-    localStorage.setItem('two-win-OralExpression-mode-select', mode + '')
+    localStorage.setItem('two-win-auditory-mode-select', mode + '')
   }
   modeActive.value = mode
   setTimeout(() => {
     modeSelect.value = mode
     if (mode === 1) {
+      modeCurrentIndex = 0
       checkItems.value.forEach((item) => {
         item.active = true
       })
@@ -186,14 +220,67 @@ const modeSelectFn = useThrottleFn((mode: number, flag: number = 0) => {
 })
 
 const startTask = useThrottleFn(() => {
+  if (modeSelect.value === 0) {
+    checkItems.value[modeCurrentIndex].isTraining = true
+  } else {
+    let tempIndex = checkItems.value.findIndex((item: CheckItem) => item.active && !item.isTraining && !item.isFinish)
+    checkItems.value[tempIndex].isTraining = true
+  }
+  taskBegin.value = true
   if (!isMainWin.value) {
-    // TODO 开始任务
+    localStorage.setItem('two-win-auditory-task-begin', 'YES')
   }
 })
 
+let tempRecordId: string = '' // 第一个子任务提交的时候没有值,传'', 提交成功后的返回值既是recordId
+const childTaskOver = (taskData: SpeechTrainingVO) => {
+  if (!isMainWin.value) {
+    if (checkItems.value[modeCurrentIndex].isFinish) {
+      modeCurrentIndex++
+      startTask()
+    } else {
+      SpeechTrainingAPI.add({
+        ...{
+          flag: props.flag,
+          taskId: props.taskId,
+          patId: userStore.user.id,
+          parentId: props.parentId,
+          questionName: checkItems.value[modeCurrentIndex].name,
+          questionNo: checkItems.value[modeCurrentIndex].key + '',
+          recordId: tempRecordId,
+          type: modeSelect.value + ''
+        },
+        ...taskData
+      }).then((data) => {
+        checkItems.value[modeCurrentIndex].isFinish = true
+        localStorage.setItem('tow-win-auditory-change-status', JSON.stringify(taskData))
+        if (modeSelect.value === 0) {
+          ElMessage.success('提交成功!')
+          emits('showResult', data)
+
+          localStorage.setItem('tow-win-auditory-show-result', data)
+        } else {
+          if (modeCurrentIndex === checkItems.value.length - 1) {
+            ElMessage.success('提交成功!')
+            emits('showResult', data)
+
+            localStorage.setItem('tow-win-auditory-show-result', data)
+          } else {
+            tempRecordId = data
+            childTaskOver(taskData)
+          }
+        }
+      })
+    }
+  }
+}
+
 const countDownEnd = () => {
   countDownBegin.value = false
   showCountDown.value = false
+  if (!isMainWin.value) {
+    VoiceImpRef.value.videoPlay('Speech-Auditory', 'static/voice/cognitiveAbility/SpeechTraining/Auditory/1.mp3')
+  }
 }
 
 async function exec() {
@@ -212,45 +299,94 @@ onMounted(() => {
 
   window.addEventListener('storage', (val) => {
     if (isMainWin.value) {
-      console.log(val.key)
-      if (val.key === 'two-win-OralExpression-mode-select') {
+      if (val.key === 'two-win-auditory-mode-select') {
         modeSelectFn(Number(val.newValue))
-        localStorage.removeItem('two-win-OralExpression-mode-select')
+        localStorage.removeItem('two-win-auditory-mode-select')
       }
-      if (val.key === 'two-win-OralExpression-item-check' && isJSON(val.newValue!)) {
+      if (val.key === 'two-win-auditory-item-check' && isJSON(val.newValue!)) {
         let tempVal = JSON.parse(val.newValue!) as CheckItem
         checkItemFn(tempVal)
-        localStorage.removeItem('two-win-OralExpression-item-check')
+        localStorage.removeItem('two-win-auditory-item-check')
+      }
+      if (val.key === 'two-win-auditory-task-begin' && val.newValue === 'YES') {
+        startTask()
+        localStorage.removeItem('two-win-auditory-task-begin')
+      }
+
+      if (val.key === 'tow-win-auditory-show-result') {
+        ElMessage.success('提交成功!')
+        emits('showResult', val.newValue!)
+        localStorage.removeItem('tow-win-auditory-show-result')
+      }
+
+      if (val.key === 'tow-win-auditory-change-status') {
+        checkItems.value[modeCurrentIndex].isFinish = true
+        childTaskOver(JSON.parse(val.newValue!))
+        localStorage.removeItem('tow-win-auditory-change-status')
       }
     } else {
-      console.log('')
+      // console.log('')
     }
   })
 })
 </script>
 
 <style scoped lang="scss">
+//.boston-container {
+//  background: url('/static/image/cognitiveAbility/SpeechTraining/Auditory/bg.png') no-repeat 0 0 / 100% 100% border-box
+//    fixed;
+//
+//  .el-button + .el-button {
+//    margin-left: 0;
+//  }
+//
+//  .active {
+//    background: url('/static/image/cognitiveAbility/SpeechTraining/item-active.png') no-repeat 0 0 / 100% 100%
+//      border-box border-box fixed;
+//  }
+//
+//  .normal {
+//    background: url('/static/image/cognitiveAbility/SpeechTraining/item.png') no-repeat 0 0 / 100% 100% border-box
+//      border-box fixed;
+//  }
+//
+//  .choice-bg {
+//    background: url('/static/image/cognitiveAbility/SpeechTraining/tips-bg.png') no-repeat 0 0 / 100% 100% border-box
+//      border-box fixed;
+//  }
+//}
 .boston-container {
-  background: url('/static/image/cognitiveAbility/SpeechTraining/OralExpression/bg.png') no-repeat 0 0 / 100% 100%
-    border-box fixed;
+  //background: url('/static/image/cognitiveAbility/SpeechTraining/Visual/bg.png') no-repeat 0 0 / 100% 100% border-box
+  //  fixed;
+  background-image: url('/static/image/cognitiveAbility/SpeechTraining/Visual/bg.png');
+  background-size: 100% 100%;
+  background-position: center center;
 
   .el-button + .el-button {
     margin-left: 0;
   }
 
   .active {
-    background: url('/static/image/cognitiveAbility/SpeechTraining/item-active.png') no-repeat 0 0 / 100% 100%
-      border-box border-box fixed;
+    //background: url('/static/image/cognitiveAbility/SpeechTraining/item-active.png') no-repeat 0 0 / 100% 100%
+    background-image: url('/static/image/cognitiveAbility/SpeechTraining/item-active.png');
+    background-size: 100% 100%;
+    background-position: center center;
   }
 
   .normal {
-    background: url('/static/image/cognitiveAbility/SpeechTraining/item.png') no-repeat 0 0 / 100% 100% border-box
-      border-box fixed;
+    //background: url('/static/image/cognitiveAbility/SpeechTraining/item.png') no-repeat 0 0 / 100% 100% border-box
+    //  border-box fixed;
+    background-image: url('/static/image/cognitiveAbility/SpeechTraining/item.png');
+    background-size: 100% 100%;
+    background-position: center center;
   }
 
   .choice-bg {
-    background: url('/static/image/cognitiveAbility/SpeechTraining/tips-bg.png') no-repeat 0 0 / 100% 100% border-box
-      border-box fixed;
+    //background: url('/static/image/cognitiveAbility/SpeechTraining/tips-bg.png') no-repeat 0 0 / 100% 100% border-box
+    //  border-box fixed;
+    background-image: url('/static/image/cognitiveAbility/SpeechTraining/tips-bg.png');
+    background-size: 100% 100%;
+    background-position: center center;
   }
 }
 </style>

+ 1 - 0
src/views/tester/components/RehabilitationEvaluation/CognitiveAbilityTask/CognitiveAbilityTaskVisualTraining/index.vue

@@ -333,6 +333,7 @@ onMounted(() => {
       if (val.key === 'tow-win-auditory-change-status') {
         checkItems.value[modeCurrentIndex].isFinish = true
         childTaskOver(JSON.parse(val.newValue!))
+        localStorage.removeItem('tow-win-auditory-change-status')
       }
     } else {
       // console.log('')