From 7be3eca61e20b01869a0ce6b6615d3f4c1596996 Mon Sep 17 00:00:00 2001 From: Wxp Date: Sun, 24 Aug 2025 18:20:16 +0800 Subject: [PATCH] =?UTF-8?q?style:=20=E8=AF=BE=E4=BB=B6=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/images/profile/default-file.png | Bin 0 -> 10140 bytes public/images/profile/doc.png | Bin 0 -> 12732 bytes .../teacher/{路径 17.png => upload-fail.png} | Bin .../{分组 75.png => upload-succeed.png} | Bin public/images/teacher/{分组 81.png => x.png} | Bin .../admin/CourseComponents/CourseCategory.vue | 2 +- .../CourseComponents/css/CourseCreate.css | 1865 ++++++++--------- src/components/common/CommonModal.vue | 232 ++ src/components/common/CreateFolderContent.vue | 129 ++ src/components/common/MoveFileContent.vue | 216 ++ src/router/index.ts | 28 +- src/views/teacher/AdminDashboard.vue | 25 +- src/views/teacher/course/AddQuestion.vue | 955 +++++++++ src/views/teacher/course/CourseEditor.vue | 151 +- .../teacher/course/CoursewareManagement.vue | 87 +- src/views/teacher/course/LocalUploadModal.vue | 655 ++++++ src/views/teacher/course/PracticeExam.vue | 15 + src/views/teacher/course/PracticeReview.vue | 15 + .../teacher/course/QuestionBankManagement.vue | 6 +- .../teacher/course/ResourceSelectionModal.vue | 1 - src/views/teacher/course/UploadFileModal.vue | 51 +- 21 files changed, 3355 insertions(+), 1078 deletions(-) create mode 100644 public/images/profile/default-file.png create mode 100644 public/images/profile/doc.png rename public/images/teacher/{路径 17.png => upload-fail.png} (100%) rename public/images/teacher/{分组 75.png => upload-succeed.png} (100%) rename public/images/teacher/{分组 81.png => x.png} (100%) create mode 100644 src/components/common/CommonModal.vue create mode 100644 src/components/common/CreateFolderContent.vue create mode 100644 src/components/common/MoveFileContent.vue create mode 100644 src/views/teacher/course/AddQuestion.vue create mode 100644 src/views/teacher/course/LocalUploadModal.vue create mode 100644 src/views/teacher/course/PracticeExam.vue create mode 100644 src/views/teacher/course/PracticeReview.vue diff --git a/public/images/profile/default-file.png b/public/images/profile/default-file.png new file mode 100644 index 0000000000000000000000000000000000000000..c45cf73d9fec2658be52da46a53e3c065db4f214 GIT binary patch literal 10140 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 ys&}Bw?y}T { - router.push('/teacher/course-create'); + // router.push('/teacher/course-create'); }; diff --git a/src/components/admin/CourseComponents/css/CourseCreate.css b/src/components/admin/CourseComponents/css/CourseCreate.css index 8730059..4977096 100644 --- a/src/components/admin/CourseComponents/css/CourseCreate.css +++ b/src/components/admin/CourseComponents/css/CourseCreate.css @@ -1,995 +1,872 @@ * { - box-sizing: border-box; - flex-shrink: 0; - } - - .flex-col { - display: flex; - flex-direction: column; - } - - .flex-row { - display: flex; - flex-direction: row; - } - - .justify-between { - display: flex; - justify-content: space-between; - } - - .justify-center { - display: flex; - justify-content: center; - } - - /* 原生上传组件样式 */ - .native-upload { - width: 100%; - height: 100%; - min-height: 120px; - border: 1px dashed #d9d9d9; - border-radius: 8px; - cursor: pointer; - transition: border-color 0.3s; - display: flex; - align-items: center; - justify-content: center; - background-color: #fafafa; - } - - .native-upload:hover { - border-color: #1890ff; - } - - .upload-content { - width: 100%; - height: 100%; - min-height: 120px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - } - - .upload-plus-icon { - font-size: 32px; - color: #999; - margin-bottom: 8px; - } - - .upload-text { - color: #666; - font-size: 14px; - } - - .image-delete-icon:hover { - background-color: rgba(0,0,0,0.7); - } - - /* 主容器 */ - .course-create-page { - background-color: rgba(255, 255, 255, 1); - position: relative; - min-height: 1712px; - height: auto; - overflow: visible; - } - - .course-form-container { - min-height: 1211px; - height: auto; - background-size: 100% 100%; - /* width: 1565px; */ - position: relative; - } - - /* 第一行:课程名称和分类 */ - .course-basic-info-row { - width: 1307px; - height: 43px; - margin: 30px 0 0 102px; - } - - .course-name-label { - width: 89px; - height: 18px; - overflow-wrap: break-word; - font-size: 0; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: right; - white-space: nowrap; - line-height: 18px; - margin-top: 9px; - } - - .required-asterisk { - color: rgba(255, 77, 79, 1); - font-size: 16px; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: left; - white-space: nowrap; - line-height: 18px; - } - - .label-text { - color: rgba(51, 51, 51, 1); - font-size: 16px; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: left; - white-space: nowrap; - line-height: 18px; - } - - .course-name-input-wrapper { - height: 42px; - background-size: 562px 44px; - margin-left: 2px; - width: 560px; - border: 1px solid #e0e0e0; - border-radius: 4px; - padding: 0 12px; - display: flex; - align-items: center; - } - - .form-input { - width: 100%; - height: 100%; - border: none; - background: transparent; - font-size: 16px; - color: #333; - } - - .course-input::placeholder { - color: rgba(153, 153, 153, 1); - font-size: 16px; - } - - .course-category-section { - height: 42px; - width: 522px; - position: relative; - margin: 1px 0 0 134px; - } - - .course-category-label { - width: 89px; - height: 18px; - overflow-wrap: break-word; - font-size: 0; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: right; - white-space: nowrap; - line-height: 18px; - margin-top: 9px; - } - - .course-category-select-wrapper { - height: 42px; - background-size: 562px 44px; - width: 560px; - position: absolute; - left: 87px; - top: 0; - border: 1px solid #e0e0e0; - border-radius: 4px; - padding: 0 12px; - display: flex; - align-items: center; - } - - .form-select { - width: 100%; - height: 100%; - border: none; - background: transparent; - } - - /* 第二行:主讲老师 */ - .instructor-sort-row { - width: 1340px; - height: 42px; - margin: 29px 0 0 102px; - } - - .instructor-label { - width: 89px; - height: 18px; - overflow-wrap: break-word; - font-size: 0; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: right; - white-space: nowrap; - line-height: 18px; - margin-top: 9px; - } - - .instructor-select-wrapper { - width: 560px; - height: 42px; - background-size: 562px 44px; - margin-left: 2px; - border: 1px solid #e0e0e0; - border-radius: 4px; - padding: 0 12px; - display: flex; - align-items: center; - } - - .instructor-select { - width: 100%; - height: 100%; - border: none; - background: transparent; - } - - /* 主讲老师选择区域样式已整合到 .instructor-select 中 */ - - .course-sort-section { - height: 42px; - margin-left: 159px; - width: 630px; - display: flex; - align-items: center; - gap: 10px; - } - - .course-sort-label { - width: 57px; - height: 18px; - overflow-wrap: break-word; - font-size: 0; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: right; - white-space: nowrap; - line-height: 18px; - flex-shrink: 0; - } - - /* 排序输入框 */ - .course-sort-input-wrapper { - position: relative; - left: 0; - top: 0; - width: 560px; - height: 42px; - background-size: 562px 44px; - border: 1px solid #e0e0e0; - border-radius: 4px; - padding: 0 12px; - display: flex; - align-items: center; - flex-shrink: 0; - } - - .sort-input { - width: 100%; - height: 100%; - border: none; - background: transparent; - font-size: 16px; - color: #333; - } - - .sort-input::placeholder { - color: rgba(153, 153, 153, 1); - font-size: 16px; - } - - /* 第三行:时间选择 */ - .course-time-row { - width: 1463px; - height: 49px; - margin: 30px 0 0 71px; - } - - .start-time-label { - width: 121px; - height: 18px; - overflow-wrap: break-word; - font-size: 0; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: right; - white-space: nowrap; - line-height: 18px; - margin-top: 9px; - } - - .start-time-picker-wrapper, .end-time-picker-wrapper { - width: 560px; - height: 42px; - background-size: 562px 44px; - margin-left: 1px; - border: 1px solid #e0e0e0; - border-radius: 4px; - padding: 0 12px; - display: flex; - align-items: center; - } - - .group_12 { - margin: 7px 0 0 6px; - } - - .form-datepicker { - width: 100%; - height: 100%; - border: none; - background: transparent; - } - - .end-time-label { - width: 121px; - height: 18px; - overflow-wrap: break-word; - font-size: 0; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: right; - white-space: nowrap; - line-height: 18px; - margin: 16px 0 0 94px; - } - - /* 参与学员 */ - .student-selection-row { - width: 312px; - height: 18px; - margin: 23px 0 0 103px; - } - - .student-selection-label { - width: 89px; - height: 18px; - overflow-wrap: break-word; - font-size: 0; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: right; - white-space: nowrap; - line-height: 18px; - } - - .student-type-radio-group { - margin-left: 3px; - align-items: center; - } - - .radio-option { - display: flex; - align-items: center; - cursor: pointer; - margin-right: 38px; - } - - .radio-circle { - width: 16px; - height: 16px; - border: 2px solid #d9d9d9; - border-radius: 50%; - background: white; - margin-right: 8px; - display: flex; - align-items: center; - justify-content: center; - transition: all 0.3s; - } - - .radio-circle.active { - border-color: #1890ff; - } - - .radio-dot { - width: 8px; - height: 8px; - background: #1890ff; - border-radius: 50%; - } - - .radio-text { - color: rgba(51, 51, 51, 1); - font-size: 16px; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: left; - white-space: nowrap; - line-height: 18px; - margin-left: 7px; - } - - /* 班级选择 */ - .class-selection-row { - width: 560px; - height: 44px; - margin: 16px 0 0 192px; - } - - .class-select-wrapper { - width: 560px; - height: 44px; - background-size: 100% 100%; - border: 1px solid #e0e0e0; - border-radius: 4px; - padding: 0 18px; - display: flex; - align-items: center; - } - - .class-select { - width: 100%; - height: 100%; - border: none; - background: transparent; - } - - /* 课程封面 */ - .course-cover-row { - width: 312px; - height: 128px; - margin: 30px 0 0 41px; - } - - .course-cover-label { - width: 89px; - height: 18px; - overflow-wrap: break-word; - font-size: 0; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: right; - white-space: nowrap; - line-height: 18px; - margin-top: 9px; - } - - .cover-upload-area { - width: 160px; - height: 128px; - border: 2px dashed #d9d9d9; - border-radius: 6px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: all 0.3s; - } - - .cover-upload-area:hover { - border-color: #1890ff; - background-color: #f0f8ff; - } - - .upload-container { - width: 100%; - height: 100%; - text-align: center; - display: flex; - align-items: center; - justify-content: center; - } - - .cover-upload { - width: 100%; - height: 100%; - display: flex; - align-items: center; - justify-content: center; - } - - .upload-content { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 100%; - height: 100%; - } - - .upload-plus-icon { - font-size: 28px; - color: #999; - margin-bottom: 8px; - font-weight: normal; - line-height: 1; - display: block; - } - - .upload-text { - color: rgba(102, 102, 102, 1); - display: block; - font-size: 16px; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: center; - white-space: nowrap; - line-height: 18px; - } - - .upload-text-label { - width: 32px; - height: 18px; - overflow-wrap: break-word; - color: rgba(102, 102, 102, 1); - font-size: 16px; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: center; - white-space: nowrap; - line-height: 18px; - } - - /* 课程简介整体区域 */ - .course-description-section { - width: 1452px; - margin: 42px 0 0 41px; - } - - /* 课程简介标题 */ - .course-description-header { - position: relative; - width: 100%; - height: 20px; - margin-bottom: -30px; - } - - .course-description-label { - width: 89px; - height: 18px; - overflow-wrap: break-word; - font-size: 0; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: right; - white-space: nowrap; - line-height: 18px; - } - - - - .toolbar-icon-btn { - background: #f5f5f5; - border: 1px solid #d9d9d9; - border-radius: 4px; - padding: 4px 8px; - cursor: pointer; - font-size: 14px; - transition: all 0.3s; - } - - .toolbar-icon-btn:hover { - background: #e6f7ff; - border-color: #1890ff; - } - - /* 富文本编辑器区域 */ - .description-editor-container { - height: 336px; - background-size: 100% 100%; - width: 1340px; - position: relative; - left: 0; - top: 0; - margin-left: 129px; - border-radius: 8px; - padding: 13px 19px; - background: white; - } - - - - .toolbar-btn { - background: #f5f5f5; - border: 1px solid #d9d9d9; - border-radius: 4px; - padding: 3px 8px; - cursor: pointer; - font-size: 14px; - font-weight: bold; - transition: all 0.3s; - } - - .toolbar-btn:hover { - background: #e6f7ff; - border-color: #1890ff; - } - - - .rich-text-editor { - width: 100%; - height: 100%; - border: 1px solid #e0e0e0; - border-radius: 4px; - background: white; - } - - /* 确保 QuillEditor 内部的边框正常显示 */ - .rich-text-editor :deep(.ql-container) { - border-bottom: 1px solid #e0e0e0; - border-left: 1px solid #e0e0e0; - border-right: 1px solid #e0e0e0; - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - } - - .rich-text-editor :deep(.ql-toolbar) { - border-top: 1px solid #e0e0e0; - border-left: 1px solid #e0e0e0; - border-right: 1px solid #e0e0e0; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - } - - /* 设置选项区域 */ - .course-settings-section { - margin: 30px 0 0 41px; - width: 1400px; - } - - .stop-on-leave-setting { - width: 350px; - height: 24px; - margin: 20px 0 0 31px; - display: flex; - align-items: center; - justify-content: space-between; - } - - .setting-control { - width: 100%; - height: 24px; - display: flex; - align-items: center; - } - - .setting-label { - width: auto; - height: 18px; - overflow-wrap: break-word; - font-size: 0; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: left; - white-space: nowrap; - line-height: 18px; - margin-top: 1px; - display: flex; - align-items: center; - margin-right: 5px; - } - - .video-speed-setting { - width: 350px; - height: 24px; - margin: 20px 0 0 63px; - display: flex; - align-items: center; - justify-content: space-between; - } - - .video-text-setting { - width: 350px; - height: 24px; - margin: 20px 0 0 63px; - display: flex; - align-items: center; - justify-content: space-between; - } - - /* 积分设置 */ - .points-setting-row { - width: 800px; - height: 40px; - margin: 21px 0 40px 95px; - display: flex; - align-items: center; - gap: 10px; - } - - .points-setting-control { - width: auto; - height: 24px; - margin-top: 9px; - display: flex; - align-items: center; - margin-right: 20px; - } - - .points-setting-control .setting-label { - width: 89px; - margin-right: 0; - } - - .points-description-text { - color: rgba(51, 51, 51, 1); - font-size: 16px; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: left; - white-space: nowrap; - line-height: 18px; - margin: 0 8px; - } - - .earn-points-input-container, .required-points-input-container { - width: 80px; - height: 32px; - display: flex; - align-items: center; - justify-content: center; - border: 1px solid #d9d9d9; - border-radius: 4px; - background: white; - } - - /* 蓝色开关样式 */ - .toggle-switch { - --n-rail-color: #e0e0e0 !important; - --n-rail-color-active: #1890ff !important; - --n-button-color: #ffffff !important; - --n-button-color-active: #ffffff !important; - --n-button-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2) !important; - } - - .blue-switch .n-switch__rail { - background-color: #e0e0e0 !important; - } - - .blue-switch .n-switch__rail--active { - background-color: #1890ff !important; - } - - /* 原生开关按钮样式 */ - .toggle-button { - position: relative; - width: 44px; - height: 22px; - border-radius: 11px; - background-color: #e0e0e0; - cursor: pointer; - transition: all 0.3s; - outline: none; - padding: 0; - border: none; - font-size: 0; /* 隐藏文字 */ - box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.1); - margin-left: 0; - } - - .toggle-button::after { - content: ''; - position: absolute; - top: 2px; - left: 2px; - width: 18px; - height: 18px; - border-radius: 50%; - background-color: white; - transition: all 0.3s; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); - } - - .toggle-button-active { - background-color: #1890ff; - box-shadow: none; - } - - .toggle-button-active::after { - left: calc(100% - 20px); - } - - /* 积分输入框样式 */ - .points-input { - width: 100%; - height: 100%; - border: none; - background: transparent; - font-size: 14px; - color: #333; - text-align: center; - outline: none; - } - - .points-input:focus { - background: rgba(240, 248, 255, 0.3); - } - - - - /* 底部按钮区域 */ - .form-action-buttons { - position: relative; - left: 0; - top: 0; - width: 100%; - height: 91px; - background-size: 1920px 139px; - display: flex; - align-items: center; - justify-content: flex-end; - padding-right: 100px; - gap: 15px; - margin-top: 60px; - } - - .button-spacer { - width: 66px; - height: 32px; - } - - .cancel-button { - height: 32px; - width: 80px; - border: 1px solid #d9d9d9; - border-radius: 4px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: all 0.3s; - background-color: white; - } - - .cancel-button:hover { - border-color: #40a9ff; - color: #40a9ff; - } - - .submit-button { - height: 32px; - width: 80px; - background-color: #1890ff; - border: 1px solid #1890ff; - border-radius: 4px; - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: all 0.3s; - } - - .submit-button:hover { - background-color: #40a9ff; - border-color: #40a9ff; - } - - .button-text { - color: rgba(255, 255, 255, 1); - font-size: 16px; - font-family: Helvetica, 'Microsoft YaHei', Arial, sans-serif; - font-weight: normal; - text-align: center; - white-space: nowrap; - line-height: 22px; - } - - .cancel-button .button-text { - color: rgba(0, 0, 0, 0.65); - font-size: 14px; - } - - /* 响应式设计 - 保持原有布局不变,只在特定屏幕尺寸下优化 */ - - /* 大屏幕优化 (≥1920px) - 让表单居中显示 */ - @media (min-width: 1920px) { - .course-create-page { - display: flex; - justify-content: center; - align-items: flex-start; - background-color: #f5f5f5; - } - - .course-form-container { - background: white; - border-radius: 8px; - box-shadow: 0 2px 12px rgba(0, 0, 0, 0.1); - padding: 40px; - margin: 0 auto; - } - } - - /* 中等屏幕 (1400px-1919px) - 保持原有布局 */ - @media (max-width: 1919px) and (min-width: 1400px) { - .course-create-page { - width: 100%; - min-width: 1400px; - } - } - - /* 小屏幕适配 (1200px-1399px) */ - @media (max-width: 1399px) and (min-width: 1200px) { - .course-create-page { - width: 100%; - overflow-x: auto; - } - - .course-form-container { - min-width: 1200px; - } - - /* 稍微缩小一些元素的宽度 */ - .course-basic-info-row { - width: 1100px; - margin-left: 50px; - } - - .instructor-sort-row { - width: 1150px; - margin-left: 50px; - } - - .course-time-row { - width: 1250px; - margin-left: 50px; - } - - .course-description-section { - width: 1250px; - margin-left: 50px; - } - - .description-editor-container { - width: 1150px; - margin-left: 80px; - } - } - - /* 平板适配 (768px-1199px) */ - @media (max-width: 1199px) and (min-width: 768px) { - .course-create-page { - width: 100%; - overflow-x: auto; - padding: 20px; - } - - .course-form-container { - min-width: 800px; - position: relative; - transform: scale(0.8); - transform-origin: top left; - } - } - - /* 移动端适配 (≤767px) */ - @media (max-width: 767px) { - .course-create-page { - width: 100%; - overflow-x: auto; - padding: 10px; - } - - .course-form-container { - min-width: 600px; - position: relative; - transform: scale(0.6); - transform-origin: top left; - } - - /* 调整一些关键元素以适应移动端 */ - .form-action-buttons { - position: fixed; - bottom: 0; - left: 0; - right: 0; - background: white; - border-top: 1px solid #e0e0e0; - z-index: 1000; - transform: none; - width: 100%; - justify-content: center; - padding: 15px; - } - - .cancel-button, - .submit-button { - transform: scale(1.2); - } - } \ No newline at end of file + box-sizing: border-box; + flex-shrink: 0; +} + +.flex-col { + display: flex; + flex-direction: column; +} + +.flex-row { + display: flex; + flex-direction: row; +} + +.justify-between { + display: flex; + justify-content: space-between; +} + +.justify-center { + display: flex; + justify-content: center; +} + +/* 原生上传组件样式 */ +.native-upload { + width: 100%; + height: 100%; + min-height: 120px; + border: 1px dashed #d9d9d9; + border-radius: 8px; + cursor: pointer; + transition: border-color 0.3s; + display: flex; + align-items: center; + justify-content: center; + background-color: #fafafa; +} + +.native-upload:hover { + border-color: #1890ff; +} + +.upload-content { + width: 100%; + height: 100%; + min-height: 120px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.upload-plus-icon { + font-size: 32px; + color: #999; + margin-bottom: 8px; +} + +.upload-text { + color: #666; + font-size: 14px; +} + +.image-delete-icon:hover { + background-color: rgba(0, 0, 0, 0.7); +} + +/* 主容器 */ +.course-create-page { + background-color: rgba(255, 255, 255, 1); + position: relative; + min-height: 1200px; /* 从1712px减少到1200px */ + height: auto; + overflow: visible; +} + +.course-form-container { + min-height: 900px; /* 从1211px减少到900px */ + height: auto; + background-size: 100% 100%; + /* width: 1565px; */ + position: relative; +} + +/* 第一行:课程名称和分类 */ +.course-basic-info-row { + width: 1000px; /* 从1307px减少到1000px */ + height: 32px; /* 从43px减少到32px */ + margin: 20px 0 0 80px; /* 从30px 0 0 102px减少到20px 0 0 80px */ +} + +.course-name-label { + width: 70px; /* 从89px减少到70px */ + height: 16px; /* 从18px减少到16px */ + overflow-wrap: break-word; + font-size: 0; + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: right; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ + margin-top: 6px; /* 从9px减少到6px */ +} + +.required-asterisk { + color: rgba(255, 77, 79, 1); + font-size: 14px; /* 从16px减少到14px */ + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: left; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ +} + +.label-text { + color: rgba(51, 51, 51, 1); + font-size: 14px; /* 从16px减少到14px */ + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: left; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ +} + +.course-name-input-wrapper { + height: 32px; /* 从42px减少到32px */ + background-size: 400px 32px; /* 从562px 44px减少到400px 32px */ + margin-left: 2px; + width: 400px; /* 从560px减少到400px */ + border: 1px solid #e0e0e0; + border-radius: 4px; + padding: 0 10px; /* 从0 12px减少到0 10px */ + display: flex; + align-items: center; +} + +.form-input { + width: 100%; + height: 100%; + border: none; + background: transparent; + font-size: 14px; /* 从16px减少到14px */ + color: #333; +} + +.course-input::placeholder { + color: rgba(153, 153, 153, 1); + font-size: 14px; /* 从16px减少到14px */ +} + +.course-category-section { + height: 32px; /* 从42px减少到32px */ + width: 400px; /* 从522px减少到400px */ + position: relative; + margin: 1px 0 0 100px; /* 从1px 0 0 134px减少到1px 0 0 100px */ +} + +.course-category-label { + width: 70px; /* 从89px减少到70px */ + height: 16px; /* 从18px减少到16px */ + overflow-wrap: break-word; + font-size: 0; + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: right; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ + margin-top: 6px; /* 从9px减少到6px */ +} + +.course-category-select-wrapper { + height: 32px; /* 从42px减少到32px */ + background-size: 400px 32px; /* 从562px 44px减少到400px 32px */ + width: 400px; /* 从560px减少到400px */ + position: absolute; + left: 70px; /* 从87px减少到70px */ + top: 0; + border: 1px solid #e0e0e0; + border-radius: 4px; + padding: 0 10px; /* 从0 12px减少到0 10px */ + display: flex; + align-items: center; +} + +.form-select { + width: 100%; + height: 100%; + border: none; + background: transparent; +} + +/* 第二行:主讲老师 */ +.instructor-sort-row { + width: 1000px; /* 从1340px减少到1000px */ + height: 32px; /* 从42px减少到32px */ + margin: 20px 0 0 80px; /* 从29px 0 0 102px减少到20px 0 0 80px */ +} + +.instructor-label { + width: 70px; /* 从89px减少到70px */ + height: 16px; /* 从18px减少到16px */ + overflow-wrap: break-word; + font-size: 0; + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: right; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ + margin-top: 6px; /* 从9px减少到6px */ +} + +.instructor-select-wrapper { + width: 400px; /* 从560px减少到400px */ + height: 32px; /* 从42px减少到32px */ + background-size: 400px 32px; /* 从562px 44px减少到400px 32px */ + margin-left: 2px; + border: 1px solid #e0e0e0; + border-radius: 4px; + padding: 0 10px; /* 从0 12px减少到0 10px */ + display: flex; + align-items: center; +} + +.instructor-select { + width: 100%; + height: 100%; + border: none; + background: transparent; +} + +/* 主讲老师选择区域样式已整合到 .instructor-select 中 */ + +.course-sort-section { + height: 32px; /* 从42px减少到32px */ + margin-left: 120px; /* 从159px减少到120px */ + width: 480px; /* 从630px减少到480px */ + display: flex; + align-items: center; + gap: 8px; /* 从10px减少到8px */ +} + +.course-sort-label { + width: 45px; /* 从57px减少到45px */ + height: 16px; /* 从18px减少到16px */ + overflow-wrap: break-word; + font-size: 0; + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: right; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ + flex-shrink: 0; +} + +/* 排序输入框 */ +.course-sort-input-wrapper { + position: relative; + left: 0; + top: 0; + width: 400px; /* 从560px减少到400px */ + height: 32px; /* 从42px减少到32px */ + background-size: 400px 32px; /* 从562px 44px减少到400px 32px */ + border: 1px solid #e0e0e0; + border-radius: 4px; + padding: 0 10px; /* 从0 12px减少到0 10px */ + display: flex; + align-items: center; + flex-shrink: 0; +} + +.sort-input { + width: 100%; + height: 100%; + border: none; + background: transparent; + font-size: 14px; /* 从16px减少到14px */ + color: #333; +} + +.sort-input::placeholder { + color: rgba(153, 153, 153, 1); + font-size: 14px; /* 从16px减少到14px */ +} + +/* 第三行:时间选择 */ +.course-time-row { + width: 1100px; /* 从1463px减少到1100px */ + height: 36px; /* 从49px减少到36px */ + margin: 20px 0 0 60px; /* 从30px 0 0 71px减少到20px 0 0 60px */ +} + +.start-time-label { + width: 90px; /* 从121px减少到90px */ + height: 16px; /* 从18px减少到16px */ + overflow-wrap: break-word; + font-size: 0; + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: right; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ + margin-top: 6px; /* 从9px减少到6px */ +} + +.start-time-picker-wrapper, +.end-time-picker-wrapper { + width: 400px; /* 从560px减少到400px */ + height: 32px; /* 从42px减少到32px */ + background-size: 400px 32px; /* 从562px 44px减少到400px 32px */ + margin-left: 1px; + border: 1px solid #e0e0e0; + border-radius: 4px; + padding: 0 10px; /* 从0 12px减少到0 10px */ + display: flex; + align-items: center; +} + +.group_12 { + margin: 5px 0 0 4px; /* 从7px 0 0 6px减少到5px 0 0 4px */ +} + +.form-datepicker { + width: 100%; + height: 100%; + border: none; + background: transparent; +} + +.end-time-label { + width: 90px; /* 从121px减少到90px */ + height: 16px; /* 从18px减少到16px */ + overflow-wrap: break-word; + font-size: 0; + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: right; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ + margin: 12px 0 0 70px; /* 从16px 0 0 94px减少到12px 0 0 70px */ +} + +/* 参与学员 */ +.student-selection-row { + width: 250px; /* 从312px减少到250px */ + height: 16px; /* 从18px减少到16px */ + margin: 16px 0 0 80px; /* 从23px 0 0 103px减少到16px 0 0 80px */ +} + +.student-selection-label { + width: 70px; /* 从89px减少到70px */ + height: 16px; /* 从18px减少到16px */ + overflow-wrap: break-word; + font-size: 0; + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: right; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ +} + +.student-type-radio-group { + margin-left: 3px; + align-items: center; +} + +.radio-option { + display: flex; + align-items: center; + cursor: pointer; + margin-right: 30px; /* 从38px减少到30px */ +} + +.radio-circle { + width: 14px; /* 从16px减少到14px */ + height: 14px; /* 从16px减少到14px */ + border: 2px solid #d9d9d9; + border-radius: 50%; + background: white; + margin-right: 6px; /* 从8px减少到6px */ + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s; +} + +.radio-circle.active { + border-color: #1890ff; +} + +.radio-dot { + width: 6px; /* 从8px减少到6px */ + height: 6px; /* 从8px减少到6px */ + background: #1890ff; + border-radius: 50%; +} + +.radio-text { + color: rgba(51, 51, 51, 1); + font-size: 14px; /* 从16px减少到14px */ + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: left; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ + margin-left: 5px; /* 从7px减少到5px */ +} + +/* 班级选择 */ +.class-selection-row { + width: 400px; /* 从560px减少到400px */ + height: 32px; /* 从44px减少到32px */ + margin: 12px 0 0 150px; /* 从16px 0 0 192px减少到12px 0 0 150px */ +} + +.class-select-wrapper { + width: 400px; /* 从560px减少到400px */ + height: 32px; /* 从44px减少到32px */ + background-size: 100% 100%; + border: 1px solid #e0e0e0; + border-radius: 4px; + padding: 0 14px; /* 从0 18px减少到0 14px */ + display: flex; + align-items: center; +} + +.class-select { + width: 100%; + height: 100%; + border: none; + background: transparent; +} + +/* 课程封面 */ +.course-cover-row { + width: 250px; /* 从312px减少到250px */ + height: 96px; /* 从128px减少到96px */ + margin: 20px 0 0 30px; /* 从30px 0 0 41px减少到20px 0 0 30px */ +} + +.course-cover-label { + width: 70px; /* 从89px减少到70px */ + height: 16px; /* 从18px减少到16px */ + overflow-wrap: break-word; + font-size: 0; + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: right; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ + margin-top: 6px; /* 从9px减少到6px */ +} + +.cover-upload-area { + width: 120px; /* 从160px减少到120px */ + height: 96px; /* 从128px减少到96px */ + border: 2px dashed #d9d9d9; + border-radius: 6px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.3s; +} + +.cover-upload-area:hover { + border-color: #1890ff; + background-color: #f0f8ff; +} + +.upload-container { + width: 100%; + height: 100%; + text-align: center; + display: flex; + align-items: center; + justify-content: center; +} + +.cover-upload { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.upload-content { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; +} + +.upload-plus-icon { + font-size: 24px; /* 从28px减少到24px */ + color: #999; + margin-bottom: 6px; /* 从8px减少到6px */ + font-weight: normal; + line-height: 1; + display: block; +} + +.upload-text { + color: rgba(102, 102, 102, 1); + display: block; + font-size: 14px; /* 从16px减少到14px */ + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: center; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ +} + +.upload-text-label { + width: 28px; /* 从32px减少到28px */ + height: 16px; /* 从18px减少到16px */ + overflow-wrap: break-word; + color: rgba(102, 102, 102, 1); + font-size: 14px; /* 从16px减少到14px */ + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: center; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ +} + +/* 课程简介整体区域 */ +.course-description-section { + width: 1100px; /* 从1452px减少到1100px */ + margin: 30px 0 0 30px; /* 从42px 0 0 41px减少到30px 0 0 30px */ +} + +/* 课程简介标题 */ +.course-description-header { + position: relative; + width: 100%; + height: 18px; /* 从20px减少到18px */ + margin-bottom: -20px; /* 从-30px减少到-20px */ +} + +.course-description-label { + width: 70px; /* 从89px减少到70px */ + height: 16px; /* 从18px减少到16px */ + overflow-wrap: break-word; + font-size: 0; + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: right; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ +} + +.toolbar-icon-btn { + background: #f5f5f5; + border: 1px solid #d9d9d9; + border-radius: 4px; + padding: 3px 6px; /* 从4px 8px减少到3px 6px */ + cursor: pointer; + font-size: 12px; /* 从14px减少到12px */ + transition: all 0.3s; +} + +.toolbar-icon-btn:hover { + background: #e6f7ff; + border-color: #1890ff; +} + +/* 富文本编辑器区域 */ +.description-editor-container { + height: 250px; /* 从336px减少到250px */ + background-size: 100% 100%; + width: 1000px; /* 从1340px减少到1000px */ + position: relative; + left: 0; + top: 0; + margin-left: 100px; /* 从129px减少到100px */ + border-radius: 8px; + padding: 10px 15px; /* 从13px 19px减少到10px 15px */ + background: white; +} + +.toolbar-btn { + background: #f5f5f5; + border: 1px solid #d9d9d9; + border-radius: 4px; + padding: 2px 6px; /* 从3px 8px减少到2px 6px */ + cursor: pointer; + font-size: 12px; /* 从14px减少到12px */ + font-weight: bold; + transition: all 0.3s; +} + +.toolbar-btn:hover { + background: #e6f7ff; + border-color: #1890ff; +} + +.rich-text-editor { + width: 100%; + height: 100%; + border: 1px solid #e0e0e0; + border-radius: 4px; + background: white; +} + +/* 确保 QuillEditor 内部的边框正常显示 */ +.rich-text-editor :deep(.ql-container) { + border-bottom: 1px solid #e0e0e0; + border-left: 1px solid #e0e0e0; + border-right: 1px solid #e0e0e0; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +.rich-text-editor :deep(.ql-toolbar) { + border-top: 1px solid #e0e0e0; + border-left: 1px solid #e0e0e0; + border-right: 1px solid #e0e0e0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +/* 设置选项区域 */ +.course-settings-section { + margin: 20px 0 0 30px; /* 从30px 0 0 41px减少到20px 0 0 30px */ + width: 1000px; /* 从1400px减少到1000px */ +} + +.stop-on-leave-setting { + width: 280px; /* 从350px减少到280px */ + height: 20px; /* 从24px减少到20px */ + margin: 15px 0 0 25px; /* 从20px 0 0 31px减少到15px 0 0 25px */ + display: flex; + align-items: center; + justify-content: space-between; +} + +.setting-control { + width: 100%; + height: 20px; /* 从24px减少到20px */ + display: flex; + align-items: center; +} + +.setting-label { + width: auto; + height: 16px; /* 从18px减少到16px */ + overflow-wrap: break-word; + font-size: 0; + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: left; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ + margin-top: 1px; + display: flex; + align-items: center; + margin-right: 4px; /* 从5px减少到4px */ +} + +.video-speed-setting { + width: 280px; /* 从350px减少到280px */ + height: 20px; /* 从24px减少到20px */ + margin: 15px 0 0 50px; /* 从20px 0 0 63px减少到15px 0 0 50px */ + display: flex; + align-items: center; + justify-content: space-between; +} + +.video-text-setting { + width: 280px; /* 从350px减少到280px */ + height: 20px; /* 从24px减少到20px */ + margin: 15px 0 0 50px; /* 从20px 0 0 63px减少到15px 0 0 50px */ + display: flex; + align-items: center; + justify-content: space-between; +} + +/* 积分设置 */ +.points-setting-row { + width: 600px; /* 从800px减少到600px */ + height: 32px; /* 从40px减少到32px */ + margin: 15px 0 30px 70px; /* 从21px 0 40px 95px减少到15px 0 30px 70px */ + display: flex; + align-items: center; + gap: 8px; /* 从10px减少到8px */ +} + +.points-setting-control { + width: auto; + height: 20px; /* 从24px减少到20px */ + margin-top: 6px; /* 从9px减少到6px */ + display: flex; + align-items: center; + margin-right: 15px; /* 从20px减少到15px */ +} + +.points-setting-control .setting-label { + width: 70px; /* 从89px减少到70px */ + margin-right: 0; +} + +.points-description-text { + color: rgba(51, 51, 51, 1); + font-size: 14px; /* 从16px减少到14px */ + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: left; + white-space: nowrap; + line-height: 16px; /* 从18px减少到16px */ + margin: 0 6px; /* 从0 8px减少到0 6px */ +} + +.earn-points-input-container, +.required-points-input-container { + width: 60px; /* 从80px减少到60px */ + height: 24px; /* 从32px减少到24px */ + display: flex; + align-items: center; + justify-content: center; + border: 1px solid #d9d9d9; + border-radius: 4px; + background: white; +} + +/* 蓝色开关样式 */ +.toggle-switch { + --n-rail-color: #e0e0e0 !important; + --n-rail-color-active: #1890ff !important; + --n-button-color: #ffffff !important; + --n-button-color-active: #ffffff !important; + --n-button-box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2) !important; +} + +.blue-switch .n-switch__rail { + background-color: #e0e0e0 !important; +} + +.blue-switch .n-switch__rail--active { + background-color: #1890ff !important; +} + +/* 原生开关按钮样式 */ +.toggle-button { + position: relative; + width: 36px; /* 从44px减少到36px */ + height: 18px; /* 从22px减少到18px */ + border-radius: 9px; /* 从11px减少到9px */ + background-color: #e0e0e0; + cursor: pointer; + transition: all 0.3s; + outline: none; + padding: 0; + border: none; + font-size: 0; /* 隐藏文字 */ + box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.1); + margin-left: 0; +} + +.toggle-button::after { + content: ""; + position: absolute; + top: 2px; + left: 2px; + width: 14px; /* 从18px减少到14px */ + height: 14px; /* 从18px减少到14px */ + border-radius: 50%; + background-color: white; + transition: all 0.3s; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} + +.toggle-button-active { + background-color: #1890ff; + box-shadow: none; +} + +.toggle-button-active::after { + left: calc(100% - 16px); /* 从calc(100% - 20px)减少到calc(100% - 16px) */ +} + +/* 积分输入框样式 */ +.points-input { + width: 100%; + height: 100%; + border: none; + background: transparent; + font-size: 12px; /* 从14px减少到12px */ + color: #333; + text-align: center; + outline: none; +} + +.points-input:focus { + background: rgba(240, 248, 255, 0.3); +} + +/* 底部按钮区域 */ +.form-action-buttons { + position: relative; + left: 0; + top: 0; + width: 100%; + height: 70px; /* 从91px减少到70px */ + background-size: 1920px 139px; + display: flex; + align-items: center; + justify-content: flex-end; + padding-right: 80px; /* 从100px减少到80px */ + gap: 12px; /* 从15px减少到12px */ + margin-top: 40px; /* 从60px减少到40px */ +} + +.button-spacer { + width: 50px; /* 从66px减少到50px */ + height: 28px; /* 从32px减少到28px */ +} + +.cancel-button { + height: 28px; /* 从32px减少到28px */ + width: 70px; /* 从80px减少到70px */ + border: 1px solid #d9d9d9; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.3s; + background-color: white; +} + +.cancel-button:hover { + border-color: #40a9ff; + color: #40a9ff; +} + +.submit-button { + height: 28px; /* 从32px减少到28px */ + width: 70px; /* 从80px减少到70px */ + background-color: #1890ff; + border: 1px solid #1890ff; + border-radius: 4px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.3s; +} + +.submit-button:hover { + background-color: #40a9ff; + border-color: #40a9ff; +} + +.button-text { + color: rgba(255, 255, 255, 1); + font-size: 14px; /* 从16px减少到14px */ + font-family: Helvetica, "Microsoft YaHei", Arial, sans-serif; + font-weight: normal; + text-align: center; + white-space: nowrap; + line-height: 18px; /* 从22px减少到18px */ +} + +.cancel-button .button-text { + color: rgba(0, 0, 0, 0.65); + font-size: 12px; /* 从14px减少到12px */ +} diff --git a/src/components/common/CommonModal.vue b/src/components/common/CommonModal.vue new file mode 100644 index 0000000..5dad50e --- /dev/null +++ b/src/components/common/CommonModal.vue @@ -0,0 +1,232 @@ + + + + + diff --git a/src/components/common/CreateFolderContent.vue b/src/components/common/CreateFolderContent.vue new file mode 100644 index 0000000..cdbb4bb --- /dev/null +++ b/src/components/common/CreateFolderContent.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/components/common/MoveFileContent.vue b/src/components/common/MoveFileContent.vue new file mode 100644 index 0000000..f0a6315 --- /dev/null +++ b/src/components/common/MoveFileContent.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/src/router/index.ts b/src/router/index.ts index 15d6357..2d1bb8a 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -120,7 +120,7 @@ const routes: RouteRecordRaw[] = [ path: 'course-editor/:id', name: 'CourseEditor', component: CourseEditor, - meta: { title: '编辑课程' }, + meta: { title: '课程管理' }, redirect: (to) => `/teacher/course-editor/${to.params.id}/courseware`, children: [ { @@ -157,9 +157,23 @@ const routes: RouteRecordRaw[] = [ }, { path: 'practice', - name: 'PracticeManagement', - component: PracticeManagement, - meta: { title: '考试管理' }, + name: 'Practice', + redirect: (to) => `/teacher/course-editor/${to.params.id}/practice/exam`, + meta: { title: '练考通' }, + children: [ + { + path: 'exam', + name: 'PracticeExam', + component: () => import('../views/teacher/course/PracticeExam.vue'), + meta: { title: '试卷' } + }, + { + path: 'review', + name: 'PracticeReview', + component: () => import('../views/teacher/course/PracticeReview.vue'), + meta: { title: '阅卷中心' } + } + ] }, { path: 'question-bank', @@ -167,6 +181,12 @@ const routes: RouteRecordRaw[] = [ component: QuestionBankManagement, meta: { title: '题库管理' } }, + { + path: 'add-question', + name: 'AddQuestion', + component: () => import('../views/teacher/course/AddQuestion.vue'), + meta: { title: '新增试题' } + }, { path: 'certificate', name: 'CertificateManagement', diff --git a/src/views/teacher/AdminDashboard.vue b/src/views/teacher/AdminDashboard.vue index 12034e8..56b1634 100644 --- a/src/views/teacher/AdminDashboard.vue +++ b/src/views/teacher/AdminDashboard.vue @@ -83,13 +83,30 @@ const breadcrumbItems = computed(() => { // 获取当前路由的matched数组 const matchedRoutes = route.matched; - // 处理matchedRoutes,过滤掉'管理后台'并生成面包屑项 - return matchedRoutes + // 基础面包屑项 + let breadcrumbs = matchedRoutes .filter(item => item.meta.title !== '管理后台') .map(item => ({ title: item.meta.title || '未知页面', path: item.path })); + + // 特殊处理新增试题页面,插入"题库"层级 + const currentPath = route.path; + if (currentPath.includes('/add-question')) { + // 找到课程管理项的索引 + const courseIndex = breadcrumbs.findIndex(item => item.title === '课程管理'); + if (courseIndex !== -1) { + // 在课程管理和新增试题之间插入题库项 + const courseId = route.params.id; + breadcrumbs.splice(courseIndex + 1, 0, { + title: '题库', + path: `/teacher/course-editor/${courseId}/question-bank` + }); + } + } + + return breadcrumbs; }); // 监听路由变化,更新激活的导航项 @@ -120,6 +137,10 @@ const updateActiveNavItem = () => { diff --git a/src/views/teacher/course/CourseEditor.vue b/src/views/teacher/course/CourseEditor.vue index 0b5c1dd..3b6293f 100644 --- a/src/views/teacher/course/CourseEditor.vue +++ b/src/views/teacher/course/CourseEditor.vue @@ -1,7 +1,7 @@ @@ -81,6 +98,9 @@ import type { DataTableColumns, DropdownOption } from 'naive-ui' import AddCoursewareModal from './AddCoursewareModal.vue' import UploadFileModal from './UploadFileModal.vue' import DeleteFolderConfirmModal from '@/components/common/DeleteFolderConfirmModal.vue' +import CommonModal from '@/components/common/CommonModal.vue' +import CreateFolderContent from '@/components/common/CreateFolderContent.vue' +import MoveFileContent from '@/components/common/MoveFileContent.vue' const message = useMessage() @@ -107,6 +127,8 @@ const selectedFiles = ref([]) const showAddCoursewareModal = ref(false) const showUploadFileModal = ref(false) const showDeleteConfirmModal = ref(false) +const showCreateFolderModal = ref(false) +const showMoveFileModal = ref(false) // 存储待删除的项目信息 const itemsToDelete = ref<{ type: 'single' | 'multiple', data: any }>({ type: 'single', data: null }) @@ -589,12 +611,67 @@ const closeAddCoursewareModal = () => { } const createFolder = () => { - message.info('新建文件夹功能') + showCreateFolderModal.value = true } const moveFiles = () => { if (selectedFiles.value.length === 0) return - message.info(`移动 ${selectedFiles.value.length} 个文件`) + showMoveFileModal.value = true +} + +// 关闭新建文件夹模态框 +const closeCreateFolderModal = () => { + showCreateFolderModal.value = false +} + +// 关闭移动文件模态框 +const closeMoveFileModal = () => { + showMoveFileModal.value = false +} + +// 处理创建文件夹 +const handleCreateFolder = (folderName: string) => { + console.log('handleCreateFolder 接收到参数:', folderName) + + // 创建新的文件夹对象 + const newFolder: FileItem = { + id: Date.now(), + name: folderName, + type: 'folder', + size: '0B', + creator: '王建国', // 这里可以从用户状态获取 + createTime: new Date().toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit' + }).replace(/\//g, '.'), + isTop: false, + expanded: false, + children: [] + } + + console.log('创建的新文件夹对象:', newFolder) + + // 添加到文件列表 + fileList.value.push(newFolder) + + // 显示成功消息 + message.success(`文件夹 "${folderName}" 创建成功`) + + // 关闭模态框 + showCreateFolderModal.value = false +} + +// 处理移动文件 +const handleMoveFiles = (targetFolder: any) => { + // 这里实现移动文件的逻辑 + message.success(`成功移动 ${selectedFiles.value.length} 个文件到 "${targetFolder.name}"`) + selectedFiles.value = [] // 清空选择 + + // 关闭模态框 + showMoveFileModal.value = false } const deleteSelected = () => { @@ -814,6 +891,10 @@ const toggleFolder = (folder: FileItem) => { color: #1890ff; } +.btn-default--active { + border-color: #1890ff !important; + color: #1890ff !important; +} .btn-danger { background: white; color: #FF4D4F; diff --git a/src/views/teacher/course/LocalUploadModal.vue b/src/views/teacher/course/LocalUploadModal.vue new file mode 100644 index 0000000..7ecdbc0 --- /dev/null +++ b/src/views/teacher/course/LocalUploadModal.vue @@ -0,0 +1,655 @@ + + + + + diff --git a/src/views/teacher/course/PracticeExam.vue b/src/views/teacher/course/PracticeExam.vue new file mode 100644 index 0000000..cf7608c --- /dev/null +++ b/src/views/teacher/course/PracticeExam.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/src/views/teacher/course/PracticeReview.vue b/src/views/teacher/course/PracticeReview.vue new file mode 100644 index 0000000..88a4c2e --- /dev/null +++ b/src/views/teacher/course/PracticeReview.vue @@ -0,0 +1,15 @@ + + + + + diff --git a/src/views/teacher/course/QuestionBankManagement.vue b/src/views/teacher/course/QuestionBankManagement.vue index f98a144..a97f337 100644 --- a/src/views/teacher/course/QuestionBankManagement.vue +++ b/src/views/teacher/course/QuestionBankManagement.vue @@ -51,8 +51,11 @@ import { dateZhCN } from 'naive-ui' import type { DataTableColumns } from 'naive-ui' +import { useRoute, useRouter } from 'vue-router' const message = useMessage() +const route = useRoute() +const router = useRouter() // 题目类型定义 interface Question { @@ -440,7 +443,8 @@ const searchQuestions = () => { } const addQuestion = () => { - message.info('添加试题功能') + const courseId = route.params.id + router.push(`/teacher/course-editor/${courseId}/add-question`) } const importQuestions = () => { diff --git a/src/views/teacher/course/ResourceSelectionModal.vue b/src/views/teacher/course/ResourceSelectionModal.vue index 1be9475..334ec78 100644 --- a/src/views/teacher/course/ResourceSelectionModal.vue +++ b/src/views/teacher/course/ResourceSelectionModal.vue @@ -356,7 +356,6 @@ watch(() => props.show, (newVal) => { justify-content: flex-end; gap: 12px; padding-top: 16px; - border-top: 1px solid #e0e0e0; } /* 响应式设计 */ diff --git a/src/views/teacher/course/UploadFileModal.vue b/src/views/teacher/course/UploadFileModal.vue index e1f9e4d..a1c9b95 100644 --- a/src/views/teacher/course/UploadFileModal.vue +++ b/src/views/teacher/course/UploadFileModal.vue @@ -7,9 +7,9 @@ 选择文件
-