Parcourir la source

Merge remote-tracking branch 'origin/master' into correctPage-byXY

xiaoyu il y a 2 ans
Parent
commit
21dfb0698e

+ 2 - 1
src/apis/axios.config.ts

@@ -1,8 +1,9 @@
 import axios from "axios";
 
 // const BASEURL = 'http://47.111.23.171:8081'
-const BASEURL = 'http://localhost:8080'
+// const BASEURL = 'http://localhost:8080'
 // const BASEURL = 'http://8.130.126.86:8080'
+const BASEURL = 'http://139.196.252.184:8070'
 
 const axiosInstance = axios.create({
     baseURL: BASEURL,

+ 1 - 1
src/components/AIChatter/AIChatter.module.scss

@@ -1,7 +1,7 @@
 .container {
   position: relative;
   width: 100%;
-  height: 60%; // 原值:60%
+  height: 58%; // 原值:60%
   padding: 10px;
   box-sizing: border-box;
   background-color: #ffffff;

+ 5 - 6
src/components/WordEditor/WordEditor.vue

@@ -8,9 +8,9 @@
         id="docxEditor"
         documentServerUrl="http://139.196.252.184:8082/"
         :config="config"
-        @events_onDocumentReady="onDocumentReady"
-        @onLoadComponentError="onLoadComponentError"
-        @events_onDocumentStateChange="onDocumentStateChange"
+        :events_onDocumentReady="onDocumentReady"
+        :onLoadComponentError="onLoadComponentError"
+        :events_onDocumentStateChange="onDocumentStateChange"
         v-if="props.documentKey && props.documentTitle && props.documentUrl"
     ></DocumentEditor>
 </template>
@@ -32,7 +32,7 @@
 
   const props = defineProps<IProps>()
 
-  const documentServerUrl = 'http://139.196.252.184:8082/';
+  // const documentServerUrl = 'http://139.196.252.184:8082/';
 
   // OnlyOffice编辑器配置
   let config = reactive({
@@ -63,8 +63,7 @@
     editorConfig: {
       lang: 'zh-CN',
       //不要用localhost和127.0.0.1访问,用局域网IP访问
-      //TODO:项目部署要改
-      callbackUrl: 'http://192.168.137.1:8080/api/onlyoffice/callback',
+      callbackUrl: 'http://139.196.252.184:8070/api/onlyoffice/callback',
       customization: {
         autosave: false,
         comments: false,

+ 1 - 1
src/layout/Header/Header.vue

@@ -55,7 +55,7 @@
           </template>
           <!--如果是未登录状态-->
           <template v-else>
-            <el-avatar :size="32" :shape="'circle'"> User</el-avatar>
+            <el-avatar :size="32" :shape="'circle'"> U</el-avatar>
             <div class="nickName">user</div>
           </template>
         </div>

+ 31 - 3
src/views/CourseSquare/component/AllCourse/MoreCourse.vue

@@ -18,9 +18,9 @@
             <img :src="item.courseImages[0]" :alt="item.courseName" class="course-item-img">
           </div>
           <div class="course-item-content">
-            <div style="font-weight: bold">{{item.courseName}}</div>
-            <div>{{item.description}}</div>
-            <div>{{item.teacherIds.join("\n")}}</div>
+            <div style="font-weight: bold; font-size: 16px; margin: 5px 0">{{item.courseName}}</div>
+            <div style="line-height: 1.5" class="collapsed" ><span style="color: rgba(0, 0, 0, 0.6)">课程描述:</span>{{item.description}}</div>
+            <div style="line-height: 1.5; margin-top: 5px" class="collapsed" ><span  style="color: rgba(0, 0, 0, 0.6)">任课教师:</span>{{item.teacherIds.join(",")}}</div>
           </div>
         </el-card>
 
@@ -171,11 +171,26 @@ const fetchData = () => {
   }
 }
 
+const processTeacherName = () => {
+  for(let i:number = 0; i < pageInfo.courseData.length; i++){
+    for(let j = 0; j < pageInfo.courseData[i].teacherIds.length; j++){
+      apis.findUserById(pageInfo.courseData[i].teacherIds[j])
+          .then((res:any) => {
+            pageInfo.courseData[i].teacherIds[j] = res.data.data.records[0].name
+          })
+          .catch((err:any) => {
+            console.log("错误信息",err)
+          })
+    }
+  }
+}
+
 const fetchAllCourse = () => {
   apis.getAllCourse(query, queryInfo.pageNow, queryInfo.pageSize)
       .then((res: any) => {
         console.log(res)
         pageInfo.courseData = res.data.data.records
+        processTeacherName()
         pageInfo.total = res.data.data.total
         Object.assign(pageInfo2Show, pageInfo)
       })
@@ -191,6 +206,7 @@ const fetchCourseByUserId = () => {
         .then((res: any) => {
           console.log(res)
           pageInfo.courseData = res.data.data.records
+          processTeacherName()
           pageInfo.total = res.data.data.total
           Object.assign(pageInfo2Show, pageInfo)
         })
@@ -203,6 +219,7 @@ const fetchCourseByUserId = () => {
         .then((res: any) => {
           console.log(res.data.data)
           pageInfo.courseData = res.data.data.records
+          processTeacherName()
           pageInfo.total = res.data.data.total
           Object.assign(pageInfo2Show, pageInfo)
         })
@@ -228,3 +245,14 @@ export default {
   name: "AllCourse"
 }
 </script>
+
+<style scoped>
+.collapsed {
+  overflow: hidden;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 2; /* Limit to 2 lines */
+  max-height: 3em; /* Height for 2 lines of text */
+  min-height: 3em;
+}
+</style>

+ 5 - 5
src/views/CourseSquare/component/Banner/Banner.vue

@@ -20,27 +20,27 @@
   const pictureItems = reactive([
     {
       id: 1,
-      src:"https://oimagec5.ydstatic.com/image?id=-6825419190637093228&product=xue",
+      src:"http://eai-files.oss-cn-shanghai.aliyuncs.com/uploads/%E5%90%AC%E5%8A%9B.png?Expires=1723824152&OSSAccessKeyId=LTAI5tAbkw8rkreiJbfcY1jZ&Signature=%2BHeaAgMm9Qo8%2Fyi8y0n85HPB3Xo%3D",
       alt:""
     },
     {
       id: 2,
-      src:"https://oimagea7.ydstatic.com/image?id=6277590164074153542&product=xue",
+      src:"http://eai-files.oss-cn-shanghai.aliyuncs.com/uploads/%E4%BA%92%E8%AF%91.png?Expires=1723824596&OSSAccessKeyId=LTAI5tAbkw8rkreiJbfcY1jZ&Signature=f%2FX0RyaFuRc9lRnOnkfMnAJP0DA%3D",
       alt:""
     },
     {
       id: 3,
-      src:"https://oimageb4.ydstatic.com/image?id=2909276266566708157&product=xue",
+      src:"http://eai-files.oss-cn-shanghai.aliyuncs.com/uploads/%E5%B0%8F%E8%AF%B4.png?Expires=1723824605&OSSAccessKeyId=LTAI5tAbkw8rkreiJbfcY1jZ&Signature=x7V%2BrN2jTdHowB5ymzbPAFrPTtk%3D",
       alt:""
     },
     {
       id: 4,
-      src:"https://oimagea4.ydstatic.com/image?id=-5223116784561408160&product=xue",
+      src:"https://nos.netease.com/edu-image/6206b18f29804aeb87d83f360552b8ce.jpg",
       alt:""
     },
     {
       id: 7,
-      src:"https://ts1.cn.mm.bing.net/th/id/R-C.b560e47c90e405b1a86175664b585e48?rik=mV4YsdwHAwpxnQ&riu=http%3a%2f%2fp6.itc.cn%2fq_70%2fimages03%2f20201025%2f498e8932fb724cff93141bb889fd3156.jpeg&ehk=CiqXxYrG292FftMNzIbGKWsVRy2K8Sg35uShW2HNXSs%3d&risl=&pid=ImgRaw&r=0",
+      src:"https://nos.netease.com/edu-image/c76ad7fd5c3644899844c1edc0c11193.jpg",
       alt:""
     },
   ])

+ 10 - 2
src/views/CourseSquare/component/Course/index.scss

@@ -3,15 +3,23 @@
   width: 100%;
   overflow: hidden;
   margin: 40px auto 0 auto;
+  //background-color: red;
 
   .course-header {
-    display: flex;
+    //display: flex;
     margin-bottom: 10px;
+    //background-color: green;
+    display: flex;
+    justify-content: center; /* 水平居中 */
+    align-items: center; /* 垂直居中 */
   }
 
   .header-title {
     font-size: 20px;
-    padding-left: 20%;
+    //padding-left: 400px;
+    width: 1040px; /* 设置盒子宽度 */
+    //background-color: #f0f0f0;
+    text-align: left; /* 文字左对齐 */
   }
 
   .header-more {

+ 8 - 8
src/views/CourseSquare/component/Course/index.vue

@@ -8,10 +8,10 @@
     <div class="course-header">
       <div class="header-title">
       {{ props.title }}
+        <el-button class="header-more" link @click="handleMore">
+          更多>>
+        </el-button>
       </div>
-      <el-button class="header-more" link @click="handleMore">
-        更多>>
-      </el-button>
     </div>
     <div class="course-items-container">
       <el-card v-for="item in getCoursesSlice()" :key="item.courseId" class="course-item active" @click="handleClick(item.courseId)">
@@ -19,9 +19,9 @@
           <img :src="item.courseImages[0]" :alt="item.courseName" class="course-item-img">
         </div>
         <div class="course-item-content">
-          <div style="font-weight: bold">{{item.courseName}}</div>
-          <div class="collapsed">课程描述:{{item.description}}</div>
-          <div>任课教师:{{item.teacherIds.join(",")}}</div>
+          <div style="font-weight: bold; font-size: 16px; margin: 5px 0">{{item.courseName}}</div>
+          <div style="line-height: 1.5;" class="collapsed" ><span style="color: rgba(0, 0, 0, 0.6)">课程描述:</span>{{item.description}}</div>
+          <div style="line-height: 1.5; margin-top: 5px" class="collapsed" ><span  style="color: rgba(0, 0, 0, 0.6)">任课教师:</span>{{item.teacherIds.join(",")}}</div>
         </div>
       </el-card>
       <template v-if="getCoursesSlice().length < 5">
@@ -235,7 +235,7 @@ export default {
   display: -webkit-box;
   -webkit-box-orient: vertical;
   -webkit-line-clamp: 2; /* Limit to 2 lines */
-  max-height: 4em; /* Height for 2 lines of text */
-  min-height: 4em;
+  max-height: 3em; /* Height for 2 lines of text */
+  min-height: 3em;
 }
 </style>

+ 45 - 6
src/views/CourseSquare/component/CourseDetails/component/CourseHomeworkTable.vue

@@ -31,7 +31,8 @@
         </el-table-column>
         <el-table-column :label="role == 'teachers'? '编辑':'写作'" width="60">
           <template #default="scope">
-            <el-button color="#597d3b" circle @click="handleFunctionButton(scope.row.assignmentId)" :disabled="props.disabled || isDisabled(scope.row.teacherId, scope.row.endDate)">
+            <el-button @mouseover="handleMouse('over', scope.row.teacherId, scope.row.endDate)" @mouseleave="handleMouse('leave', scope.row.teacherId, scope.row.endDate)"
+                color="#597d3b" circle @click="handleFunctionButton(scope.row.assignmentId)" :disabled="props.disabled || isDisabled(scope.row.teacherId, scope.row.endDate)">
               <el-icon :size="18">
                 <Edit />
               </el-icon>
@@ -63,7 +64,7 @@
       <el-form-item label="描述文件" v-if="dialogConfig.type == 'edit'">
         <el-upload
             ref="uploadDescribeRef"
-            action= "http://127.0.0.1:8080/api/file"
+            action= "http://139.196.252.184:8070/api/file"
             multiple
             v-model:file-list="describeFileList"
             :limit="1"
@@ -85,7 +86,7 @@
       <el-form-item label="附件" v-if="dialogConfig.type == 'edit'">
         <el-upload
             ref="uploadPictureRef"
-            action= "http://127.0.0.1:8080/api/file"
+            action= "http://139.196.252.184:8070/api/file"
             multiple
             v-model:file-list="pictureFileList"
             :limit="1"
@@ -232,6 +233,13 @@ import {defineProps, inject, onMounted, reactive, ref} from 'vue';
       uploadDescribeRef.value.clearFiles()  //清空上传文件
       return false;
     }
+    apis.uploadFile(file.raw)
+        .then((res) => {
+          newAssignmentInfo.descriptionFile = res.data.data
+        })
+        .catch((err) => {
+          console.log(err)
+        })
   }
   const handlePictureChange = (file,fileList) => {
     // console.log(file)
@@ -249,6 +257,13 @@ import {defineProps, inject, onMounted, reactive, ref} from 'vue';
       uploadDescribeRef.value.clearFiles()  //清空上传文件
       return false;
     }
+    apis.uploadFile(file.raw)
+        .then((res) => {
+          newAssignmentInfo.attachments[0] = res.data.data
+        })
+        .catch((err) => {
+          console.log(err)
+        })
   }
 
   const dialogConfig = reactive({
@@ -345,6 +360,32 @@ const openEditor = (url: string, title: string) => {
     // console.log("获取作业信息", newAssignmentInfo)
   }
 
+  /*
+  鼠标聚焦于功能按钮(写作or编辑)时,显示提示信息
+   */
+  let hover = false
+  const handleMouse = (type: string, teacherId:string, endDate:string) => {
+    if(!hover && type == 'over'){
+       hover = true;
+       //如果被禁用则提示
+      if(props.disabled || isDisabled(teacherId, endDate)){
+        if(props.role == 'student'){
+          ElMessage({
+            message: '作业已经超过截止时间',
+            type: 'message',
+          })
+        }else if(props.role == 'teachers'){
+          ElMessage({
+            message: '无权限',
+            type: 'message',
+          })
+        }
+      }
+    } else if(hover && type == 'leave'){
+      hover = false
+    }
+  }
+
   // 用于记录当前编辑的作业的id
   let IAssignmentId = ref(0)
   const handleFunctionButton = (assignmentId:number) => {
@@ -371,8 +412,6 @@ const openEditor = (url: string, title: string) => {
     // console.log("提交方法最开始",newAssignmentInfo)
     newAssignmentInfo.endTime = formatDate(newAssignmentInfo.endTime);
     newAssignmentInfo.startTime = formatDate(newAssignmentInfo.startTime);
-    await uploadDescribeRef.value.submit()
-    await uploadPictureRef.value.submit()
     // console.log("提交方法,请求前",newAssignmentInfo)
     if(dialogConfig.type === 'add'){
       apis.createAssignment(props.courseId, newAssignmentInfo)
@@ -406,7 +445,7 @@ const openEditor = (url: string, title: string) => {
                 type: 'success',
               })
               // console.log("编辑作业请求内部22",newAssignmentInfo)
-              setTimeout(() => apis.updateAssignment(IAssignmentId.value, newAssignmentInfo), 300)
+              // setTimeout(() => apis.updateAssignment(IAssignmentId.value, newAssignmentInfo), 300)
               // console.log("编辑作业请求内部33",newAssignmentInfo)
             }else {
               ElNotification({

+ 5 - 0
src/views/CourseSquare/component/CourseDetails/index.scss

@@ -29,6 +29,11 @@
 
     .title {
       font-size: 18px;
+      font-weight: bold;
+    }
+
+    .item-title{
+      color: rgba(0, 0, 0, 0.6)
     }
 
     .item {

+ 91 - 18
src/views/CourseSquare/component/CourseDetails/index.vue

@@ -14,13 +14,16 @@
           {{dataForm.courseName}}
         </div>
         <div class="item">
-          任课老师:{{dataForm.teacherNames?.join(",")}}
+          <span class="item-title">任课老师:</span>
+          {{dataForm.teacherNames?.join(",")}}
         </div>
         <div class="item">
-          目标学生:{{dataForm.targetGrade}}
+          <span class="item-title">目标学生:</span>
+          {{dataForm.targetGrade}}
         </div>
         <div class="item">
-          起止时间:{{new Date(Date.parse(dataForm.startTime)).toLocaleString()}} - {{new Date(Date.parse(dataForm.endTime)).toLocaleString()}}
+          <span class="item-title">起止时间:</span>
+          {{new Date(Date.parse(dataForm.startTime)).toLocaleString()}} - {{new Date(Date.parse(dataForm.endTime)).toLocaleString()}}
         </div>
         <div>
           <template v-if="showCode && role == 'student'">
@@ -49,25 +52,22 @@
     </div>
   </div>
 
-  <el-dialog v-model="visible" title="编辑课程">
-    <el-form :model="newCourseInfo" label-width="auto">
+  <el-dialog v-model="visible" title="编辑课程" >
+    <el-form :model="newCourseInfo" label-width="auto" :rules="editCourseRules" ref="formRef">
 <!--      <el-form-item label="课程图片">-->
-      <el-form-item label="课程名称">
+      <el-form-item label="课程名称" prop="courseName">
         <el-input v-model="newCourseInfo.courseName" placeholder="请输入名称"></el-input>
       </el-form-item>
-      <el-form-item label="面向年级">
+      <el-form-item label="面向年级" prop="courseName">
         <el-input v-model="newCourseInfo.targetGrade" placeholder="请输入年级"></el-input>
       </el-form-item>
-      <el-form-item label="描述">
-        <el-input v-model="newCourseInfo.description" placeholder="请输入描述"></el-input>
-      </el-form-item>
-      <el-form-item label="开始时间">
+      <el-form-item label="开始时间" prop="startTime">
         <el-date-picker v-model="newCourseInfo.startTime" type="datetime" placeholder="截止时间" style="width: 180px"/>
       </el-form-item>
-      <el-form-item label="截止时间">
+      <el-form-item label="截止时间" prop="endTime">
         <el-date-picker v-model="newCourseInfo.endTime" type="datetime" placeholder="截止时间" style="width: 180px"/>
       </el-form-item>
-      <el-form-item label="选课码">
+      <el-form-item label="选课码" prop="enrollCode">
         <el-input v-model="newCourseInfo.enrollCode" placeholder="请输入选课码"></el-input>
       </el-form-item>
 <!--      <el-form-item label="课程图片">-->
@@ -77,7 +77,7 @@
         <el-upload
             ref="uploadRef"
             drag
-            action= "http://127.0.0.1:8080/api/file"
+            action="http://139.196.252.184:8070/api/file"
             multiple
             v-model:file-list="fileList"
             :limit="1"
@@ -100,11 +100,14 @@
           </template>
         </el-upload>
       </el-form-item>
+      <el-form-item label="描述" prop="description">
+        <el-input v-model="newCourseInfo.description" placeholder="请输入描述" type="textarea" :rows="3"></el-input>
+      </el-form-item>
     </el-form>
     <template #footer>
       <div class="dialog-footer">
         <el-button @click="visible = false">取消</el-button>
-        <el-button type="primary" @click="handleSubmit">确定</el-button>
+        <el-button type="primary" @click="submitForm(formRef)">确定</el-button>
       </div>
     </template>
   </el-dialog>
@@ -120,7 +123,7 @@ import {
   ElAvatar,
   ElMessage,
   ElNotification,
-  type UploadFiles, type UploadFile
+  type UploadFiles, type UploadFile, type FormRules, type FormInstance
 } from 'element-plus';
 import './index.scss'
 import type {CourseDetailVO, CourseVO, IAssignment, IAssignmentTableColumn, IAssignmentTableItem} from "@/types/vo";
@@ -181,6 +184,53 @@ let query = reactive<AssignmentQuery>({
   status:null,
 })
 
+const editCourseRules = reactive<FormRules>({
+  courseName: [
+    {
+      required: true,
+      message: "课程名称不能为空",
+      trigger: 'blur'
+    }
+  ],
+  targetGrade: [
+    {
+      required: true,
+      message: "面向年级不能为空",
+      trigger: 'blur'
+    }
+  ],
+  startTime: [
+    {
+      type: 'date',
+      required: true,
+      message: "开始时间不能为空",
+      trigger: 'blur'
+    }
+  ],
+  endTime: [
+    {
+      type: 'date',
+      required: true,
+      message: "截止时间不能为空",
+      trigger: 'blur'
+    }
+  ],
+  enrollCode: [
+    {
+      required: true,
+      message: "选课码不能为空",
+      trigger: 'blur'
+    }
+  ],
+  description: [
+    {
+      required: true,
+      message: "描述不能为空",
+      trigger: 'blur'
+    }
+  ]
+})
+
 const activeTab = ref('课程简介');
 const items = ref([
   { label: '课程简介', key: '课程简介'},
@@ -215,10 +265,12 @@ let homeworkList = ref<IAssignmentTableItem[]>([]);
 const fileList = ref<UploadUserFile[]>([])
 
 const handleSuccess: UploadProps['onSuccess'] = (response: any, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
+  console.log("上传成功", response.data)
   newCourseInfo.courseImages[0] = response.data
 }
 
 const handleError: UploadProps['onError'] = (error: Error, uploadFile: UploadFile, uploadFiles: UploadFiles) => {
+  console.log("上传失败", error)
   console.log(error, uploadFile, uploadFiles)
 }
 
@@ -245,6 +297,13 @@ const handleChange = (file,fileList) => {
     uploadRef.value.clearFiles()  //清空上传文件
     return false;
   }
+  apis.uploadFile(file.raw)
+      .then((res) => {
+        newCourseInfo.courseImages[0] = res.data.data
+      })
+      .catch((err) => {
+        console.log(err)
+      })
 }
 
 
@@ -271,6 +330,7 @@ const getCourse = () => {
         Object.assign(dataForm, {...data})
         processCourses()
         getNewCourseInfo(dataForm)
+        console.log("课程信息",dataForm)
       })
       .catch((err: any) => {
         console.error(err);
@@ -418,10 +478,23 @@ function formatDate(date:string) {
   return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
 }
 
+let formRef = ref<FormInstance>()
+const submitForm = async (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  await formEl.validate((valid, fields) => {
+    if (valid) {
+      console.log('submit!')
+      handleSubmit()
+    } else {
+      console.log('error submit!', fields)
+    }
+  })
+}
+
 const handleSubmit = () => {
   newCourseInfo.endTime = formatDate(newCourseInfo.endTime)
   newCourseInfo.startTime = formatDate(newCourseInfo.startTime)
-  console.log(uploadRef.value!.submit())
+  // uploadRef.value!.submit()
   console.log(newCourseInfo)
   // TODO: 更新图片需要更新两次,不知道为什么
   apis.updateCourse(dataForm.courseId, newCourseInfo)
@@ -436,7 +509,7 @@ const handleSubmit = () => {
             .then((res:any) => {
               console.log(res.data.data.records[0])
             })
-        setTimeout(() => apis.updateCourse(dataForm.courseId, newCourseInfo), 500)
+        // setTimeout(() => apis.updateCourse(dataForm.courseId, newCourseInfo), 500)
       }else {
         ElNotification({
           title: '修改失败',

+ 8 - 4
src/views/EditPage/EditPage.vue

@@ -8,6 +8,7 @@
   <div class="my-work">
 
     <div class="my-work-slider">
+      <el-button class="back" color="#597D3B" @click="handleBack">&lt;返回</el-button>
       <AIChatter :dialogueId="dataForm.dialogueId" :messages="dataForm.messages" />
 
       <Dictionaries />
@@ -50,15 +51,18 @@
     engagement: {} as engagementVO
   })
 
+  const handleBack = () => {
+    router.push(`/home/homeworkDetail/${assignmentId}`)
+  }
+
   // 获取数据
   async function fetchData(){
     await apis.getAIDialogues(assignmentId, store.user.id)
         .then((_res:any) => {
           const data = _res.data.data
           Object.assign(dataForm, {
-            dialogueId: data?.dialogueId,
-            //TODO:AI对话拿到的字符串
-            messages: data?.messages.content,
+            dialogueId: data == null ? '': data?.dialogueId,
+            messages: data == null ? []: data?.messages.content,
             engagement: dataForm.engagement
           })
         })
@@ -71,7 +75,7 @@
             engagement: _res.data.data
           })
         }).catch((_err:any) => {
-          router.push("/login")
+          console.log("错误", _err)
         })
   }
 

+ 4 - 0
src/views/EditPage/index.scss

@@ -12,6 +12,10 @@
     flex-direction: column;
     gap: 10px;
     flex-shrink: 0;
+    .back{
+      text-align: left; /* 文字左对齐 */
+      width: 70px;
+    }
   }
 
   .my-work-input {

+ 2 - 2
src/views/Home/component/Edit/index.vue

@@ -121,8 +121,8 @@
           });
     } else if (data.isModified) {
       error('编辑内容未保存,请保存后提交!');
-    } else if (!data.hasModified) {
-      error('尚未编辑,不可提交!');
+    // } else if (!data.hasModified) {
+    //   error('尚未编辑,不可提交!');
     } else {
       error('未知错误!');
     }

+ 2 - 2
src/views/Home/component/StudentEssay/StudentEssay.vue

@@ -22,7 +22,7 @@
             :src="officeUrl"
             frameborder="0"
             width="100%"
-            height="560px" 
+            height="560px"
         >
         </iframe>
     </div>
@@ -108,7 +108,7 @@ const props = defineProps<{
 }
 .iframe-wrapper {  
   margin-top: 20px; /* 上边距 */  
-  margin-bottom: 20px; /* 下边距 */  
+  margin-bottom: 20px; /* 下边距 */
 } 
 </style>
 

+ 27 - 18
src/views/HomeworkPage/component/HomeworkDetail.vue

@@ -21,28 +21,28 @@
           {{new Date(Date.parse(data.endTime)).toLocaleString()}}
         </div>
         <div class="item">
-          <el-link type="primary" @click="console.log('文件下载')">相关文件下载</el-link>
+          <el-link type="primary" @click="downloadFile(data.descriptionFile, `${data.assignmentName}-描述文件`)">相关文件下载</el-link>
           <el-button color="#597d3b" size="large" style="margin-left: 660px" @click="handleWriting()" :disabled="new Date() > new Date(data.endTime)">开始写作</el-button>
         </div>
       </div>
     </div>
-    <div class="homework-details-title">
-      评论区
-    </div>
-    <div class="homework-remark">
-      <div>
-        <el-skeleton style="width: 240px" animated >
-          <template #template>
-            <el-skeleton-item variant="circle" style="--el-skeleton-circle-size: 40px"></el-skeleton-item>
-            <el-skeleton-item variant="text" style="height: 40px;width: 200px; margin-left: 30px"></el-skeleton-item>
-          </template>
-        </el-skeleton>
-      </div>
-      <div>
-        <el-input type="textarea" style="width: 100%;margin: 20px 0"></el-input>
-        <el-button color="#597d3b" size="large" style="float: right" :disabled="true">发布</el-button>
-      </div>
-    </div>
+<!--    <div class="homework-details-title">-->
+<!--      评论区-->
+<!--    </div>-->
+<!--    <div class="homework-remark">-->
+<!--      <div>-->
+<!--        <el-skeleton style="width: 240px" animated >-->
+<!--          <template #template>-->
+<!--            <el-skeleton-item variant="circle" style="&#45;&#45;el-skeleton-circle-size: 40px"></el-skeleton-item>-->
+<!--            <el-skeleton-item variant="text" style="height: 40px;width: 200px; margin-left: 30px"></el-skeleton-item>-->
+<!--          </template>-->
+<!--        </el-skeleton>-->
+<!--      </div>-->
+<!--      <div>-->
+<!--        <el-input type="textarea" style="width: 100%;margin: 20px 0"></el-input>-->
+<!--        <el-button color="#597d3b" size="large" style="float: right" :disabled="true">发布</el-button>-->
+<!--      </div>-->
+<!--    </div>-->
   </div>
 </template>
 
@@ -80,6 +80,15 @@ function handleWriting(){
   router.push(`/home/assignment/${assignmentId}/edit`)
 }
 
+function downloadFile(url:string, fileName:string) {
+  const link = document.createElement('a');
+  link.href = url;
+  //link.download = fileName;
+  //link.target = "_blank"; // 可选,如果希望在新窗口中下载文件,请取消注释此行
+  link.click();
+}
+
+
 async function getEngagement(){
   apis.getEngagement(store.user.id, assignmentId)
       .then((_res:any) => {