From f901a2897f8fbdca4fb506467d88bd4ff6ba080e Mon Sep 17 00:00:00 2001 From: lu Date: Thu, 25 Jul 2024 11:20:20 +0800 Subject: [PATCH 01/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CoursePortalApi.java | 104 +++++++++++++++++- .../course/service/ICourseContentService.java | 2 + .../impl/CourseContentServiceImpl.java | 6 + 3 files changed, 107 insertions(+), 5 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 1b8801a7..1a973612 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -1,11 +1,18 @@ package com.xboe.module.course.api; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URLEncoder; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import com.xboe.api.ThirdApi; import com.xboe.api.vo.AuditList; @@ -14,6 +21,12 @@ import com.xboe.api.vo.UserDynamic; import com.xboe.api.vo.UserdynamicParam; import com.xboe.common.OrderCondition; import com.xboe.core.JsonResponseStatus; +import com.xboe.core.orm.FieldFilters; +import com.xboe.module.course.dao.CourseContentDao; +import com.xboe.module.course.dao.CourseDao; +import com.xboe.module.course.dao.CourseHomeWorkDao; +import com.xboe.module.course.dao.CourseSectionDao; +import com.xboe.module.course.entity.*; import com.xboe.module.course.vo.TeacherVo; import com.xboe.module.usergroup.entity.UserGroupItem; import org.apache.commons.lang3.StringUtils; @@ -34,11 +47,6 @@ import com.xboe.core.api.ApiBaseController; import com.xboe.module.course.dto.CourseQueryDto; import com.xboe.module.course.dto.CourseTeacherDto; import com.xboe.module.course.dto.RankingDto; -import com.xboe.module.course.entity.Course; -import com.xboe.module.course.entity.CourseContent; -import com.xboe.module.course.entity.CourseCrowd; -import com.xboe.module.course.entity.CourseSection; -import com.xboe.module.course.entity.CourseTeacher; import com.xboe.module.course.service.ICourseContentService; import com.xboe.module.course.service.ICourseSectionService; import com.xboe.module.course.service.ICourseService; @@ -89,6 +97,18 @@ public class CoursePortalApi extends ApiBaseController{ @Resource private ThirdApi thirdApi; + @Resource + private CourseHomeWorkDao homeworkDao; + + @Resource + private CourseContentDao ccDao; + + @Resource + private CourseSectionDao courseSectionDao; + + @Resource + private CourseDao courseDao; + @Autowired StringRedisTemplate redisTemplate; @@ -347,7 +367,81 @@ public class CoursePortalApi extends ApiBaseController{ } } + //作业导出 + @GetMapping("/export") + public void export(String contentId,HttpServletResponse response) throws IOException { + //将courseId以逗号分割转换为list + List contentIds = Arrays.asList(contentId.split(",")); + Mapmap=new HashMap<>(); + try { + homeworkDao.findList(FieldFilters.in("content_id", contentIds)).stream().filter(Objects::nonNull).forEach(e -> { + //查询内容名称 + CourseContent courseContent=contentService.getById(e.getContentId()); + if(courseContent!=null &&courseContent.getContentName()==null){ + courseContent.setContentName("作业"); + } + //查询目录 + List courseSections = sectionService.getByCourseId(e.getCourseId()); + //取作业后缀名 + int dotIndex = e.getFile().lastIndexOf('.'); // 查找最后一个'.'的位置 + String extension = e.getFile().substring(dotIndex); + //判断是否有目录 + if(!courseSections.isEmpty()){ + map.put(courseSections.get(0).getName()+"--"+courseContent.getContentName()+extension, e.getFile()); + }else { + Course course=courseDao.get(e.getCourseId()); + if(course==null || course.getDeleted()){ + throw new RuntimeException("课程不存在或已被删除"); + } + map.put(course.getName()+"--"+courseContent.getContentName()+extension, e.getFile()); + } + }); + } catch (Exception e) { + throw new RuntimeException("导出异常"); + } + long totalCompressedSize = 0; + String encodedFilename = URLEncoder.encode("作业.zip") + .replace("+", "%20") // 空格替换为"%20" + .replace("%2F", "/"); // 解决斜杠问题 + try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { + for (Map.Entry e : map.entrySet()) { + File fileToZip = new File(e.getValue()); + // 检查加上当前文件大小后,是否会超过2GB + long fileSizeInBytes = fileToZip.length(); + if (totalCompressedSize + fileSizeInBytes > 2L * 1024 * 1024 * 1024) { + throw new RuntimeException("您要下载的作业过大,请分批下载或联系管理员!"); + } + // 添加 ZIP 条目 + ZipEntry entry = new ZipEntry(e.getKey()); + entry.setSize(fileToZip.length()); + + zos.putNextEntry(entry); + + try (FileInputStream fis = new FileInputStream(fileToZip)) { + byte[] buffer = new byte[4096]; + int len; + while ((len = fis.read(buffer)) > 0) { + zos.write(buffer, 0, len); + totalCompressedSize += len; + } + } + + zos.closeEntry(); + + StringBuilder contentDispositionValue = new StringBuilder(); + contentDispositionValue.append("attachment; filename=") + .append(encodedFilename) + .append(";") + .append("filename*=") + .append("utf-8''") + .append(encodedFilename); + // 设置响应类型和Content-Disposition头 + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", contentDispositionValue.toString()); + } + } + } @GetMapping("/detail-study") public JsonResponse> detailStudy(String courseId, String aid){ if(StringUtil.isBlank(courseId)){ diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java index 4e5e2f83..defc2883 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java @@ -82,4 +82,6 @@ public interface ICourseContentService{ * @return */ CourseAssess getAssess(String ccid); + + CourseContent getById(String contentId); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java index c2cc351d..98bcc172 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java @@ -141,6 +141,12 @@ public class CourseContentServiceImpl implements ICourseContentService { return assess; } + @Override + public CourseContent getById(String contentId) { + CourseContent courseContent = ccDao.findOne(FieldFilters.eq("id", contentId)); + return courseContent; + } + @Override @Transactional public void updateName(String id, String name) { From 29ca9d61f9006a44dd41e8eedca91cc30e3ed1de Mon Sep 17 00:00:00 2001 From: lu Date: Thu, 25 Jul 2024 14:06:05 +0800 Subject: [PATCH 02/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8A=E4=BC=A0=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/module/course/api/CoursePortalApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 1a973612..80a520c6 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -387,7 +387,7 @@ public class CoursePortalApi extends ApiBaseController{ String extension = e.getFile().substring(dotIndex); //判断是否有目录 if(!courseSections.isEmpty()){ - map.put(courseSections.get(0).getName()+"--"+courseContent.getContentName()+extension, e.getFile()); + map.put(courseSections.get(0).getName()+"--"+courseContent.getContentName()+extension, "/home/www/elearning/upload"+e.getFile()); }else { Course course=courseDao.get(e.getCourseId()); if(course==null || course.getDeleted()){ From 5116c1ebc5fbb62da518fb582056859286267e09 Mon Sep 17 00:00:00 2001 From: lu Date: Thu, 25 Jul 2024 14:54:06 +0800 Subject: [PATCH 03/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CoursePortalApi.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 80a520c6..f6f605d1 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -428,18 +428,17 @@ public class CoursePortalApi extends ApiBaseController{ } zos.closeEntry(); - - StringBuilder contentDispositionValue = new StringBuilder(); - contentDispositionValue.append("attachment; filename=") - .append(encodedFilename) - .append(";") - .append("filename*=") - .append("utf-8''") - .append(encodedFilename); - // 设置响应类型和Content-Disposition头 - response.setContentType("application/zip"); - response.setHeader("Content-Disposition", contentDispositionValue.toString()); } + StringBuilder contentDispositionValue = new StringBuilder(); + contentDispositionValue.append("attachment; filename=") + .append(encodedFilename) + .append(";") + .append("filename*=") + .append("utf-8''") + .append(encodedFilename); + // 设置响应类型和Content-Disposition头 + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", contentDispositionValue.toString()); } } @GetMapping("/detail-study") From 5387a90f3a261965c2d2ddb9db786193703c72f9 Mon Sep 17 00:00:00 2001 From: lu Date: Thu, 25 Jul 2024 15:21:37 +0800 Subject: [PATCH 04/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CoursePortalApi.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index f6f605d1..743e91cb 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -399,11 +399,20 @@ public class CoursePortalApi extends ApiBaseController{ } catch (Exception e) { throw new RuntimeException("导出异常"); } - - long totalCompressedSize = 0; String encodedFilename = URLEncoder.encode("作业.zip") .replace("+", "%20") // 空格替换为"%20" .replace("%2F", "/"); // 解决斜杠问题 + StringBuilder contentDispositionValue = new StringBuilder(); + contentDispositionValue.append("attachment; filename=\"") + .append(encodedFilename) + .append("\"") + .append("; filename*=utf-8''") + .append(encodedFilename); + + // 设置响应类型和Content-Disposition头 + response.setContentType("application/zip"); + response.setHeader("Content-Disposition", contentDispositionValue.toString()); + long totalCompressedSize = 0; try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { for (Map.Entry e : map.entrySet()) { File fileToZip = new File(e.getValue()); @@ -429,16 +438,6 @@ public class CoursePortalApi extends ApiBaseController{ zos.closeEntry(); } - StringBuilder contentDispositionValue = new StringBuilder(); - contentDispositionValue.append("attachment; filename=") - .append(encodedFilename) - .append(";") - .append("filename*=") - .append("utf-8''") - .append(encodedFilename); - // 设置响应类型和Content-Disposition头 - response.setContentType("application/zip"); - response.setHeader("Content-Disposition", contentDispositionValue.toString()); } } @GetMapping("/detail-study") From 8dffbfda042d6f93927b332d6c0225abe3c0a247 Mon Sep 17 00:00:00 2001 From: lu Date: Thu, 25 Jul 2024 15:52:22 +0800 Subject: [PATCH 05/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/module/course/api/CoursePortalApi.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 743e91cb..16331c8e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -369,7 +369,7 @@ public class CoursePortalApi extends ApiBaseController{ } //作业导出 @GetMapping("/export") - public void export(String contentId,HttpServletResponse response) throws IOException { + public void export(String contentId, String courseName,HttpServletResponse response) throws IOException { //将courseId以逗号分割转换为list List contentIds = Arrays.asList(contentId.split(",")); Mapmap=new HashMap<>(); @@ -393,13 +393,13 @@ public class CoursePortalApi extends ApiBaseController{ if(course==null || course.getDeleted()){ throw new RuntimeException("课程不存在或已被删除"); } - map.put(course.getName()+"--"+courseContent.getContentName()+extension, e.getFile()); + map.put(course.getName()+"--"+courseContent.getContentName()+extension, "/home/www/elearning/upload"+e.getFile()); } }); } catch (Exception e) { throw new RuntimeException("导出异常"); } - String encodedFilename = URLEncoder.encode("作业.zip") + String encodedFilename = URLEncoder.encode(courseName+"【作业】.zip") .replace("+", "%20") // 空格替换为"%20" .replace("%2F", "/"); // 解决斜杠问题 StringBuilder contentDispositionValue = new StringBuilder(); From e5085510434c98a64ed421e66d1273b251e85df4 Mon Sep 17 00:00:00 2001 From: lu Date: Tue, 30 Jul 2024 11:53:53 +0800 Subject: [PATCH 06/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CoursePortalApi.java | 71 ++++++++++--------- .../course/service/ICourseContentService.java | 1 - .../impl/CourseContentServiceImpl.java | 6 -- .../school/study/api/StudyHomeWorkApi.java | 2 +- .../study/service/IStudyHomeWorkService.java | 3 + .../impl/StudyHomeWorkServiceImpl.java | 5 ++ 6 files changed, 45 insertions(+), 43 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 16331c8e..2c09241d 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -29,6 +29,8 @@ import com.xboe.module.course.dao.CourseSectionDao; import com.xboe.module.course.entity.*; import com.xboe.module.course.vo.TeacherVo; import com.xboe.module.usergroup.entity.UserGroupItem; +import com.xboe.school.study.entity.StudyHomeWork; +import com.xboe.school.study.service.IStudyHomeWorkService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; @@ -97,17 +99,8 @@ public class CoursePortalApi extends ApiBaseController{ @Resource private ThirdApi thirdApi; - @Resource - private CourseHomeWorkDao homeworkDao; - - @Resource - private CourseContentDao ccDao; - - @Resource - private CourseSectionDao courseSectionDao; - - @Resource - private CourseDao courseDao; + @Autowired + IStudyHomeWorkService shomeworkService; @Autowired StringRedisTemplate redisTemplate; @@ -369,35 +362,43 @@ public class CoursePortalApi extends ApiBaseController{ } //作业导出 @GetMapping("/export") - public void export(String contentId, String courseName,HttpServletResponse response) throws IOException { - //将courseId以逗号分割转换为list - List contentIds = Arrays.asList(contentId.split(",")); + public void export(String contentId, String courseName,String studentName,HttpServletResponse response) throws IOException { +// 将courseId以逗号分割转换为list + List studentNames = Arrays.asList(studentName.split(",")); Mapmap=new HashMap<>(); try { - homeworkDao.findList(FieldFilters.in("content_id", contentIds)).stream().filter(Objects::nonNull).forEach(e -> { - //查询内容名称 - CourseContent courseContent=contentService.getById(e.getContentId()); - if(courseContent!=null &&courseContent.getContentName()==null){ - courseContent.setContentName("作业"); - } - //查询目录 - List courseSections = sectionService.getByCourseId(e.getCourseId()); +// homeworkDao.findList(FieldFilters.in("content_id", contentIds)).stream().filter(Objects::nonNull).forEach(e -> { +// //查询内容名称 +// CourseContent courseContent=contentService.getById(e.getContentId()); +// if(courseContent!=null &&courseContent.getContentName()==null){ +// courseContent.setContentName("作业"); +// } +// //查询目录 +// List courseSections = sectionService.getByCourseId(e.getCourseId()); +// //取作业后缀名 +// int dotIndex = e.getFile().lastIndexOf('.'); // 查找最后一个'.'的位置 +// String extension = e.getFile().substring(dotIndex); +// //判断是否有目录 +// if(!courseSections.isEmpty()){ +// map.put(courseSections.get(0).getName()+"--"+courseContent.getContentName()+extension, "/home/www/elearning/upload"+e.getFile()); +// }else { +// Course course=courseDao.get(e.getCourseId()); +// if(course==null || course.getDeleted()){ +// throw new RuntimeException("课程不存在或已被删除"); +// } +// map.put(course.getName()+"--"+courseContent.getContentName()+extension, "/home/www/elearning/upload"+e.getFile()); +// } +// }); + shomeworkService.getByStudnetNameAndContentId(studentNames,contentId).stream().filter(Objects::nonNull).filter(e->e.getFilePath()!=null).forEach(e->{ //取作业后缀名 - int dotIndex = e.getFile().lastIndexOf('.'); // 查找最后一个'.'的位置 - String extension = e.getFile().substring(dotIndex); - //判断是否有目录 - if(!courseSections.isEmpty()){ - map.put(courseSections.get(0).getName()+"--"+courseContent.getContentName()+extension, "/home/www/elearning/upload"+e.getFile()); - }else { - Course course=courseDao.get(e.getCourseId()); - if(course==null || course.getDeleted()){ - throw new RuntimeException("课程不存在或已被删除"); - } - map.put(course.getName()+"--"+courseContent.getContentName()+extension, "/home/www/elearning/upload"+e.getFile()); - } + int dotIndex = e.getFilePath().lastIndexOf('/'); // 查找最后一个'.'的位置 + String extension = e.getFilePath().substring(dotIndex+1); + map.put(extension,e.getFilePath()); }); + } catch (Exception e) { - throw new RuntimeException("导出异常"); + e.printStackTrace(); + throw new RuntimeException("导出异常"+e.getMessage()); } String encodedFilename = URLEncoder.encode(courseName+"【作业】.zip") .replace("+", "%20") // 空格替换为"%20" diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java index defc2883..aca7af5e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java @@ -83,5 +83,4 @@ public interface ICourseContentService{ */ CourseAssess getAssess(String ccid); - CourseContent getById(String contentId); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java index 98bcc172..c2cc351d 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java @@ -141,12 +141,6 @@ public class CourseContentServiceImpl implements ICourseContentService { return assess; } - @Override - public CourseContent getById(String contentId) { - CourseContent courseContent = ccDao.findOne(FieldFilters.eq("id", contentId)); - return courseContent; - } - @Override @Transactional public void updateName(String id, String name) { diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyHomeWorkApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyHomeWorkApi.java index b8d2c037..87e560e8 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyHomeWorkApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyHomeWorkApi.java @@ -33,7 +33,7 @@ public class StudyHomeWorkApi extends ApiBaseController{ IStudyHomeWorkService shomeworkService; @Resource private ThirdApi thirdApi; - @PostMapping("/save") + @PostMapping("/`save`") public JsonResponse save(@RequestBody StudyHomeWork shw, HttpServletRequest request){ if(StringUtils.isBlank(shw.getCourseId())) { return badRequest("无课程信息"); diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyHomeWorkService.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyHomeWorkService.java index 8d50ca19..ba2586bc 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyHomeWorkService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyHomeWorkService.java @@ -1,5 +1,6 @@ package com.xboe.school.study.service; +import java.util.Collection; import java.util.List; import com.xboe.school.study.entity.StudyHomeWork; @@ -29,4 +30,6 @@ public interface IStudyHomeWorkService { * @return */ List getByStudyIdAndContentId(String studyId,String contentId); + + ListgetByStudnetNameAndContentId(List studentName, String contentId); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyHomeWorkServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyHomeWorkServiceImpl.java index 4a609e96..2396d5f8 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyHomeWorkServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyHomeWorkServiceImpl.java @@ -89,4 +89,9 @@ public class StudyHomeWorkServiceImpl implements IStudyHomeWorkService{ return dao.findList(FieldFilters.eq("studyId", studyId),FieldFilters.eq("contentId", contentId)); } + @Override + public List getByStudnetNameAndContentId(List studentName, String contentId) { + return dao.findList(FieldFilters.in("student_name", studentName),FieldFilters.eq("contentId", contentId)); + } + } From 9b8487b0caaf915afc6da0160738554edbe4f4d2 Mon Sep 17 00:00:00 2001 From: lu Date: Tue, 30 Jul 2024 15:26:39 +0800 Subject: [PATCH 07/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CoursePortalApi.java | 42 ++++++------------- .../school/study/service/IStudyService.java | 2 + .../study/service/impl/StudyServiceImpl.java | 28 +++++++++++++ 3 files changed, 42 insertions(+), 30 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 2c09241d..d1566b73 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -31,6 +31,7 @@ import com.xboe.module.course.vo.TeacherVo; import com.xboe.module.usergroup.entity.UserGroupItem; import com.xboe.school.study.entity.StudyHomeWork; import com.xboe.school.study.service.IStudyHomeWorkService; +import com.xboe.school.study.service.IStudyService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; @@ -102,6 +103,9 @@ public class CoursePortalApi extends ApiBaseController{ @Autowired IStudyHomeWorkService shomeworkService; + @Autowired + IStudyService studyService; + @Autowired StringRedisTemplate redisTemplate; @@ -362,38 +366,16 @@ public class CoursePortalApi extends ApiBaseController{ } //作业导出 @GetMapping("/export") - public void export(String contentId, String courseName,String studentName,HttpServletResponse response) throws IOException { -// 将courseId以逗号分割转换为list - List studentNames = Arrays.asList(studentName.split(",")); + public void export(String courseName,String courseId,String contentId,String name,Integer status,HttpServletResponse response) throws IOException { Mapmap=new HashMap<>(); try { -// homeworkDao.findList(FieldFilters.in("content_id", contentIds)).stream().filter(Objects::nonNull).forEach(e -> { -// //查询内容名称 -// CourseContent courseContent=contentService.getById(e.getContentId()); -// if(courseContent!=null &&courseContent.getContentName()==null){ -// courseContent.setContentName("作业"); -// } -// //查询目录 -// List courseSections = sectionService.getByCourseId(e.getCourseId()); -// //取作业后缀名 -// int dotIndex = e.getFile().lastIndexOf('.'); // 查找最后一个'.'的位置 -// String extension = e.getFile().substring(dotIndex); -// //判断是否有目录 -// if(!courseSections.isEmpty()){ -// map.put(courseSections.get(0).getName()+"--"+courseContent.getContentName()+extension, "/home/www/elearning/upload"+e.getFile()); -// }else { -// Course course=courseDao.get(e.getCourseId()); -// if(course==null || course.getDeleted()){ -// throw new RuntimeException("课程不存在或已被删除"); -// } -// map.put(course.getName()+"--"+courseContent.getContentName()+extension, "/home/www/elearning/upload"+e.getFile()); -// } -// }); - shomeworkService.getByStudnetNameAndContentId(studentNames,contentId).stream().filter(Objects::nonNull).filter(e->e.getFilePath()!=null).forEach(e->{ - //取作业后缀名 - int dotIndex = e.getFilePath().lastIndexOf('/'); // 查找最后一个'.'的位置 - String extension = e.getFilePath().substring(dotIndex+1); - map.put(extension,e.getFilePath()); + studyService.getList(courseId, contentId, name, status).stream().filter(Objects::nonNull).forEach(s->{ + shomeworkService.getByStudyIdAndContentId(s.getStudyId(),contentId).stream().filter(Objects::nonNull).filter(e->e.getFilePath()!=null).forEach(e->{ + //取作业后缀名 + int dotIndex = e.getFilePath().lastIndexOf('/'); // 查找最后一个'.'的位置 + String extension = e.getFilePath().substring(dotIndex+1); + map.put(extension,e.getFilePath()); + }); }); } catch (Exception e) { diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java index 9b25520f..c0f1ed64 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java @@ -95,4 +95,6 @@ public interface IStudyService { * @return */ PageList findItemPage(int pageIndex,int pageSize,String contentId,String courseId,String name,Integer status); + + List getList(String courseId, String contentId, String name, Integer status); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java index d6cc2110..fca9bd70 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java @@ -193,6 +193,34 @@ public class StudyServiceImpl implements IStudyService{ } + @Override + public List getList(String courseId, String contentId, String name, Integer status) { + + QueryBuilder query=QueryBuilder.from(StudyCourseItem.class); + + OrderCondition oc=OrderCondition.desc("id"); + query.addOrder(oc); + if(StringUtils.isNotBlank(contentId)) { + query.addFilter(FieldFilters.eq("contentId",contentId)); + } + if(StringUtils.isNotBlank(courseId)) { + query.addFilter(FieldFilters.eq("courseId",courseId)); + } + + if(status!=null) { + if(status==1) { + query.addFilter(FieldFilters.eq("progress", 0)); + }else { + query.addFilter(FieldFilters.eq("progress",100)); + } + + } + if(StringUtils.isNotBlank(name)) { + query.addFilter(FieldFilters.eq("aname", name)); + } + return scItemDao.findList(query.builder()); + } + @Override @Transactional public void updateProcess(String studyContentId,String studyId, String courseId,Integer total, Integer progress,String token) { From 294949f4e55b2a9c4deb3616c75c8d1206ba9ab4 Mon Sep 17 00:00:00 2001 From: lu Date: Wed, 31 Jul 2024 10:03:46 +0800 Subject: [PATCH 08/93] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9Abug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/school/study/api/StudyHomeWorkApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyHomeWorkApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyHomeWorkApi.java index 87e560e8..b8d2c037 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyHomeWorkApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyHomeWorkApi.java @@ -33,7 +33,7 @@ public class StudyHomeWorkApi extends ApiBaseController{ IStudyHomeWorkService shomeworkService; @Resource private ThirdApi thirdApi; - @PostMapping("/`save`") + @PostMapping("/save") public JsonResponse save(@RequestBody StudyHomeWork shw, HttpServletRequest request){ if(StringUtils.isBlank(shw.getCourseId())) { return badRequest("无课程信息"); From 860fb3f27ca951adcd486c07284b4deacd1a86fe Mon Sep 17 00:00:00 2001 From: lu Date: Wed, 31 Jul 2024 11:55:01 +0800 Subject: [PATCH 09/93] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/module/course/api/CoursePortalApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index d1566b73..5f809603 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -374,7 +374,7 @@ public class CoursePortalApi extends ApiBaseController{ //取作业后缀名 int dotIndex = e.getFilePath().lastIndexOf('/'); // 查找最后一个'.'的位置 String extension = e.getFilePath().substring(dotIndex+1); - map.put(extension,e.getFilePath()); + map.put(extension,"/home/www/elearning/upload"+e.getFilePath()); }); }); From b9c4503aaa50f62d82f7ea434f78b29690d049e9 Mon Sep 17 00:00:00 2001 From: lu Date: Wed, 31 Jul 2024 16:55:01 +0800 Subject: [PATCH 10/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=88=A4=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/module/course/api/CoursePortalApi.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 5f809603..c06882f5 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -369,7 +369,11 @@ public class CoursePortalApi extends ApiBaseController{ public void export(String courseName,String courseId,String contentId,String name,Integer status,HttpServletResponse response) throws IOException { Mapmap=new HashMap<>(); try { - studyService.getList(courseId, contentId, name, status).stream().filter(Objects::nonNull).forEach(s->{ + List list = studyService.getList(courseId, contentId, name, status); + if(list.isEmpty()){ + throw new RuntimeException("暂无数据"); + } + list.stream().filter(Objects::nonNull).forEach(s->{ shomeworkService.getByStudyIdAndContentId(s.getStudyId(),contentId).stream().filter(Objects::nonNull).filter(e->e.getFilePath()!=null).forEach(e->{ //取作业后缀名 int dotIndex = e.getFilePath().lastIndexOf('/'); // 查找最后一个'.'的位置 From f79a159e2295c971086b60c3232ee53c1b8ad0dd Mon Sep 17 00:00:00 2001 From: lu Date: Wed, 31 Jul 2024 17:48:29 +0800 Subject: [PATCH 11/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BF=94=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/module/course/api/CoursePortalApi.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index c06882f5..bcfc7094 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -366,15 +366,15 @@ public class CoursePortalApi extends ApiBaseController{ } //作业导出 @GetMapping("/export") - public void export(String courseName,String courseId,String contentId,String name,Integer status,HttpServletResponse response) throws IOException { + public JsonResponse export(String courseName,String courseId,String contentId,String name,Integer status,HttpServletResponse response) throws IOException { Mapmap=new HashMap<>(); try { List list = studyService.getList(courseId, contentId, name, status); if(list.isEmpty()){ - throw new RuntimeException("暂无数据"); + return success("暂无数据"); } list.stream().filter(Objects::nonNull).forEach(s->{ - shomeworkService.getByStudyIdAndContentId(s.getStudyId(),contentId).stream().filter(Objects::nonNull).filter(e->e.getFilePath()!=null).forEach(e->{ + shomeworkService.getByStudyIdAndContentId(s.getStudyId(),contentId).stream().filter(e-> !Objects.equals(e.getFilePath(), "")).filter(e->e.getFilePath()!=null).forEach(e->{ //取作业后缀名 int dotIndex = e.getFilePath().lastIndexOf('/'); // 查找最后一个'.'的位置 String extension = e.getFilePath().substring(dotIndex+1); @@ -406,7 +406,7 @@ public class CoursePortalApi extends ApiBaseController{ // 检查加上当前文件大小后,是否会超过2GB long fileSizeInBytes = fileToZip.length(); if (totalCompressedSize + fileSizeInBytes > 2L * 1024 * 1024 * 1024) { - throw new RuntimeException("您要下载的作业过大,请分批下载或联系管理员!"); + return success("您要下载的作业过大,请分批下载或联系管理员!"); } // 添加 ZIP 条目 ZipEntry entry = new ZipEntry(e.getKey()); @@ -426,6 +426,7 @@ public class CoursePortalApi extends ApiBaseController{ zos.closeEntry(); } } + return success("导出成功"); } @GetMapping("/detail-study") public JsonResponse> detailStudy(String courseId, String aid){ From 7e3a3a5838082a41a95c178f53228a9f4d9ed0b3 Mon Sep 17 00:00:00 2001 From: lu Date: Thu, 1 Aug 2024 15:33:26 +0800 Subject: [PATCH 12/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CoursePortalApi.java | 35 ++++++++++--------- .../school/study/service/IStudyService.java | 3 ++ .../study/service/impl/StudyServiceImpl.java | 9 +++-- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index bcfc7094..3fb3a04d 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -15,23 +15,14 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.xboe.api.ThirdApi; -import com.xboe.api.vo.AuditList; -import com.xboe.api.vo.AuditListParam; -import com.xboe.api.vo.UserDynamic; -import com.xboe.api.vo.UserdynamicParam; -import com.xboe.common.OrderCondition; -import com.xboe.core.JsonResponseStatus; import com.xboe.core.orm.FieldFilters; -import com.xboe.module.course.dao.CourseContentDao; -import com.xboe.module.course.dao.CourseDao; -import com.xboe.module.course.dao.CourseHomeWorkDao; -import com.xboe.module.course.dao.CourseSectionDao; import com.xboe.module.course.entity.*; import com.xboe.module.course.vo.TeacherVo; -import com.xboe.module.usergroup.entity.UserGroupItem; -import com.xboe.school.study.entity.StudyHomeWork; +import com.xboe.school.study.dao.StudySignupDao; +import com.xboe.school.study.entity.StudySignup; import com.xboe.school.study.service.IStudyHomeWorkService; import com.xboe.school.study.service.IStudyService; +import com.xboe.system.user.entity.User; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; @@ -106,6 +97,9 @@ public class CoursePortalApi extends ApiBaseController{ @Autowired IStudyService studyService; + @Autowired + StudySignupDao signupDao; + @Autowired StringRedisTemplate redisTemplate; @@ -368,6 +362,11 @@ public class CoursePortalApi extends ApiBaseController{ @GetMapping("/export") public JsonResponse export(String courseName,String courseId,String contentId,String name,Integer status,HttpServletResponse response) throws IOException { Mapmap=new HashMap<>(); + List userIds = signupDao.findList(FieldFilters.eq("courseId", courseId)).stream().filter(Objects::nonNull).map(StudySignup::getAid).collect(Collectors.toList()); + if (userIds.isEmpty()){ + return error("查询不到用户"); + } + Listuser=studyService.getUserNo(userIds); try { List list = studyService.getList(courseId, contentId, name, status); if(list.isEmpty()){ @@ -375,10 +374,14 @@ public class CoursePortalApi extends ApiBaseController{ } list.stream().filter(Objects::nonNull).forEach(s->{ shomeworkService.getByStudyIdAndContentId(s.getStudyId(),contentId).stream().filter(e-> !Objects.equals(e.getFilePath(), "")).filter(e->e.getFilePath()!=null).forEach(e->{ - //取作业后缀名 - int dotIndex = e.getFilePath().lastIndexOf('/'); // 查找最后一个'.'的位置 - String extension = e.getFilePath().substring(dotIndex+1); - map.put(extension,"/home/www/elearning/upload"+e.getFilePath()); + user.forEach(u->{ + if(u.getId().equals(s.getAid())){ + //取后缀 + int dotIndex = e.getFilePath().lastIndexOf('.'); // 查找最后一个'.'的位置 + String extension = e.getFilePath().substring(dotIndex); + map.put(u.getName()+"-"+u.getUserNo()+extension,"/home/www/elearning/upload"+e.getFilePath()); + } + }); }); }); diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java index c0f1ed64..40a39db7 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java @@ -7,6 +7,7 @@ import com.xboe.common.PageList; import com.xboe.school.study.dto.StudyContentDto; import com.xboe.school.study.entity.StudyCourseItem; import com.xboe.school.study.entity.StudyTime; +import com.xboe.system.user.entity.User; /** * 学习情况处理,比较综合一个处理类 @@ -97,4 +98,6 @@ public interface IStudyService { PageList findItemPage(int pageIndex,int pageSize,String contentId,String courseId,String name,Integer status); List getList(String courseId, String contentId, String name, Integer status); + + List getUserNo(List userIds); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java index fca9bd70..78b11375 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java @@ -5,11 +5,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.annotation.Resource; import javax.transaction.Transactional; -import com.xboe.api.ThirdApi; -import com.xboe.school.study.entity.StudyCourse; +import com.xboe.system.user.entity.User; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -221,6 +219,11 @@ public class StudyServiceImpl implements IStudyService{ return scItemDao.findList(query.builder()); } + @Override + public List getUserNo(List userIds) { + return userDao.findList(FieldFilters.in("id", userIds)); + } + @Override @Transactional public void updateProcess(String studyContentId,String studyId, String courseId,Integer total, Integer progress,String token) { From a9be34631a01529fdd39a19890e7dfed7826d6bb Mon Sep 17 00:00:00 2001 From: lu Date: Thu, 1 Aug 2024 16:30:11 +0800 Subject: [PATCH 13/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/module/course/api/CoursePortalApi.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 3fb3a04d..74737544 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -18,6 +18,7 @@ import com.xboe.api.ThirdApi; import com.xboe.core.orm.FieldFilters; import com.xboe.module.course.entity.*; import com.xboe.module.course.vo.TeacherVo; +import com.xboe.school.study.dao.StudyCourseDao; import com.xboe.school.study.dao.StudySignupDao; import com.xboe.school.study.entity.StudySignup; import com.xboe.school.study.service.IStudyHomeWorkService; @@ -98,7 +99,7 @@ public class CoursePortalApi extends ApiBaseController{ IStudyService studyService; @Autowired - StudySignupDao signupDao; + StudyCourseDao studyCourseDao; @Autowired StringRedisTemplate redisTemplate; @@ -362,7 +363,7 @@ public class CoursePortalApi extends ApiBaseController{ @GetMapping("/export") public JsonResponse export(String courseName,String courseId,String contentId,String name,Integer status,HttpServletResponse response) throws IOException { Mapmap=new HashMap<>(); - List userIds = signupDao.findList(FieldFilters.eq("courseId", courseId)).stream().filter(Objects::nonNull).map(StudySignup::getAid).collect(Collectors.toList()); + List userIds = studyCourseDao.findList(FieldFilters.eq("courseId", courseId)).stream().filter(Objects::nonNull).map(StudyCourse::getAid).collect(Collectors.toList()); if (userIds.isEmpty()){ return error("查询不到用户"); } From 389dff8fbecfe927740b9b2273d24d320ecdf197 Mon Sep 17 00:00:00 2001 From: lu Date: Fri, 2 Aug 2024 13:40:39 +0800 Subject: [PATCH 14/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=88=A4=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/api/CoursePortalApi.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 74737544..eb72f82b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -20,6 +20,7 @@ import com.xboe.module.course.entity.*; import com.xboe.module.course.vo.TeacherVo; import com.xboe.school.study.dao.StudyCourseDao; import com.xboe.school.study.dao.StudySignupDao; +import com.xboe.school.study.entity.StudyHomeWork; import com.xboe.school.study.entity.StudySignup; import com.xboe.school.study.service.IStudyHomeWorkService; import com.xboe.school.study.service.IStudyService; @@ -368,13 +369,17 @@ public class CoursePortalApi extends ApiBaseController{ return error("查询不到用户"); } Listuser=studyService.getUserNo(userIds); - try { + try {//筛选出的人员 List list = studyService.getList(courseId, contentId, name, status); if(list.isEmpty()){ return success("暂无数据"); } - list.stream().filter(Objects::nonNull).forEach(s->{ - shomeworkService.getByStudyIdAndContentId(s.getStudyId(),contentId).stream().filter(e-> !Objects.equals(e.getFilePath(), "")).filter(e->e.getFilePath()!=null).forEach(e->{ + for (StudyCourseItem s : list) { + List studyHomeWorks = shomeworkService.getByStudyIdAndContentId(s.getStudyId(), contentId).stream().filter(e-> !Objects.equals(e.getFilePath(), "")).filter(e->e.getFilePath()!=null).collect(Collectors.toList()); + if(studyHomeWorks.isEmpty()){ + return success("暂无数据"); + } + studyHomeWorks.forEach(e->{ user.forEach(u->{ if(u.getId().equals(s.getAid())){ //取后缀 @@ -384,8 +389,7 @@ public class CoursePortalApi extends ApiBaseController{ } }); }); - }); - + } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("导出异常"+e.getMessage()); @@ -410,7 +414,7 @@ public class CoursePortalApi extends ApiBaseController{ // 检查加上当前文件大小后,是否会超过2GB long fileSizeInBytes = fileToZip.length(); if (totalCompressedSize + fileSizeInBytes > 2L * 1024 * 1024 * 1024) { - return success("您要下载的作业过大,请分批下载或联系管理员!"); + return success("您要下载的作业过大,联系管理员!"); } // 添加 ZIP 条目 ZipEntry entry = new ZipEntry(e.getKey()); From bcb453b2f4a34d57a0fae17b2ad982c208b9ca83 Mon Sep 17 00:00:00 2001 From: lu Date: Mon, 5 Aug 2024 13:57:18 +0800 Subject: [PATCH 15/93] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/api/CoursePortalApi.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index eb72f82b..3e93694e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -19,9 +19,7 @@ import com.xboe.core.orm.FieldFilters; import com.xboe.module.course.entity.*; import com.xboe.module.course.vo.TeacherVo; import com.xboe.school.study.dao.StudyCourseDao; -import com.xboe.school.study.dao.StudySignupDao; import com.xboe.school.study.entity.StudyHomeWork; -import com.xboe.school.study.entity.StudySignup; import com.xboe.school.study.service.IStudyHomeWorkService; import com.xboe.school.study.service.IStudyService; import com.xboe.system.user.entity.User; @@ -394,6 +392,14 @@ public class CoursePortalApi extends ApiBaseController{ e.printStackTrace(); throw new RuntimeException("导出异常"+e.getMessage()); } + long totalFileSize = map.values().stream() + .mapToLong(path -> new File(path).length()) + .sum(); + // 检查文件总大小是否超过 2GB + if (totalFileSize > 2L * 1024 * 1024 * 1024) { + return success("您要下载的作业过大,请分批下载或联系管理员!"); + } + String encodedFilename = URLEncoder.encode(courseName+"【作业】.zip") .replace("+", "%20") // 空格替换为"%20" .replace("%2F", "/"); // 解决斜杠问题 @@ -407,15 +413,9 @@ public class CoursePortalApi extends ApiBaseController{ // 设置响应类型和Content-Disposition头 response.setContentType("application/zip"); response.setHeader("Content-Disposition", contentDispositionValue.toString()); - long totalCompressedSize = 0; try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { for (Map.Entry e : map.entrySet()) { File fileToZip = new File(e.getValue()); - // 检查加上当前文件大小后,是否会超过2GB - long fileSizeInBytes = fileToZip.length(); - if (totalCompressedSize + fileSizeInBytes > 2L * 1024 * 1024 * 1024) { - return success("您要下载的作业过大,联系管理员!"); - } // 添加 ZIP 条目 ZipEntry entry = new ZipEntry(e.getKey()); entry.setSize(fileToZip.length()); @@ -427,7 +427,6 @@ public class CoursePortalApi extends ApiBaseController{ int len; while ((len = fis.read(buffer)) > 0) { zos.write(buffer, 0, len); - totalCompressedSize += len; } } From 484a7650dd97e09cd8f6ae60fe5b629f203793d9 Mon Sep 17 00:00:00 2001 From: lu Date: Mon, 5 Aug 2024 18:46:29 +0800 Subject: [PATCH 16/93] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CoursePortalApi.java | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 3e93694e..0fc8be1c 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -2,8 +2,13 @@ package com.xboe.module.course.api; import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.net.URLEncoder; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @@ -360,7 +365,7 @@ public class CoursePortalApi extends ApiBaseController{ } //作业导出 @GetMapping("/export") - public JsonResponse export(String courseName,String courseId,String contentId,String name,Integer status,HttpServletResponse response) throws IOException { + public JsonResponse export(String courseName,String courseId,String contentId,String name,Integer status) throws IOException { Mapmap=new HashMap<>(); List userIds = studyCourseDao.findList(FieldFilters.eq("courseId", courseId)).stream().filter(Objects::nonNull).map(StudyCourse::getAid).collect(Collectors.toList()); if (userIds.isEmpty()){ @@ -400,20 +405,23 @@ public class CoursePortalApi extends ApiBaseController{ return success("您要下载的作业过大,请分批下载或联系管理员!"); } - String encodedFilename = URLEncoder.encode(courseName+"【作业】.zip") - .replace("+", "%20") // 空格替换为"%20" - .replace("%2F", "/"); // 解决斜杠问题 - StringBuilder contentDispositionValue = new StringBuilder(); - contentDispositionValue.append("attachment; filename=\"") - .append(encodedFilename) - .append("\"") - .append("; filename*=utf-8''") - .append(encodedFilename); +// String encodedFilename = URLEncoder.encode(courseName+"【作业】.zip") +// .replace("+", "%20") // 空格替换为"%20" +// .replace("%2F", "/"); // 解决斜杠问题 +// StringBuilder contentDispositionValue = new StringBuilder(); +// contentDispositionValue.append("attachment; filename=\"") +// .append(encodedFilename) +// .append("\"") +// .append("; filename*=utf-8''") +// .append(encodedFilename); +// +// // 设置响应类型和Content-Disposition头 +// response.setContentType("application/zip"); - // 设置响应类型和Content-Disposition头 - response.setContentType("application/zip"); - response.setHeader("Content-Disposition", contentDispositionValue.toString()); - try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { + // 创建一个临时文件用于存储ZIP文件 + File tempZipFile = new File("/home/www/elearning/upload/temp.zip"); + + try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(tempZipFile))) { for (Map.Entry e : map.entrySet()) { File fileToZip = new File(e.getValue()); // 添加 ZIP 条目 @@ -433,7 +441,21 @@ public class CoursePortalApi extends ApiBaseController{ zos.closeEntry(); } } - return success("导出成功"); + // 将临时文件移动到指定位置 + Path source = tempZipFile.toPath(); + Path destination = Paths.get("/home/www/elearning/upload/saveZip" + courseName + "【作业】.zip"); + + // 删除目标文件如果已存在 + if (Files.exists(destination)) { + Files.delete(destination); + } + + // 移动文件 + Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING); + + // 返回文件路径给前端 + String filePath = destination.toAbsolutePath().toString(); + return success(filePath); } @GetMapping("/detail-study") public JsonResponse> detailStudy(String courseId, String aid){ From 27b863a6a4add4c6883b7771c964aa7cd0033db6 Mon Sep 17 00:00:00 2001 From: lu Date: Tue, 6 Aug 2024 10:43:17 +0800 Subject: [PATCH 17/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/module/course/api/CoursePortalApi.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 0fc8be1c..990e1fa7 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -443,7 +443,9 @@ public class CoursePortalApi extends ApiBaseController{ } // 将临时文件移动到指定位置 Path source = tempZipFile.toPath(); - Path destination = Paths.get("/home/www/elearning/upload/saveZip" + courseName + "【作业】.zip"); + //生成uuid + String uuid = UUID.randomUUID().toString(); + Path destination = Paths.get("/home/www/elearning/upload/saveZip/" + uuid + ".zip"); // 删除目标文件如果已存在 if (Files.exists(destination)) { From e38be093f4fe496412950908b7de4a5922b85ff7 Mon Sep 17 00:00:00 2001 From: joshen Date: Mon, 12 Aug 2024 20:00:29 +0800 Subject: [PATCH 18/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/servers/boe-server-all/src/main/resources/application-pro.properties b/servers/boe-server-all/src/main/resources/application-pro.properties index 897a0628..71b44bdc 100644 --- a/servers/boe-server-all/src/main/resources/application-pro.properties +++ b/servers/boe-server-all/src/main/resources/application-pro.properties @@ -1,9 +1,9 @@ # cloud nacos config -spring.cloud.nacos.discovery.server-addr=10.251.129.51:8848 +spring.cloud.nacos.discovery.server-addr=10.251.113.100:8848 ## redis spring.redis.database=1 -spring.redis.host=10.251.129.122 +spring.redis.host=10.251.88.213 spring.redis.password=qwert!W588 spring.redis.port=6379 @@ -16,7 +16,7 @@ spring.datasource.driverClassName=com.mysql.jdbc.Driver #spring.datasource.url=jdbc:mysql://10.251.129.129:8066/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull #spring.datasource.username=admin #spring.datasource.password=ocYMC>!{8G -spring.datasource.url=jdbc:mysql://10.251.129.126:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.url=jdbc:mysql://10.251.88.216:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.username=admin spring.datasource.password=boeRds01 @@ -63,7 +63,7 @@ jasypt.encryptor.algorithm=PBEWithMD5AndDES jasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator # elasticsearch config -xboe.elasticsearch.server.ip=10.251.129.21 +xboe.elasticsearch.server.ip=10.251.88.218 xboe.elasticsearch.server.port=9200 xboe.elasticsearch.server.user= xboe.elasticsearch.server.password= From b568285fed57fab38f300d0c4f60b6608480047e Mon Sep 17 00:00:00 2001 From: joshen Date: Mon, 12 Aug 2024 20:57:34 +0800 Subject: [PATCH 19/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/servers/boe-server-basic/src/main/resources/application-pro.properties b/servers/boe-server-basic/src/main/resources/application-pro.properties index 6eef96f6..327e86ec 100644 --- a/servers/boe-server-basic/src/main/resources/application-pro.properties +++ b/servers/boe-server-basic/src/main/resources/application-pro.properties @@ -1,6 +1,6 @@ ## redis spring.redis.database=3 -spring.redis.host=10.251.129.122 +spring.redis.host=10.251.88.213 spring.redis.password=qwert!W588 spring.redis.port=6379 @@ -14,7 +14,7 @@ spring.datasource.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver # 当前数据库 basic 对应的数据库 spring.datasource.db1.driverClassName=com.mysql.jdbc.Driver -spring.datasource.db1.jdbc-url=jdbc:mysql://10.251.129.126:3306/boe_basic?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.db1.jdbc-url=jdbc:mysql://10.251.88.217:3306/boe_basic?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.db1.username=admin spring.datasource.db1.password=boeRds01 @@ -23,7 +23,7 @@ spring.datasource.db1.password=boeRds01 # 主数据库 all 对应的数据库 spring.datasource.db2.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver -spring.datasource.db2.jdbc-url=jdbc:mysql://10.251.129.126:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.db2.jdbc-url=jdbc:mysql://10.251.88.217:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.db2.username=admin spring.datasource.db2.password=boeRds01 From db8418152311c47415fdf40aab3115c8c2d794af Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 14:59:23 +0800 Subject: [PATCH 20/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-basic/src/main/resources/application-pro.properties b/servers/boe-server-basic/src/main/resources/application-pro.properties index 327e86ec..0ced5271 100644 --- a/servers/boe-server-basic/src/main/resources/application-pro.properties +++ b/servers/boe-server-basic/src/main/resources/application-pro.properties @@ -14,7 +14,7 @@ spring.datasource.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver # 当前数据库 basic 对应的数据库 spring.datasource.db1.driverClassName=com.mysql.jdbc.Driver -spring.datasource.db1.jdbc-url=jdbc:mysql://10.251.88.217:3306/boe_basic?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.db1.jdbc-url=jdbc:mysql://10.251.88.216:3306/boe_basic?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.db1.username=admin spring.datasource.db1.password=boeRds01 @@ -23,7 +23,7 @@ spring.datasource.db1.password=boeRds01 # 主数据库 all 对应的数据库 spring.datasource.db2.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver -spring.datasource.db2.jdbc-url=jdbc:mysql://10.251.88.217:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.db2.jdbc-url=jdbc:mysql://10.251.88.216:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.db2.username=admin spring.datasource.db2.password=boeRds01 From c096c44a9170520cf63ce89455e52f35f0a5f3fb Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 15:17:22 +0800 Subject: [PATCH 21/93] Update application-pro.properties --- .../modify-user/src/main/resources/application-pro.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/modify-user/src/main/resources/application-pro.properties b/servers/modify-user/src/main/resources/application-pro.properties index 4c8d43bb..41341da0 100644 --- a/servers/modify-user/src/main/resources/application-pro.properties +++ b/servers/modify-user/src/main/resources/application-pro.properties @@ -7,7 +7,7 @@ spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true spring.datasource.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver # 当前数据库 basic 对应的数据库 -spring.datasource.url=jdbc:mysql://10.251.129.126:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.url=jdbc:mysql://10.251.88.216:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.username=admin spring.datasource.password=boeRds01 From b86ce744a7e7ddab61c48ac35d245f513a9862c4 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 15:17:52 +0800 Subject: [PATCH 22/93] Update application-pro.properties From 2911ef8d4667a3f2703407db96cc7dc099337b16 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 15:18:09 +0800 Subject: [PATCH 23/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/servers/org-user-sync/src/main/resources/application-pro.properties b/servers/org-user-sync/src/main/resources/application-pro.properties index c2a67c22..da1fae51 100644 --- a/servers/org-user-sync/src/main/resources/application-pro.properties +++ b/servers/org-user-sync/src/main/resources/application-pro.properties @@ -1,4 +1,3 @@ - # datasource config # basic数据库 spring.jpa.hibernate.ddl-auto=none @@ -9,7 +8,7 @@ spring.datasource.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver # 原数据库 old 对应的数据库 spring.datasource.db1.driverClassName=com.mysql.jdbc.Driver -spring.datasource.db1.jdbc-url=jdbc:mysql://10.251.129.126:3306/elearninglms?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.db1.jdbc-url=jdbc:mysql://10.251.88.216:3306/elearninglms?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.db1.username=admin spring.datasource.db1.password=boeRds01 @@ -18,7 +17,7 @@ spring.datasource.db1.password=boeRds01 # 新主数据库 all 对应的数据库 spring.datasource.db2.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver -spring.datasource.db2.jdbc-url=jdbc:mysql://10.251.129.126:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.db2.jdbc-url=jdbc:mysql://10.251.88.216:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.db2.username=admin spring.datasource.db2.password=boeRds01 From 627e87509f6df9dbed0d96711c89044891768b5a Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 15:18:25 +0800 Subject: [PATCH 24/93] Update application-pro.properties --- .../modify-221027/src/main/resources/application-pro.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/modify-221027/src/main/resources/application-pro.properties b/servers/modify-221027/src/main/resources/application-pro.properties index 4c8d43bb..41341da0 100644 --- a/servers/modify-221027/src/main/resources/application-pro.properties +++ b/servers/modify-221027/src/main/resources/application-pro.properties @@ -7,7 +7,7 @@ spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true spring.datasource.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver # 当前数据库 basic 对应的数据库 -spring.datasource.url=jdbc:mysql://10.251.129.126:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.url=jdbc:mysql://10.251.88.216:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.username=admin spring.datasource.password=boeRds01 From 654da73fafc582d3d273ebe8658090193cb81d20 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 15:19:38 +0800 Subject: [PATCH 25/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-task/src/main/resources/application-pro.properties b/servers/boe-server-task/src/main/resources/application-pro.properties index 687cb4c3..397c405f 100644 --- a/servers/boe-server-task/src/main/resources/application-pro.properties +++ b/servers/boe-server-task/src/main/resources/application-pro.properties @@ -5,7 +5,7 @@ spring.redis.password=ENC(zA5LNV8xw3yEx6LMwdGGBGgNsOaD3Cg+) spring.redis.port=6379 # cloud nacos config -spring.cloud.nacos.discovery.server-addr=10.251.181.11:8848 +spring.cloud.nacos.discovery.server-addr=10.251.113.100:8848 ## datasource config spring.datasource.driverClassName=com.mysql.jdbc.Driver From 56d064e53379c845030035c6281d0f42718ad64e Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 16:35:13 +0800 Subject: [PATCH 26/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/resources/application-pro.properties b/servers/boe-server-all/src/main/resources/application-pro.properties index 71b44bdc..5dc351bd 100644 --- a/servers/boe-server-all/src/main/resources/application-pro.properties +++ b/servers/boe-server-all/src/main/resources/application-pro.properties @@ -55,7 +55,7 @@ xboe.old.base.url=https://u.boe.com ## ???????api?? xboe.stat.base.url=http://127.0.0.1:9080 -xboe.server.userbasic.url=https://u.boe.com/userbasic +xboe.server.userbasic.url=http://u.boe.com/userbasic #??? #jasypt.encryptor.password=jasypt From ba8ef9270033710cfed608aaa12c555697aeb682 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 17:32:30 +0800 Subject: [PATCH 27/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/servers/boe-server-all/src/main/resources/application-pro.properties b/servers/boe-server-all/src/main/resources/application-pro.properties index 5dc351bd..2a4d2c2e 100644 --- a/servers/boe-server-all/src/main/resources/application-pro.properties +++ b/servers/boe-server-all/src/main/resources/application-pro.properties @@ -45,13 +45,13 @@ xboe.api.cross_filter=true ## 上传相磁的路径配置 xboe.upload.file.temp_path=/tmp xboe.upload.file.save_path=/home/www/elearning/upload -xboe.upload.file.http_path=https://u.boe.com/upload +xboe.upload.file.http_path=http://u.boe.com/upload ## 外部接口调用地址 旧系统机构及用户数据接口 xboe.externalinterface.url.system=http://127.0.0.1:9091 ## ????????????? -xboe.old.base.url=https://u.boe.com +xboe.old.base.url=http://u.boe.com ## ???????api?? xboe.stat.base.url=http://127.0.0.1:9080 @@ -69,7 +69,7 @@ xboe.elasticsearch.server.user= xboe.elasticsearch.server.password= ## ????? -xboe.email.url=https://u.boe.com/api/b1/email/send +xboe.email.url=http://u.boe.com/api/b1/email/send xboe.email.from=boeu_learning@boe.com.cn xboe.email.user= xboe.email.security= From dfb0825cfd0edd2a4c0e250fba951e735d4d9fb2 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 17:33:16 +0800 Subject: [PATCH 28/93] Update application.properties --- .../boe-server-all/src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/resources/application.properties b/servers/boe-server-all/src/main/resources/application.properties index 01a9218f..f4fecd96 100644 --- a/servers/boe-server-all/src/main/resources/application.properties +++ b/servers/boe-server-all/src/main/resources/application.properties @@ -56,7 +56,7 @@ logging.config=classpath:log/logback-@profileActive@.xml # config.id.generator.datacenter.num=1 #boe.domain=https://pretest.zcwytd.com -boe.domain=https://u.boe.com +boe.domain=http://u.boe.com #boe.domain=http://localhost:30001 orgTree.orgTreeList=${boe.domain}/userbasic/org/list # ????id???????????? From f6a7bb77c0c69e12341af5dbc22e9d35942f8da5 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 17:34:51 +0800 Subject: [PATCH 29/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-basic/src/main/resources/application-pro.properties b/servers/boe-server-basic/src/main/resources/application-pro.properties index 0ced5271..dd130824 100644 --- a/servers/boe-server-basic/src/main/resources/application-pro.properties +++ b/servers/boe-server-basic/src/main/resources/application-pro.properties @@ -43,7 +43,7 @@ xboe.api.cross_filter=true ## 上传相磁的路径配置 xboe.upload.file.temp_path=/tmp xboe.upload.file.save_path=/home/www/elearning/upload -xboe.upload.file.http_path=https://u.boe.com/upload +xboe.upload.file.http_path=http://u.boe.com/upload ## 新系统的内部地址,可以不通过nginx调用 xboe.inner.data.sync.baseurl=http://127.0.0.1:9090 From 78b36b6da0aeffe81eef7e935e210570ce51eadd Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 17:36:50 +0800 Subject: [PATCH 30/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-course/src/main/resources/application-pro.properties b/servers/boe-server-course/src/main/resources/application-pro.properties index 04d94366..48d76d55 100644 --- a/servers/boe-server-course/src/main/resources/application-pro.properties +++ b/servers/boe-server-course/src/main/resources/application-pro.properties @@ -7,7 +7,7 @@ spring.redis.port=6379 ## datasource config spring.datasource.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://127.0.0.1:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.url=jdbc:mysql:/10.251.88.216:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.username=root spring.datasource.password=ENC(lAoFOYuc8CAypPtigTNLYg==) From 99792ccab6b66f7261b6f561ad3f9d06789dc168 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 19:13:42 +0800 Subject: [PATCH 31/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/resources/application-pro.properties b/servers/boe-server-all/src/main/resources/application-pro.properties index 2a4d2c2e..e544f9d3 100644 --- a/servers/boe-server-all/src/main/resources/application-pro.properties +++ b/servers/boe-server-all/src/main/resources/application-pro.properties @@ -55,7 +55,7 @@ xboe.old.base.url=http://u.boe.com ## ???????api?? xboe.stat.base.url=http://127.0.0.1:9080 -xboe.server.userbasic.url=http://u.boe.com/userbasic +xboe.server.userbasic.url=http://10.251.113.95/userbasic #??? #jasypt.encryptor.password=jasypt From 6d5fd5364d263608f00523d51ab14355b0241d7a Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 19:28:18 +0800 Subject: [PATCH 32/93] Update application.properties --- .../boe-server-all/src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/resources/application.properties b/servers/boe-server-all/src/main/resources/application.properties index f4fecd96..efc48bbd 100644 --- a/servers/boe-server-all/src/main/resources/application.properties +++ b/servers/boe-server-all/src/main/resources/application.properties @@ -56,7 +56,7 @@ logging.config=classpath:log/logback-@profileActive@.xml # config.id.generator.datacenter.num=1 #boe.domain=https://pretest.zcwytd.com -boe.domain=http://u.boe.com +boe.domain=http://10.251.113.95 #boe.domain=http://localhost:30001 orgTree.orgTreeList=${boe.domain}/userbasic/org/list # ????id???????????? From 56199f14804cac01431fc6114b15043d6707a694 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 19:31:56 +0800 Subject: [PATCH 33/93] Update application.properties --- .../boe-server-all/src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/resources/application.properties b/servers/boe-server-all/src/main/resources/application.properties index efc48bbd..e6222845 100644 --- a/servers/boe-server-all/src/main/resources/application.properties +++ b/servers/boe-server-all/src/main/resources/application.properties @@ -56,7 +56,7 @@ logging.config=classpath:log/logback-@profileActive@.xml # config.id.generator.datacenter.num=1 #boe.domain=https://pretest.zcwytd.com -boe.domain=http://10.251.113.95 +boe.domain=http://127.0.0.1 #boe.domain=http://localhost:30001 orgTree.orgTreeList=${boe.domain}/userbasic/org/list # ????id???????????? From a38cfc553f96a4c3bfddb208e356a1ba08eada6d Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 19:32:47 +0800 Subject: [PATCH 34/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-all/src/main/resources/application-pro.properties b/servers/boe-server-all/src/main/resources/application-pro.properties index e544f9d3..65b4490d 100644 --- a/servers/boe-server-all/src/main/resources/application-pro.properties +++ b/servers/boe-server-all/src/main/resources/application-pro.properties @@ -51,11 +51,11 @@ xboe.upload.file.http_path=http://u.boe.com/upload xboe.externalinterface.url.system=http://127.0.0.1:9091 ## ????????????? -xboe.old.base.url=http://u.boe.com +xboe.old.base.url=http://127.0.0.1 ## ???????api?? xboe.stat.base.url=http://127.0.0.1:9080 -xboe.server.userbasic.url=http://10.251.113.95/userbasic +xboe.server.userbasic.url=http://127.0.0.1/userbasic #??? #jasypt.encryptor.password=jasypt From 58c5ab499ad7e147139ef2dd588f2f80d0784d37 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 20:53:18 +0800 Subject: [PATCH 35/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-old/src/main/resources/application-pro.properties b/servers/boe-server-old/src/main/resources/application-pro.properties index 4376e080..ee109599 100644 --- a/servers/boe-server-old/src/main/resources/application-pro.properties +++ b/servers/boe-server-old/src/main/resources/application-pro.properties @@ -1,6 +1,6 @@ ## redis spring.redis.database=2 -spring.redis.host=127.0.0.1 +spring.redis.host=10.251.88.214 spring.redis.password=ENC(zA5LNV8xw3yEx6LMwdGGBGgNsOaD3Cg+) spring.redis.port=6379 @@ -8,7 +8,7 @@ spring.redis.port=6379 spring.jpa.hibernate.ddl-auto=none spring.datasource.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://127.0.0.1:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.url=jdbc:mysql://10.251.88.216:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.username=root spring.datasource.password=ENC(lAoFOYuc8CAypPtigTNLYg==) From a590cd19b1894100f04b4b0563a82b7349eba3be Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 20:54:12 +0800 Subject: [PATCH 36/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-task/src/main/resources/application-pro.properties b/servers/boe-server-task/src/main/resources/application-pro.properties index 397c405f..f90852fa 100644 --- a/servers/boe-server-task/src/main/resources/application-pro.properties +++ b/servers/boe-server-task/src/main/resources/application-pro.properties @@ -1,6 +1,6 @@ ## redis spring.redis.database=2 -spring.redis.host=127.0.0.1 +spring.redis.host=10.251.88.214 spring.redis.password=ENC(zA5LNV8xw3yEx6LMwdGGBGgNsOaD3Cg+) spring.redis.port=6379 @@ -10,7 +10,7 @@ spring.cloud.nacos.discovery.server-addr=10.251.113.100:8848 ## datasource config spring.datasource.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver -spring.datasource.url=jdbc:mysql://127.0.0.1:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull +spring.datasource.url=jdbc:mysql://10.251.88.216:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull spring.datasource.username=root spring.datasource.password=ENC(lAoFOYuc8CAypPtigTNLYg==) From 312c85d92cb5929d798f41a927a79d4ceb3e62e7 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 21:34:08 +0800 Subject: [PATCH 37/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/resources/application-pro.properties b/servers/boe-server-all/src/main/resources/application-pro.properties index 65b4490d..ae4bd552 100644 --- a/servers/boe-server-all/src/main/resources/application-pro.properties +++ b/servers/boe-server-all/src/main/resources/application-pro.properties @@ -69,7 +69,7 @@ xboe.elasticsearch.server.user= xboe.elasticsearch.server.password= ## ????? -xboe.email.url=http://u.boe.com/api/b1/email/send +xboe.email.url=http://127.0.0.1/api/b1/email/send xboe.email.from=boeu_learning@boe.com.cn xboe.email.user= xboe.email.security= From 345e28fdee33441ec5c403dbd6d0d4f9772914a3 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 13 Aug 2024 21:49:29 +0800 Subject: [PATCH 38/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/servers/boe-server-course/src/main/resources/application-pro.properties b/servers/boe-server-course/src/main/resources/application-pro.properties index 48d76d55..5f6b3d53 100644 --- a/servers/boe-server-course/src/main/resources/application-pro.properties +++ b/servers/boe-server-course/src/main/resources/application-pro.properties @@ -1,15 +1,15 @@ ## redis spring.redis.database=2 -spring.redis.host=127.0.0.1 -spring.redis.password=ENC(zA5LNV8xw3yEx6LMwdGGBGgNsOaD3Cg+) +spring.redis.host=10.251.88.214 +spring.redis.password=qwert!W588 spring.redis.port=6379 ## datasource config spring.datasource.driverClassName=com.mysql.jdbc.Driver # spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql:/10.251.88.216:3306/boe_base?useSSL=false&useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull -spring.datasource.username=root -spring.datasource.password=ENC(lAoFOYuc8CAypPtigTNLYg==) +spring.datasource.username=admin +spring.datasource.password=boeRds01 logging.level.org.hibernate.SQL=ERROR # logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE From 436eedd57054b2ca1fc286ca662784d9de39ab02 Mon Sep 17 00:00:00 2001 From: joshen Date: Wed, 14 Aug 2024 09:33:26 +0800 Subject: [PATCH 39/93] Update ElasticsearchConfig.java --- .../java/com/xboe/module/elasticsearc/ElasticsearchConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/ElasticsearchConfig.java b/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/ElasticsearchConfig.java index 6c19f5a8..34591752 100644 --- a/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/ElasticsearchConfig.java +++ b/modules/boe-module-es/src/main/java/com/xboe/module/elasticsearc/ElasticsearchConfig.java @@ -20,7 +20,7 @@ import com.xboe.common.utils.StringUtil; public class ElasticsearchConfig { @Value("${xboe.elasticsearch.server.ip}") - private String esIp="127.0.0.1"; + private String esIp="10.251.88.214"; @Value("${xboe.elasticsearch.server.port}") private int esPort=9200; From e52d9b682b42e29b1c66a860e750abc5f79a2fa3 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 20 Aug 2024 10:52:07 +0800 Subject: [PATCH 40/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/servers/boe-server-all/src/main/resources/application-pro.properties b/servers/boe-server-all/src/main/resources/application-pro.properties index ae4bd552..cbaf21fd 100644 --- a/servers/boe-server-all/src/main/resources/application-pro.properties +++ b/servers/boe-server-all/src/main/resources/application-pro.properties @@ -45,17 +45,17 @@ xboe.api.cross_filter=true ## 上传相磁的路径配置 xboe.upload.file.temp_path=/tmp xboe.upload.file.save_path=/home/www/elearning/upload -xboe.upload.file.http_path=http://u.boe.com/upload +xboe.upload.file.http_path=http://u-pre.boe.com/upload ## 外部接口调用地址 旧系统机构及用户数据接口 -xboe.externalinterface.url.system=http://127.0.0.1:9091 +xboe.externalinterface.url.system=http://u-pre.boe.com:9091 ## ????????????? -xboe.old.base.url=http://127.0.0.1 +xboe.old.base.url=http://u-pre.boe.com ## ???????api?? -xboe.stat.base.url=http://127.0.0.1:9080 -xboe.server.userbasic.url=http://127.0.0.1/userbasic +xboe.stat.base.url=http://u-pre.boe.com:9080 +xboe.server.userbasic.url=http://u-pre.boe.com/userbasic #??? #jasypt.encryptor.password=jasypt @@ -69,7 +69,7 @@ xboe.elasticsearch.server.user= xboe.elasticsearch.server.password= ## ????? -xboe.email.url=http://127.0.0.1/api/b1/email/send +xboe.email.url=http://u-pre.boe.com/api/b1/email/send xboe.email.from=boeu_learning@boe.com.cn xboe.email.user= xboe.email.security= From 5ed277e9188dacadc200a5cdbfcb57bb8ed00451 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 20 Aug 2024 10:52:42 +0800 Subject: [PATCH 41/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-basic/src/main/resources/application-pro.properties b/servers/boe-server-basic/src/main/resources/application-pro.properties index dd130824..1ae5f9f6 100644 --- a/servers/boe-server-basic/src/main/resources/application-pro.properties +++ b/servers/boe-server-basic/src/main/resources/application-pro.properties @@ -43,10 +43,10 @@ xboe.api.cross_filter=true ## 上传相磁的路径配置 xboe.upload.file.temp_path=/tmp xboe.upload.file.save_path=/home/www/elearning/upload -xboe.upload.file.http_path=http://u.boe.com/upload +xboe.upload.file.http_path=http://u-pre.boe.com/upload ## 新系统的内部地址,可以不通过nginx调用 -xboe.inner.data.sync.baseurl=http://127.0.0.1:9090 +xboe.inner.data.sync.baseurl=http://u-pre.boe.com:9090 #加密盐 #jasypt.encryptor.password=jasypt From 6220f212d2e124fe38eaa09e24ae150d1ea609df Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 20 Aug 2024 10:53:13 +0800 Subject: [PATCH 42/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-course/src/main/resources/application-pro.properties b/servers/boe-server-course/src/main/resources/application-pro.properties index 5f6b3d53..31fb34ca 100644 --- a/servers/boe-server-course/src/main/resources/application-pro.properties +++ b/servers/boe-server-course/src/main/resources/application-pro.properties @@ -26,7 +26,7 @@ xboe.upload.file.save_path=E:/Projects/BOE/java/static/upload xboe.upload.file.http_path=http://localhost:9090/cdn/upload ## 外部接口调用地址 旧系统机构及用户数据接口 -xboe.externalinterface.url.system=http://localhost:9091 +xboe.externalinterface.url.system=http://u-pre.boe.com:9091 ## 案例接口配置 ## 案例接口配置,init 是否需要初始化 From 363dba845f7830ec892b110f6d46eaef4c2f365c Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 20 Aug 2024 10:53:44 +0800 Subject: [PATCH 43/93] Update application-pro.properties From 9591e60ac48ee1fe6065787b6e50853bef27e90a Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 20 Aug 2024 10:54:48 +0800 Subject: [PATCH 44/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-task/src/main/resources/application-pro.properties b/servers/boe-server-task/src/main/resources/application-pro.properties index f90852fa..d784cabd 100644 --- a/servers/boe-server-task/src/main/resources/application-pro.properties +++ b/servers/boe-server-task/src/main/resources/application-pro.properties @@ -29,10 +29,10 @@ xboe.api.cross_filter=true ## 上传相磁的路径配置 xboe.upload.file.temp_path=E:/Projects/BOE/java/static/temp xboe.upload.file.save_path=E:/Projects/BOE/java/static/upload -xboe.upload.file.http_path=http://localhost:9090/cdn/upload +xboe.upload.file.http_path=http://u-pre.boe.com:9090/cdn/upload ## 外部接口调用地址 旧系统机构及用户数据接口 -xboe.externalinterface.url.system=http://localhost:9091 +xboe.externalinterface.url.system=http://u-pre.boe.com:9091 #加密盐 #jasypt.encryptor.password=jasypt From 2440b6ca50fe27d7850139c1093e103e99cd67d2 Mon Sep 17 00:00:00 2001 From: joshen Date: Tue, 20 Aug 2024 18:41:17 +0800 Subject: [PATCH 45/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/resources/application-pro.properties b/servers/boe-server-all/src/main/resources/application-pro.properties index cbaf21fd..1f526825 100644 --- a/servers/boe-server-all/src/main/resources/application-pro.properties +++ b/servers/boe-server-all/src/main/resources/application-pro.properties @@ -45,7 +45,7 @@ xboe.api.cross_filter=true ## 上传相磁的路径配置 xboe.upload.file.temp_path=/tmp xboe.upload.file.save_path=/home/www/elearning/upload -xboe.upload.file.http_path=http://u-pre.boe.com/upload +xboe.upload.file.http_path=http://127.0.0.1/upload ## 外部接口调用地址 旧系统机构及用户数据接口 xboe.externalinterface.url.system=http://u-pre.boe.com:9091 From b7e8c43b5f398bc02166a0ed66b77fe122a4e4b6 Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Wed, 21 Aug 2024 10:22:08 +0800 Subject: [PATCH 46/93] =?UTF-8?q?=E5=A4=84=E7=90=86study=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?,=E6=B7=BB=E5=8A=A0=E6=8E=A5=E5=8F=A3=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E9=99=90=E5=88=B6=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/boe-server-all/pom.xml | 6 +++++- .../src/main/java/com/xboe/api/vo/Result.java | 3 +++ .../xboe/school/study/api/StudyCourseApi.java | 19 ++++++++++++++++--- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/servers/boe-server-all/pom.xml b/servers/boe-server-all/pom.xml index 8e84c962..4b5efdba 100644 --- a/servers/boe-server-all/pom.xml +++ b/servers/boe-server-all/pom.xml @@ -84,7 +84,11 @@ xboe-module-es 1.0.0 - + + net.jodah + expiringmap + 0.5.10 + it.sauronsoftware jave diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/vo/Result.java b/servers/boe-server-all/src/main/java/com/xboe/api/vo/Result.java index 8f837786..a2c610f7 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/api/vo/Result.java +++ b/servers/boe-server-all/src/main/java/com/xboe/api/vo/Result.java @@ -24,4 +24,7 @@ public class Result { private int totalPage; private List list; + public static Object error(String s) { + return "500 服务异常"; + } } \ No newline at end of file diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index 9e875451..7991bd0c 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -6,13 +6,16 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import cn.hutool.core.util.ArrayUtil; +import com.alibaba.nacos.shaded.com.google.common.util.concurrent.RateLimiter; import com.xboe.api.ThirdApi; import com.xboe.api.vo.*; import com.xboe.module.course.vo.TeacherVo; import com.xboe.module.usergroup.entity.UserGroupItem; import com.xboe.module.usergroup.service.IUserGroupService; +import com.xboe.school.aspect.LimitRequest; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; +import org.aspectj.lang.annotation.Aspect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; @@ -95,7 +98,12 @@ public class StudyCourseApi extends ApiBaseController{ @Autowired StringRedisTemplate redisTemplate; - + private static final RateLimiter rateLimiter = RateLimiter.create(1.0); + public void someApi() { + rateLimiter.acquire(); // 请求之前获取许可 + // 你的业务逻辑 + log.info("Request processed at " + System.currentTimeMillis()); + } /** * 用于查询课程的学习记录 * @param pager @@ -292,6 +300,7 @@ public class StudyCourseApi extends ApiBaseController{ * @param * @return 返回学习条目的id */ + @LimitRequest(count=5) @PostMapping("/study") public JsonResponse study(@RequestBody StudyContentDto sci, HttpServletRequest request){ @@ -321,7 +330,11 @@ public class StudyCourseApi extends ApiBaseController{ if (StringUtils.isEmpty(token)) { token = request.getHeader("token"); } - //检查是否已存在 + StudyCourseApi example = new StudyCourseApi(); + for (int i = 0; i < 10; i++) { + new Thread(() -> example.someApi()).start(); + //检查是否已存在 + } StudyCourseItem item = studyService.checkHas(sci.getStudyId(),sci.getContentId()); if(item!=null) { //如果记录存在,但是进度不100无成情况,就更新进度,一期不会有这种情况 @@ -334,7 +347,7 @@ public class StudyCourseApi extends ApiBaseController{ log.info("在线课学习记录"+allUserList); return success(item.getId()); } - + if(StringUtils.isBlank(sci.getCourseId())){ return error("无课程信息"); } From 4ff47085b8940d92f5c4861b1fa1d78908adb7f2 Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Wed, 21 Aug 2024 10:22:27 +0800 Subject: [PATCH 47/93] =?UTF-8?q?=E5=A4=84=E7=90=86study=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?,=E6=B7=BB=E5=8A=A0=E6=8E=A5=E5=8F=A3=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E9=99=90=E5=88=B6=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/school/aspect/LimitRequest.java | 12 ++++ .../school/aspect/LimitRequestAspect.java | 59 +++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequest.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequestAspect.java diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequest.java b/servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequest.java new file mode 100644 index 00000000..6ff03484 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequest.java @@ -0,0 +1,12 @@ +package com.xboe.school.aspect; + +import java.lang.annotation.*; + +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface LimitRequest { + + long time() default 2000; + int count() default Integer.MAX_VALUE; +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequestAspect.java b/servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequestAspect.java new file mode 100644 index 00000000..8e2368fa --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequestAspect.java @@ -0,0 +1,59 @@ +package com.xboe.school.aspect; + + +import com.xboe.api.vo.Result; +import net.jodah.expiringmap.ExpirationPolicy; +import net.jodah.expiringmap.ExpiringMap; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; + +@Aspect +@Component +public class LimitRequestAspect { + private static ConcurrentHashMap> book = new ConcurrentHashMap<>(); + // 定义切点 + // 让所有有@LimitRequest注解的方法都执行切面方法 + @Pointcut("@annotation(limitRequest)") + public void excudeService(LimitRequest limitRequest) { + } + + @Around("excudeService(limitRequest)") + public Object doAround(ProceedingJoinPoint pjp, LimitRequest limitRequest) throws Throwable { + // 获得request对象 + RequestAttributes ra = RequestContextHolder.getRequestAttributes(); + ServletRequestAttributes sra = (ServletRequestAttributes) ra; + HttpServletRequest request = sra.getRequest(); + + // 获取Map对象, 如果没有则返回默认值 + // 第一个参数是key, 第二个参数是默认值 + ExpiringMap map = book.getOrDefault(request.getRequestURI(), ExpiringMap.builder().variableExpiration().build()); + Integer uCount = map.getOrDefault(request.getRemoteAddr(), 0); + + + if (uCount >= limitRequest.count()) { // 超过次数,不执行目标方法 + //这里的返回对象类型根据controller方法的返回方式一致 + return Result.error("请求过于频繁,请稍后再试"); + } else if (uCount == 0){ // 第一次请求时,设置开始有效时间 + map.put(request.getRemoteAddr(), uCount + 1, ExpirationPolicy.CREATED, limitRequest.time(), TimeUnit.MILLISECONDS); + } else { // 未超过次数, 记录数据加一 + map.put(request.getRemoteAddr(), uCount + 1); + } + book.put(request.getRequestURI(), map); + + // result的值就是被拦截方法的返回值 + Object result = pjp.proceed(); + + return result; + } + +} \ No newline at end of file From 616594af9e6773452eacfce235737afe38e184df Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Wed, 21 Aug 2024 14:00:35 +0800 Subject: [PATCH 48/93] =?UTF-8?q?=E5=A4=84=E7=90=86study=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?,=E6=B7=BB=E5=8A=A0=E6=8E=A5=E5=8F=A3=E8=AE=BF=E9=97=AE?= =?UTF-8?q?=E9=99=90=E5=88=B6=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/school/{aspect => conf}/LimitRequest.java | 2 +- .../xboe/school/{aspect => conf}/LimitRequestAspect.java | 2 +- .../java/com/xboe/school/study/api/StudyCourseApi.java | 8 +------- 3 files changed, 3 insertions(+), 9 deletions(-) rename servers/boe-server-all/src/main/java/com/xboe/school/{aspect => conf}/LimitRequest.java (87%) rename servers/boe-server-all/src/main/java/com/xboe/school/{aspect => conf}/LimitRequestAspect.java (98%) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequest.java b/servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequest.java similarity index 87% rename from servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequest.java rename to servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequest.java index 6ff03484..c943011c 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequest.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequest.java @@ -1,4 +1,4 @@ -package com.xboe.school.aspect; +package com.xboe.school.conf; import java.lang.annotation.*; diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequestAspect.java b/servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequestAspect.java similarity index 98% rename from servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequestAspect.java rename to servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequestAspect.java index 8e2368fa..d8efa0bf 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/aspect/LimitRequestAspect.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequestAspect.java @@ -1,4 +1,4 @@ -package com.xboe.school.aspect; +package com.xboe.school.conf; import com.xboe.api.vo.Result; diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index 7991bd0c..32ef6de6 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -3,19 +3,13 @@ package com.xboe.school.study.api; import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; -import cn.hutool.core.util.ArrayUtil; import com.alibaba.nacos.shaded.com.google.common.util.concurrent.RateLimiter; import com.xboe.api.ThirdApi; -import com.xboe.api.vo.*; import com.xboe.module.course.vo.TeacherVo; -import com.xboe.module.usergroup.entity.UserGroupItem; import com.xboe.module.usergroup.service.IUserGroupService; -import com.xboe.school.aspect.LimitRequest; -import org.apache.commons.lang3.ArrayUtils; +import com.xboe.school.conf.LimitRequest; import org.apache.commons.lang3.StringUtils; -import org.aspectj.lang.annotation.Aspect; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; From 0d0b45f0171c33ceee95aeb76d19d99022c4eda5 Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Tue, 27 Aug 2024 21:14:52 +0800 Subject: [PATCH 49/93] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=AE=A1=E8=AE=A1-Comm?= =?UTF-8?q?ons=20Text=E3=80=81tomcat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/boe-server-all/pom.xml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/servers/boe-server-all/pom.xml b/servers/boe-server-all/pom.xml index 8e84c962..e6cedf36 100644 --- a/servers/boe-server-all/pom.xml +++ b/servers/boe-server-all/pom.xml @@ -18,6 +18,7 @@ 2021.0.5 2021.0.5.0 2.2.0 + 9.0.69 @@ -58,11 +59,19 @@ xboe-module-scorm 1.0.0 - + + com.xboe xboe-core 1.0.0 + + + org.apache.commons + commons-text + 1.10.0 + + com.xboe xboe-redis From 1021f0bd4336f20f2cd3f964c80d7f7354f7a792 Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Wed, 28 Aug 2024 15:00:21 +0800 Subject: [PATCH 50/93] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=AE=A1=E8=AE=A1-spri?= =?UTF-8?q?ng?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/boe-server-all/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/servers/boe-server-all/pom.xml b/servers/boe-server-all/pom.xml index e6cedf36..48f9ff82 100644 --- a/servers/boe-server-all/pom.xml +++ b/servers/boe-server-all/pom.xml @@ -242,6 +242,13 @@ spring-retry 1.3.1 + + + org.springframework + spring-context + 5.3.26 + + From 3735c380014374c760be9abbfa7889d731ca2490 Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Thu, 29 Aug 2024 14:56:05 +0800 Subject: [PATCH 51/93] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=80=83=E8=AF=95?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=90=8D=E7=A7=B0=E6=9D=A1=E4=BB=B6=E7=AD=9B?= =?UTF-8?q?=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/boe-server-all/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/servers/boe-server-all/pom.xml b/servers/boe-server-all/pom.xml index 8e84c962..ddbfed93 100644 --- a/servers/boe-server-all/pom.xml +++ b/servers/boe-server-all/pom.xml @@ -125,6 +125,7 @@ org.springframework.boot spring-boot-starter-web + 2.7.18 org.springframework.session From 163425cad2c92cbfb829280771dd2d47e15ee44e Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Thu, 29 Aug 2024 14:56:32 +0800 Subject: [PATCH 52/93] =?UTF-8?q?=E5=AE=A1=E8=AE=A1=E6=BC=8F=E6=B4=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/boe-server-all/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/servers/boe-server-all/pom.xml b/servers/boe-server-all/pom.xml index ddbfed93..30f84073 100644 --- a/servers/boe-server-all/pom.xml +++ b/servers/boe-server-all/pom.xml @@ -127,6 +127,7 @@ spring-boot-starter-web 2.7.18 + org.springframework.session spring-session-data-redis From f7cd9f8469d9e243f0887d4a7978f61965a0fd51 Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Thu, 29 Aug 2024 15:15:05 +0800 Subject: [PATCH 53/93] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=AE=A1=E8=AE=A1-spri?= =?UTF-8?q?ng=E3=80=81snakeyaml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/boe-server-all/pom.xml | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/servers/boe-server-all/pom.xml b/servers/boe-server-all/pom.xml index 48f9ff82..1bfd178b 100644 --- a/servers/boe-server-all/pom.xml +++ b/servers/boe-server-all/pom.xml @@ -59,19 +59,11 @@ xboe-module-scorm 1.0.0 - com.xboe xboe-core 1.0.0 - - - org.apache.commons - commons-text - 1.10.0 - - com.xboe xboe-redis @@ -249,6 +241,18 @@ 5.3.26 + + org.yaml + snakeyaml + 2.0 + + + + org.apache.commons + commons-text + 1.10.0 + + From 04a4f528bf8d5365006d84907db16df43b9f89dc Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Thu, 29 Aug 2024 16:18:24 +0800 Subject: [PATCH 54/93] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=AE=A1=E8=AE=A1-tomc?= =?UTF-8?q?at?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/boe-server-all/pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/servers/boe-server-all/pom.xml b/servers/boe-server-all/pom.xml index 1bfd178b..99bd59f1 100644 --- a/servers/boe-server-all/pom.xml +++ b/servers/boe-server-all/pom.xml @@ -18,7 +18,6 @@ 2021.0.5 2021.0.5.0 2.2.0 - 9.0.69 @@ -253,6 +252,12 @@ 1.10.0 + + org.apache.tomcat.embed + tomcat-embed-core + 9.0.83 + + From 6dadd803728dad1b4fcba088208fa625c2ccf40e Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Thu, 29 Aug 2024 16:48:54 +0800 Subject: [PATCH 55/93] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=AE=A1=E8=AE=A1-spri?= =?UTF-8?q?ng?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/boe-server-all/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/pom.xml b/servers/boe-server-all/pom.xml index 99bd59f1..659950ee 100644 --- a/servers/boe-server-all/pom.xml +++ b/servers/boe-server-all/pom.xml @@ -236,7 +236,7 @@ org.springframework - spring-context + spring-webmvc 5.3.26 From 5070be06201417badc9855272940a910ea95596d Mon Sep 17 00:00:00 2001 From: lu Date: Mon, 2 Sep 2024 11:39:05 +0800 Subject: [PATCH 56/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E7=A1=AE=E4=BF=9D=E7=9B=AE=E5=BD=95=E5=AD=98=E5=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CoursePortalApi.java | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 990e1fa7..07d15909 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -365,7 +365,7 @@ public class CoursePortalApi extends ApiBaseController{ } //作业导出 @GetMapping("/export") - public JsonResponse export(String courseName,String courseId,String contentId,String name,Integer status) throws IOException { + public JsonResponse export(String courseId,String contentId,String name,Integer status) throws IOException { Mapmap=new HashMap<>(); List userIds = studyCourseDao.findList(FieldFilters.eq("courseId", courseId)).stream().filter(Objects::nonNull).map(StudyCourse::getAid).collect(Collectors.toList()); if (userIds.isEmpty()){ @@ -404,21 +404,7 @@ public class CoursePortalApi extends ApiBaseController{ if (totalFileSize > 2L * 1024 * 1024 * 1024) { return success("您要下载的作业过大,请分批下载或联系管理员!"); } - -// String encodedFilename = URLEncoder.encode(courseName+"【作业】.zip") -// .replace("+", "%20") // 空格替换为"%20" -// .replace("%2F", "/"); // 解决斜杠问题 -// StringBuilder contentDispositionValue = new StringBuilder(); -// contentDispositionValue.append("attachment; filename=\"") -// .append(encodedFilename) -// .append("\"") -// .append("; filename*=utf-8''") -// .append(encodedFilename); -// -// // 设置响应类型和Content-Disposition头 -// response.setContentType("application/zip"); - - // 创建一个临时文件用于存储ZIP文件 + // 创建一个临时文件用于存储ZIP文件 File tempZipFile = new File("/home/www/elearning/upload/temp.zip"); try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(tempZipFile))) { @@ -447,6 +433,9 @@ public class CoursePortalApi extends ApiBaseController{ String uuid = UUID.randomUUID().toString(); Path destination = Paths.get("/home/www/elearning/upload/saveZip/" + uuid + ".zip"); + // 确保目标目录存在 + Files.createDirectories(destination.getParent()); + // 删除目标文件如果已存在 if (Files.exists(destination)) { Files.delete(destination); From 45fce7927dc2ea4cf401581d795f9aca3a315c88 Mon Sep 17 00:00:00 2001 From: lu Date: Tue, 3 Sep 2024 11:21:37 +0800 Subject: [PATCH 57/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/module/course/api/CoursePortalApi.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 07d15909..180733fd 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -365,7 +365,7 @@ public class CoursePortalApi extends ApiBaseController{ } //作业导出 @GetMapping("/export") - public JsonResponse export(String courseId,String contentId,String name,Integer status) throws IOException { + public JsonResponse export(String courseId,String courseName,String contentId,String name,Integer status) throws IOException { Mapmap=new HashMap<>(); List userIds = studyCourseDao.findList(FieldFilters.eq("courseId", courseId)).stream().filter(Objects::nonNull).map(StudyCourse::getAid).collect(Collectors.toList()); if (userIds.isEmpty()){ @@ -430,8 +430,8 @@ public class CoursePortalApi extends ApiBaseController{ // 将临时文件移动到指定位置 Path source = tempZipFile.toPath(); //生成uuid - String uuid = UUID.randomUUID().toString(); - Path destination = Paths.get("/home/www/elearning/upload/saveZip/" + uuid + ".zip"); +// String uuid = UUID.randomUUID().toString(); + Path destination = Paths.get("/home/www/elearning/upload/saveZip/" + courseName+"【作业】" + ".zip"); // 确保目标目录存在 Files.createDirectories(destination.getParent()); From 0fcd4568ecedc30a2018f2a013df208a766dd342 Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Wed, 4 Sep 2024 16:35:33 +0800 Subject: [PATCH 58/93] =?UTF-8?q?802bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/constants/CacheName.java | 2 + .../com/xboe/school/conf/LimitRequest.java | 12 ---- .../xboe/school/conf/LimitRequestAspect.java | 59 ------------------- .../xboe/school/study/api/StudyCourseApi.java | 26 ++++++-- 4 files changed, 23 insertions(+), 76 deletions(-) delete mode 100644 servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequest.java delete mode 100644 servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequestAspect.java diff --git a/servers/boe-server-all/src/main/java/com/xboe/constants/CacheName.java b/servers/boe-server-all/src/main/java/com/xboe/constants/CacheName.java index b92aff08..3d765d51 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/constants/CacheName.java +++ b/servers/boe-server-all/src/main/java/com/xboe/constants/CacheName.java @@ -133,4 +133,6 @@ public interface CacheName { * 字典缓存key * */ String KEY_DICT="dict"; + + String STUDY_KEY = "StudyKey:"; } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequest.java b/servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequest.java deleted file mode 100644 index c943011c..00000000 --- a/servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.xboe.school.conf; - -import java.lang.annotation.*; - -@Documented -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface LimitRequest { - - long time() default 2000; - int count() default Integer.MAX_VALUE; -} diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequestAspect.java b/servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequestAspect.java deleted file mode 100644 index d8efa0bf..00000000 --- a/servers/boe-server-all/src/main/java/com/xboe/school/conf/LimitRequestAspect.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.xboe.school.conf; - - -import com.xboe.api.vo.Result; -import net.jodah.expiringmap.ExpirationPolicy; -import net.jodah.expiringmap.ExpiringMap; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; -import org.springframework.stereotype.Component; -import org.springframework.web.context.request.RequestAttributes; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; - -import javax.servlet.http.HttpServletRequest; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.TimeUnit; - -@Aspect -@Component -public class LimitRequestAspect { - private static ConcurrentHashMap> book = new ConcurrentHashMap<>(); - // 定义切点 - // 让所有有@LimitRequest注解的方法都执行切面方法 - @Pointcut("@annotation(limitRequest)") - public void excudeService(LimitRequest limitRequest) { - } - - @Around("excudeService(limitRequest)") - public Object doAround(ProceedingJoinPoint pjp, LimitRequest limitRequest) throws Throwable { - // 获得request对象 - RequestAttributes ra = RequestContextHolder.getRequestAttributes(); - ServletRequestAttributes sra = (ServletRequestAttributes) ra; - HttpServletRequest request = sra.getRequest(); - - // 获取Map对象, 如果没有则返回默认值 - // 第一个参数是key, 第二个参数是默认值 - ExpiringMap map = book.getOrDefault(request.getRequestURI(), ExpiringMap.builder().variableExpiration().build()); - Integer uCount = map.getOrDefault(request.getRemoteAddr(), 0); - - - if (uCount >= limitRequest.count()) { // 超过次数,不执行目标方法 - //这里的返回对象类型根据controller方法的返回方式一致 - return Result.error("请求过于频繁,请稍后再试"); - } else if (uCount == 0){ // 第一次请求时,设置开始有效时间 - map.put(request.getRemoteAddr(), uCount + 1, ExpirationPolicy.CREATED, limitRequest.time(), TimeUnit.MILLISECONDS); - } else { // 未超过次数, 记录数据加一 - map.put(request.getRemoteAddr(), uCount + 1); - } - book.put(request.getRequestURI(), map); - - // result的值就是被拦截方法的返回值 - Object result = pjp.proceed(); - - return result; - } - -} \ No newline at end of file diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index 32ef6de6..32427fc0 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -6,9 +6,9 @@ import java.util.concurrent.TimeUnit; import com.alibaba.nacos.shaded.com.google.common.util.concurrent.RateLimiter; import com.xboe.api.ThirdApi; +import com.xboe.constants.CacheName; import com.xboe.module.course.vo.TeacherVo; import com.xboe.module.usergroup.service.IUserGroupService; -import com.xboe.school.conf.LimitRequest; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; @@ -294,7 +294,7 @@ public class StudyCourseApi extends ApiBaseController{ * @param * @return 返回学习条目的id */ - @LimitRequest(count=5) + //@LimitRequest(count=5) @PostMapping("/study") public JsonResponse study(@RequestBody StudyContentDto sci, HttpServletRequest request){ @@ -329,17 +329,33 @@ public class StudyCourseApi extends ApiBaseController{ new Thread(() -> example.someApi()).start(); //检查是否已存在 } + StudyCourseItem item = studyService.checkHas(sci.getStudyId(),sci.getContentId()); if(item!=null) { - //如果记录存在,但是进度不100无成情况,就更新进度,一期不会有这种情况 - if(item.getProgress()<100 && sci.getProgress()>item.getProgress()) { - studyService.updateProcess(item.getId(), sci.getStudyId(), sci.getCourseId(), sci.getContentTotal(), sci.getProgress(),token); + String studyKey = CacheName.NAME_AUTH + ":" + CacheName.STUDY_KEY + item.getCourseId()+":"+cuser.getAccountId()+":"+item.getContentId(); + String studyKey2 = CacheName.NAME_AUTH + ":" + CacheName.STUDY_KEY + sci.getCourseId()+":"+cuser.getAccountId()+":"+sci.getContentId(); + redisTemplate.opsForValue().set(studyKey, + String.valueOf(item.getProgress()), 2, TimeUnit.HOURS); + String progressStr = redisTemplate.opsForValue().get(studyKey2); + if (progressStr != null && !progressStr.isEmpty()) { + // 尝试将 Redis 中的字符串转换为整数 + int redisProgress = Integer.parseInt(progressStr); + // 假设 item.getProgress() 返回的是 int 类型 + int sciProgress = sci.getProgress(); + + if (redisProgress < sciProgress && redisProgress < 100) { + // 执行一些操作 +// if(item.getProgress()<100 && sci.getProgress()>item.getProgress()) { +// } + studyService.updateProcess(item.getId(), sci.getStudyId(), sci.getCourseId(), sci.getContentTotal(), sci.getProgress(),token); + } } //追加学习时长 studyService.appendStudyDuration(sci.getStudyId(),item.getId(),sci.getContentId(),sci.getDuration()); List allUserList = thirdApi.getStudyCourseList(sci.getStudyId() ,sci.getCourseId(), token); log.info("在线课学习记录"+allUserList); return success(item.getId()); + //如果记录存在,但是进度不100无成情况,就更新进度,一期不会有这种情况 } if(StringUtils.isBlank(sci.getCourseId())){ From 903a1369f58c28bb21ddc701bcf80c5d693db5d4 Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Wed, 4 Sep 2024 16:48:12 +0800 Subject: [PATCH 59/93] =?UTF-8?q?=E5=A4=9A=E4=BD=99=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/boe-server-all/pom.xml | 5 ----- .../src/main/java/com/xboe/api/vo/Result.java | 3 --- .../main/java/com/xboe/school/study/api/StudyCourseApi.java | 6 ------ 3 files changed, 14 deletions(-) diff --git a/servers/boe-server-all/pom.xml b/servers/boe-server-all/pom.xml index 4b5efdba..2c0d034a 100644 --- a/servers/boe-server-all/pom.xml +++ b/servers/boe-server-all/pom.xml @@ -84,11 +84,6 @@ xboe-module-es 1.0.0 - - net.jodah - expiringmap - 0.5.10 - it.sauronsoftware jave diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/vo/Result.java b/servers/boe-server-all/src/main/java/com/xboe/api/vo/Result.java index a2c610f7..8f837786 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/api/vo/Result.java +++ b/servers/boe-server-all/src/main/java/com/xboe/api/vo/Result.java @@ -24,7 +24,4 @@ public class Result { private int totalPage; private List list; - public static Object error(String s) { - return "500 服务异常"; - } } \ No newline at end of file diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index 32427fc0..7d5598a6 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -324,12 +324,6 @@ public class StudyCourseApi extends ApiBaseController{ if (StringUtils.isEmpty(token)) { token = request.getHeader("token"); } - StudyCourseApi example = new StudyCourseApi(); - for (int i = 0; i < 10; i++) { - new Thread(() -> example.someApi()).start(); - //检查是否已存在 - } - StudyCourseItem item = studyService.checkHas(sci.getStudyId(),sci.getContentId()); if(item!=null) { String studyKey = CacheName.NAME_AUTH + ":" + CacheName.STUDY_KEY + item.getCourseId()+":"+cuser.getAccountId()+":"+item.getContentId(); From aa32e9136c265ba05ad397ceefb201daa06e81a4 Mon Sep 17 00:00:00 2001 From: nisen Date: Thu, 5 Sep 2024 11:09:43 +0800 Subject: [PATCH 60/93] =?UTF-8?q?104-master=E4=BB=A3=E7=A2=BC=E5=9B=9E?= =?UTF-8?q?=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- servers/boe-server-all/pom.xml | 201 ++++++++---------- .../module/course/api/CoursePortalApi.java | 71 ++++--- 2 files changed, 128 insertions(+), 144 deletions(-) diff --git a/servers/boe-server-all/pom.xml b/servers/boe-server-all/pom.xml index 3dbb1d69..04b41372 100644 --- a/servers/boe-server-all/pom.xml +++ b/servers/boe-server-all/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot @@ -16,38 +16,38 @@ 1.8 2021.0.5 - 2021.0.5.0 - 2.2.0 + 2021.0.5.0 + 2.2.0 - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - ${spring-cloud-alibaba.version} - - - com.alibaba.nacos - nacos-client - - - - - com.alibaba.nacos - nacos-client - ${nacos-client.version} - - + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + ${spring-cloud-alibaba.version} + + + com.alibaba.nacos + nacos-client + + + + + com.alibaba.nacos + nacos-client + ${nacos-client.version} + + org.apache.poi poi-ooxml 4.0.1 - - cn.hutool - hutool-all - 5.8.16 - + + cn.hutool + hutool-all + 5.8.16 + com.xboe xboe-api @@ -93,9 +93,9 @@ ${project.basedir}/src/main/resources/libs/jave-1.0.2.jar - com.auth0 - java-jwt - 3.18.3 + com.auth0 + java-jwt + 3.18.3 - - com.aspose - slides - 15.9.0 - system - ${project.basedir}/src/main/resources/aspose/aspose.slides-15.9.0.jar - + + com.aspose + slides + 15.9.0 + system + ${project.basedir}/src/main/resources/aspose/aspose.slides-15.9.0.jar + com.aspose words @@ -216,79 +214,54 @@ 3.0.3 - org.elasticsearch.client - elasticsearch-rest-high-level-client - 7.9.0 - - - org.elasticsearch - elasticsearch - 7.9.0 - - - org.elasticsearch.client - elasticsearch-rest-client - 7.9.0 - + org.elasticsearch.client + elasticsearch-rest-high-level-client + 7.9.0 + + + org.elasticsearch + elasticsearch + 7.9.0 + + + org.elasticsearch.client + elasticsearch-rest-client + 7.9.0 + org.springframework.retry spring-retry 1.3.1 - - - org.springframework - spring-webmvc - 5.3.26 - - - - org.yaml - snakeyaml - 2.0 - - - - org.apache.commons - commons-text - 1.10.0 - - - - org.apache.tomcat.embed - tomcat-embed-core - 9.0.83 - - - - true - src/main/resources - - application-${profileActive}.properties - application.properties - - - - false - src/main/resources - - *.properties - - - + + true + src/main/resources + + application-${profileActive}.properties + application.properties + + + + false + src/main/resources + + *.properties + + + - org.apache.maven.plugins - maven-compiler-plugin - - - 1.8 - 1.8 - - + org.apache.maven.plugins + maven-compiler-plugin + + + 1.8 + 1.8 + + org.springframework.boot spring-boot-maven-plugin @@ -299,8 +272,8 @@ lombok - true - + true + @@ -323,12 +296,12 @@ test - - test135 - - test135 - - + + test135 + + test135 + + dev diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 07d15909..faedad72 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -74,19 +74,19 @@ public class CoursePortalApi extends ApiBaseController{ @Resource private ICourseService courseService; - + @Resource private ITeacherService teacherService; - + @Resource private ICourseContentService contentService; - + @Resource private ICourseSectionService sectionService; @Resource private ICourseTeacherService courseTeacherService; - + @Autowired private IUserGroupService userGroupService; @@ -124,9 +124,9 @@ public class CoursePortalApi extends ApiBaseController{ Map list=courseService.findImages(cids); return success(list); } - + /** - * 人气榜 + * 人气榜 * */ @PostMapping("/ranking") public JsonResponse> Ranking(Integer type,Integer time){ @@ -152,7 +152,7 @@ public class CoursePortalApi extends ApiBaseController{ return success(rankingDtos); } - + /** * 查询列表,数量,类型,最新,最热 * @param num @@ -178,7 +178,7 @@ public class CoursePortalApi extends ApiBaseController{ } dto.setDevice(device); try { - + List list=courseService.findList(num, dto); return success(list); }catch(Exception e) { @@ -186,10 +186,10 @@ public class CoursePortalApi extends ApiBaseController{ return error("查询课程列表失败",e.getMessage()); } } - + @PostMapping("/pagelist-new") public JsonResponse> findNewPage(Pagination pager,CourseQueryDto dto){ - + //只是查询已发布的 dto.setPublish(true); @@ -211,9 +211,9 @@ public class CoursePortalApi extends ApiBaseController{ } } } - + return success(coursePageList); - + } /** @@ -224,7 +224,7 @@ public class CoursePortalApi extends ApiBaseController{ */ @PostMapping("/pagelist") public JsonResponse> findPage(Pagination pager,CourseQueryDto dto){ - + //只是查询已发布的 dto.setPublish(true); @@ -245,11 +245,11 @@ public class CoursePortalApi extends ApiBaseController{ } } } - + return success(coursePageList); - + } - + /** * 获取详细信息 * @param id @@ -260,19 +260,19 @@ public class CoursePortalApi extends ApiBaseController{ if(StringUtils.isBlank(id)) { return badRequest("参数错误,未指定课程"); } - + //当前对于课程不增加浏览量,课程的意义并不是看过 // if(addView==null) { // addView=false; // } - + Map rs=new HashMap(); Course course=courseService.getAddView(id); if(course==null || course.getDeleted()){ return badRequest("课程不存在或已被删除"); } rs.put("course",course); - + List courseCrowdList = courseService.findCrowdByCourseId(id); if(crowd!=null && crowd) { rs.put("crowds",courseCrowdList); @@ -315,7 +315,7 @@ public class CoursePortalApi extends ApiBaseController{ List cclist=contentService.getByCourseId(id); List sectionlist=sectionService.getByCourseId(id); List teachers=courseService.findTeachersByCourseId(id); - + //获取教师的介绍信息,因为一门课程 的教师不会太多,所以这里简单直接遍历查询,后续再优化 for(CourseTeacher ct : teachers) { @@ -335,7 +335,7 @@ public class CoursePortalApi extends ApiBaseController{ } } } - + } rs.put("isCrowd",pass); @@ -344,7 +344,7 @@ public class CoursePortalApi extends ApiBaseController{ rs.put("teachers",teachers); //查询课程 return success(rs); - + } private void getTeacherInfo(String token, List teacherIds) { List teacherInfo = thirdApi.getTeacherInfo(teacherIds, token); @@ -363,9 +363,9 @@ public class CoursePortalApi extends ApiBaseController{ } } - //作业导出 + //作业导出 @GetMapping("/export") - public JsonResponse export(String courseId,String contentId,String name,Integer status) throws IOException { + public JsonResponse export(String courseName,String courseId,String contentId,String name,Integer status) throws IOException { Mapmap=new HashMap<>(); List userIds = studyCourseDao.findList(FieldFilters.eq("courseId", courseId)).stream().filter(Objects::nonNull).map(StudyCourse::getAid).collect(Collectors.toList()); if (userIds.isEmpty()){ @@ -404,6 +404,20 @@ public class CoursePortalApi extends ApiBaseController{ if (totalFileSize > 2L * 1024 * 1024 * 1024) { return success("您要下载的作业过大,请分批下载或联系管理员!"); } + +// String encodedFilename = URLEncoder.encode(courseName+"【作业】.zip") +// .replace("+", "%20") // 空格替换为"%20" +// .replace("%2F", "/"); // 解决斜杠问题 +// StringBuilder contentDispositionValue = new StringBuilder(); +// contentDispositionValue.append("attachment; filename=\"") +// .append(encodedFilename) +// .append("\"") +// .append("; filename*=utf-8''") +// .append(encodedFilename); +// +// // 设置响应类型和Content-Disposition头 +// response.setContentType("application/zip"); + // 创建一个临时文件用于存储ZIP文件 File tempZipFile = new File("/home/www/elearning/upload/temp.zip"); @@ -429,13 +443,10 @@ public class CoursePortalApi extends ApiBaseController{ } // 将临时文件移动到指定位置 Path source = tempZipFile.toPath(); - //生成uuid - String uuid = UUID.randomUUID().toString(); + //生成uuid + String uuid = UUID.randomUUID().toString(); Path destination = Paths.get("/home/www/elearning/upload/saveZip/" + uuid + ".zip"); - // 确保目标目录存在 - Files.createDirectories(destination.getParent()); - // 删除目标文件如果已存在 if (Files.exists(destination)) { Files.delete(destination); @@ -492,7 +503,7 @@ public class CoursePortalApi extends ApiBaseController{ cv.setStatus(9); } } - //音视频 + //音视频 }else{ cv.setStatus(study.getStatus()); From d2043da06284a3489ed5670bfcb9cfdf48c67ef5 Mon Sep 17 00:00:00 2001 From: joshen Date: Sun, 8 Sep 2024 13:25:25 +0800 Subject: [PATCH 61/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/servers/boe-server-all/src/main/resources/application-pro.properties b/servers/boe-server-all/src/main/resources/application-pro.properties index 1f526825..6c34e8bb 100644 --- a/servers/boe-server-all/src/main/resources/application-pro.properties +++ b/servers/boe-server-all/src/main/resources/application-pro.properties @@ -45,17 +45,18 @@ xboe.api.cross_filter=true ## 上传相磁的路径配置 xboe.upload.file.temp_path=/tmp xboe.upload.file.save_path=/home/www/elearning/upload -xboe.upload.file.http_path=http://127.0.0.1/upload +xboe.upload.file.http_path=https://u.boe.com/upload ## 外部接口调用地址 旧系统机构及用户数据接口 -xboe.externalinterface.url.system=http://u-pre.boe.com:9091 +xboe.externalinterface.url.system=http://127.0.0.1:9091 ## ????????????? -xboe.old.base.url=http://u-pre.boe.com +xboe.old.base.url=https://u.boe.com + ## ???????api?? -xboe.stat.base.url=http://u-pre.boe.com:9080 -xboe.server.userbasic.url=http://u-pre.boe.com/userbasic +xboe.stat.base.url=http://127.0.0.1:9080 +xboe.server.userbasic.url=https://u.boe.com/userbasic #??? #jasypt.encryptor.password=jasypt @@ -69,7 +70,7 @@ xboe.elasticsearch.server.user= xboe.elasticsearch.server.password= ## ????? -xboe.email.url=http://u-pre.boe.com/api/b1/email/send +xboe.email.url=https://u.boe.com/api/b1/email/send xboe.email.from=boeu_learning@boe.com.cn xboe.email.user= xboe.email.security= From 056d15e5fa5075228075e0333f41a880f9624826 Mon Sep 17 00:00:00 2001 From: joshen Date: Sun, 8 Sep 2024 13:27:40 +0800 Subject: [PATCH 62/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-basic/src/main/resources/application-pro.properties b/servers/boe-server-basic/src/main/resources/application-pro.properties index 1ae5f9f6..cd1a52f9 100644 --- a/servers/boe-server-basic/src/main/resources/application-pro.properties +++ b/servers/boe-server-basic/src/main/resources/application-pro.properties @@ -43,10 +43,11 @@ xboe.api.cross_filter=true ## 上传相磁的路径配置 xboe.upload.file.temp_path=/tmp xboe.upload.file.save_path=/home/www/elearning/upload -xboe.upload.file.http_path=http://u-pre.boe.com/upload +xboe.upload.file.http_path=https://u.boe.com/upload ## 新系统的内部地址,可以不通过nginx调用 -xboe.inner.data.sync.baseurl=http://u-pre.boe.com:9090 +xboe.inner.data.sync.baseurl=http://127.0.0.1:9090 + #加密盐 #jasypt.encryptor.password=jasypt From 2986344fd5ece6911d913bae775aa2da4b5e3870 Mon Sep 17 00:00:00 2001 From: joshen Date: Sun, 8 Sep 2024 13:29:40 +0800 Subject: [PATCH 63/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-course/src/main/resources/application-pro.properties b/servers/boe-server-course/src/main/resources/application-pro.properties index 31fb34ca..5f6b3d53 100644 --- a/servers/boe-server-course/src/main/resources/application-pro.properties +++ b/servers/boe-server-course/src/main/resources/application-pro.properties @@ -26,7 +26,7 @@ xboe.upload.file.save_path=E:/Projects/BOE/java/static/upload xboe.upload.file.http_path=http://localhost:9090/cdn/upload ## 外部接口调用地址 旧系统机构及用户数据接口 -xboe.externalinterface.url.system=http://u-pre.boe.com:9091 +xboe.externalinterface.url.system=http://localhost:9091 ## 案例接口配置 ## 案例接口配置,init 是否需要初始化 From f8257a1806f514c8109ff3ae0414abb7b4e76944 Mon Sep 17 00:00:00 2001 From: joshen Date: Sun, 8 Sep 2024 13:31:10 +0800 Subject: [PATCH 64/93] Update application-pro.properties --- .../src/main/resources/application-pro.properties | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/servers/boe-server-task/src/main/resources/application-pro.properties b/servers/boe-server-task/src/main/resources/application-pro.properties index d784cabd..7c8b4fd4 100644 --- a/servers/boe-server-task/src/main/resources/application-pro.properties +++ b/servers/boe-server-task/src/main/resources/application-pro.properties @@ -29,11 +29,10 @@ xboe.api.cross_filter=true ## 上传相磁的路径配置 xboe.upload.file.temp_path=E:/Projects/BOE/java/static/temp xboe.upload.file.save_path=E:/Projects/BOE/java/static/upload -xboe.upload.file.http_path=http://u-pre.boe.com:9090/cdn/upload +xboe.upload.file.http_path=http://localhost:9090/cdn/upload ## 外部接口调用地址 旧系统机构及用户数据接口 -xboe.externalinterface.url.system=http://u-pre.boe.com:9091 - +xboe.externalinterface.url.system=http://localhost:9091 #加密盐 #jasypt.encryptor.password=jasypt jasypt.encryptor.algorithm=PBEWithMD5AndDES From 29a17efd44b2b846452f3a45e4173796d1c546e1 Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Tue, 10 Sep 2024 15:32:54 +0800 Subject: [PATCH 65/93] =?UTF-8?q?=E5=A4=9A=E4=BD=99=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/school/study/api/StudyCourseApi.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java index 7d5598a6..73b49625 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/api/StudyCourseApi.java @@ -92,12 +92,6 @@ public class StudyCourseApi extends ApiBaseController{ @Autowired StringRedisTemplate redisTemplate; - private static final RateLimiter rateLimiter = RateLimiter.create(1.0); - public void someApi() { - rateLimiter.acquire(); // 请求之前获取许可 - // 你的业务逻辑 - log.info("Request processed at " + System.currentTimeMillis()); - } /** * 用于查询课程的学习记录 * @param pager @@ -289,12 +283,7 @@ public class StudyCourseApi extends ApiBaseController{ } - /** - * 记录学习信息,在学习每个资源时都要记录.前端用户打开课程资源按规则调用带着课程及学习信息调用此接口。 - * @param - * @return 返回学习条目的id - */ - //@LimitRequest(count=5) + @PostMapping("/study") public JsonResponse study(@RequestBody StudyContentDto sci, HttpServletRequest request){ From 2c967cef0a345594a2427e228ac5468db7ab5853 Mon Sep 17 00:00:00 2001 From: lu Date: Tue, 10 Sep 2024 17:10:48 +0800 Subject: [PATCH 66/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA500?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CoursePortalApi.java | 98 ++++++++++++------- 1 file changed, 64 insertions(+), 34 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 180733fd..75d3d6a7 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -404,49 +404,79 @@ public class CoursePortalApi extends ApiBaseController{ if (totalFileSize > 2L * 1024 * 1024 * 1024) { return success("您要下载的作业过大,请分批下载或联系管理员!"); } + // 创建压缩文件 + String zipFilePath = "/home/www/elearning/upload/saveZip/" + courseName+"【作业】" + ".zip"; + createZipFile(map, zipFilePath); + return success(zipFilePath); // 创建一个临时文件用于存储ZIP文件 - File tempZipFile = new File("/home/www/elearning/upload/temp.zip"); +// File tempZipFile = new File("/home/www/elearning/upload/temp.zip"); +// +// try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(tempZipFile))) { +// for (Map.Entry e : map.entrySet()) { +// File fileToZip = new File(e.getValue()); +// // 添加 ZIP 条目 +// ZipEntry entry = new ZipEntry(e.getKey()); +// entry.setSize(fileToZip.length()); +// +// zos.putNextEntry(entry); +// +// try (FileInputStream fis = new FileInputStream(fileToZip)) { +// byte[] buffer = new byte[4096]; +// int len; +// while ((len = fis.read(buffer)) > 0) { +// zos.write(buffer, 0, len); +// } +// } +// +// zos.closeEntry(); +// } +// } +// // 将临时文件移动到指定位置 +// Path source = tempZipFile.toPath(); +// //生成uuid +//// String uuid = UUID.randomUUID().toString(); +// Path destination = Paths.get("/home/www/elearning/upload/saveZip/" + courseName+"【作业】" + ".zip"); +// +// // 确保目标目录存在 +// Files.createDirectories(destination.getParent()); +// +// // 删除目标文件如果已存在 +// if (Files.exists(destination)) { +// Files.delete(destination); +// } +// +// // 移动文件 +// Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING); +// +// // 返回文件路径给前端 +// String filePath = destination.toAbsolutePath().toString(); +// return success(filePath); + } + private static void createZipFile(Map map, String zipFilePath) throws IOException { + try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFilePath))) { + for (Map.Entry entry : map.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); - try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(tempZipFile))) { - for (Map.Entry e : map.entrySet()) { - File fileToZip = new File(e.getValue()); - // 添加 ZIP 条目 - ZipEntry entry = new ZipEntry(e.getKey()); - entry.setSize(fileToZip.length()); + File file = new File(value); + if (!file.exists()) { + continue; + } - zos.putNextEntry(entry); + byte[] buffer = new byte[1024]; + FileInputStream fis = new FileInputStream(file); + ZipEntry zipEntry = new ZipEntry(key); + zos.putNextEntry(zipEntry); - try (FileInputStream fis = new FileInputStream(fileToZip)) { - byte[] buffer = new byte[4096]; - int len; - while ((len = fis.read(buffer)) > 0) { - zos.write(buffer, 0, len); - } + int length; + while ((length = fis.read(buffer)) > 0) { + zos.write(buffer, 0, length); } zos.closeEntry(); + fis.close(); } } - // 将临时文件移动到指定位置 - Path source = tempZipFile.toPath(); - //生成uuid -// String uuid = UUID.randomUUID().toString(); - Path destination = Paths.get("/home/www/elearning/upload/saveZip/" + courseName+"【作业】" + ".zip"); - - // 确保目标目录存在 - Files.createDirectories(destination.getParent()); - - // 删除目标文件如果已存在 - if (Files.exists(destination)) { - Files.delete(destination); - } - - // 移动文件 - Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING); - - // 返回文件路径给前端 - String filePath = destination.toAbsolutePath().toString(); - return success(filePath); } @GetMapping("/detail-study") public JsonResponse> detailStudy(String courseId, String aid){ From 120a4f45fcb220bc9157572fa314f1ab5e78d7d7 Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Thu, 12 Sep 2024 14:35:13 +0800 Subject: [PATCH 67/93] =?UTF-8?q?=E8=AF=95=E9=A2=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/module/exam/api/ExamQuestionApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java index be826651..fbc64aff 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java @@ -166,12 +166,12 @@ public class ExamQuestionApi extends ApiBaseController { return badRequest("请上传正确的试题文件"); } //获取表头 - Row row = sheetAt.getRow(1); + Row row = sheetAt.getRow(2); //从第二行开始获取数据 List examQuestions1 = new ArrayList<>(); QuestionDto questionDto = new QuestionDto(); - for (int i=2;i Date: Fri, 13 Sep 2024 15:08:45 +0800 Subject: [PATCH 68/93] =?UTF-8?q?=E8=AF=95=E9=A2=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/exam/api/ExamQuestionApi.java | 295 ++++++++++++------ 1 file changed, 204 insertions(+), 91 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java index fbc64aff..d8eca884 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java @@ -166,118 +166,231 @@ public class ExamQuestionApi extends ApiBaseController { return badRequest("请上传正确的试题文件"); } //获取表头 - Row row = sheetAt.getRow(2); + Row row ; //从第二行开始获取数据 List examQuestions1 = new ArrayList<>(); QuestionDto questionDto = new QuestionDto(); + if(sheetAt.getRow(1).getCell(1).getStringCellValue().equals("标题(*)")){ + row = sheetAt.getRow(1); + for (int i = 2;i examOptions = new ArrayList<>(); - for (int j=7;j<=13;j++) { + List examOptions = new ArrayList<>(); + for (int j=7;j<=13;j++) { - if(row1.getCell(j)!=null) { - ExamOption examOption = new ExamOption(); + if(row1.getCell(j)!=null) { + ExamOption examOption = new ExamOption(); // 截取表头 - String substring = row.getCell(j).getStringCellValue().substring(3, 4); - if (row1.getCell(6).getStringCellValue().contains(substring)) { + String substring = row.getCell(j).getStringCellValue().substring(3, 4); + if (row1.getCell(6).getStringCellValue().contains(substring)) { - examOption.setIsAnswer(true); - examOption.setScore(Float.valueOf(row1.getCell(4).getStringCellValue())); - } else { - examOption.setIsAnswer(false); - } - if (examOption.getIsAnswer()) { - examOption.setScore(Float.valueOf(row1.getCell(4).getStringCellValue())); - } + examOption.setIsAnswer(true); + examOption.setScore(Float.valueOf(row1.getCell(4).getStringCellValue())); + } else { + examOption.setIsAnswer(false); + } + if (examOption.getIsAnswer()) { + examOption.setScore(Float.valueOf(row1.getCell(4).getStringCellValue())); + } - examOption.setOptions(row.getCell(j).getStringCellValue()); + examOption.setOptions(row.getCell(j).getStringCellValue()); - Cell cell2 = row1.getCell(j); - cell2.setCellType(CellType.STRING); - examOption.setContent(cell2.getStringCellValue()); + Cell cell2 = row1.getCell(j); + cell2.setCellType(CellType.STRING); + examOption.setContent(cell2.getStringCellValue()); - if (examOption != null && StringUtil.isNotBlank(examOption.getContent())) { - examOptions.add(examOption); + if (examOption != null && StringUtil.isNotBlank(examOption.getContent())) { + examOptions.add(examOption); + } } } - } - examQuestion.setOptionList(examOptions); - examQuestions1.add(examQuestion); - } - //多选 多选的默认分存的是最大分 - else{ - String stringCellValue = row1.getCell(4).getStringCellValue(); - String[] strings = stringCellValue.split(","); + examQuestion.setOptionList(examOptions); + examQuestions1.add(examQuestion); + } + //多选 多选的默认分存的是最大分 + else{ + String stringCellValue = row1.getCell(4).getStringCellValue(); + String[] strings = stringCellValue.split(","); // String[] strings = new String[stringCellValue.length()]; - String max=strings[0]; - for (int j=0;j examOptions = new ArrayList<>(); - //A - for (int j=7;j<=13;j++){ - if(row1.getCell(j)!=null && StringUtil.isNotBlank(row1.getCell(j).getStringCellValue())){ - ExamOption examOption=new ExamOption(); - examOption.setOptions(row.getCell(j).getStringCellValue()); - examOption.setContent(row1.getCell(j).getStringCellValue()); - examOption.setIsAnswer(true); - examOption.setScore(Float.valueOf(strings[j-7])); - if(examOption!=null && StringUtil.isNotBlank(examOption.getContent())){ - examOptions.add(examOption); + String max=strings[0]; + for (int j=0;j examOptions = new ArrayList<>(); + //A + for (int j=7;j<=13;j++){ + if(row1.getCell(j)!=null && StringUtil.isNotBlank(row1.getCell(j).getStringCellValue())){ + ExamOption examOption=new ExamOption(); + examOption.setOptions(row.getCell(j).getStringCellValue()); + examOption.setContent(row1.getCell(j).getStringCellValue()); + examOption.setIsAnswer(true); + examOption.setScore(Float.valueOf(strings[j-7])); + if(examOption!=null && StringUtil.isNotBlank(examOption.getContent())){ + examOptions.add(examOption); + } + + } + } + examQuestion.setOptionList(examOptions); + examQuestions1.add(examQuestion); + } + } + }else { + row = sheetAt.getRow(2); + for (int i = 3;i examOptions = new ArrayList<>(); + for (int j=7;j<=13;j++) { + + if(row1.getCell(j)!=null) { + ExamOption examOption = new ExamOption(); +// 截取表头 + String substring = row.getCell(j).getStringCellValue().substring(3, 4); + if (row1.getCell(6).getStringCellValue().contains(substring)) { + + examOption.setIsAnswer(true); + examOption.setScore(Float.valueOf(row1.getCell(4).getStringCellValue())); + } else { + examOption.setIsAnswer(false); + } + if (examOption.getIsAnswer()) { + examOption.setScore(Float.valueOf(row1.getCell(4).getStringCellValue())); + } + + examOption.setOptions(row.getCell(j).getStringCellValue()); + + Cell cell2 = row1.getCell(j); + cell2.setCellType(CellType.STRING); + examOption.setContent(cell2.getStringCellValue()); + + if (examOption != null && StringUtil.isNotBlank(examOption.getContent())) { + examOptions.add(examOption); + } + } + } + + examQuestion.setOptionList(examOptions); + examQuestions1.add(examQuestion); + } + //多选 多选的默认分存的是最大分 + else{ + String stringCellValue = row1.getCell(4).getStringCellValue(); + String[] strings = stringCellValue.split(","); +// String[] strings = new String[stringCellValue.length()]; + String max=strings[0]; + for (int j=0;j examOptions = new ArrayList<>(); + //A + for (int j=7;j<=13;j++){ + if(row1.getCell(j)!=null && StringUtil.isNotBlank(row1.getCell(j).getStringCellValue())){ + ExamOption examOption=new ExamOption(); + examOption.setOptions(row.getCell(j).getStringCellValue()); + examOption.setContent(row1.getCell(j).getStringCellValue()); + examOption.setIsAnswer(true); + examOption.setScore(Float.valueOf(strings[j-7])); + if(examOption!=null && StringUtil.isNotBlank(examOption.getContent())){ + examOptions.add(examOption); + } + + } + } + examQuestion.setOptionList(examOptions); + examQuestions1.add(examQuestion); } - examQuestion.setOptionList(examOptions); - examQuestions1.add(examQuestion); } } //判断题 只存在试题表中 From 2e2edbbf5709df7c1a5975ebcba167b893d50c2d Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Fri, 13 Sep 2024 16:02:26 +0800 Subject: [PATCH 69/93] =?UTF-8?q?=E8=AF=95=E9=A2=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java index d8eca884..7c0beb6e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java @@ -170,7 +170,7 @@ public class ExamQuestionApi extends ApiBaseController { //从第二行开始获取数据 List examQuestions1 = new ArrayList<>(); QuestionDto questionDto = new QuestionDto(); - if(sheetAt.getRow(1).getCell(1).getStringCellValue().equals("标题(*)")){ + if(sheetAt.getRow(1).getCell(0).getStringCellValue().equals("标题(*)")){ row = sheetAt.getRow(1); for (int i = 2;i Date: Fri, 13 Sep 2024 15:41:00 +0800 Subject: [PATCH 70/93] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E8=90=83=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/BoeServerAllApplication.java | 2 + .../src/main/java/com/xboe/api/ThirdApi.java | 36 ++ .../java/com/xboe/constants/CacheName.java | 20 + .../java/com/xboe/enums/CasesRankEnum.java | 26 + .../boecase/api/CaseScheduledTasks.java | 29 + .../com/xboe/module/boecase/api/CasesApi.java | 188 ++++-- .../com/xboe/module/boecase/dao/CasesDao.java | 120 +++- .../xboe/module/boecase/dao/CasesRankDao.java | 87 +++ .../module/boecase/dao/CasesRecordDao.java | 117 ++-- .../com/xboe/module/boecase/entity/Cases.java | 96 ++- .../xboe/module/boecase/entity/CasesRank.java | 61 ++ .../module/boecase/entity/CasesRecommend.java | 7 + .../module/boecase/service/ICasesService.java | 38 +- .../service/impl/CasesServiceImpl.java | 581 +++++++++++++++--- .../xboe/module/boecase/vo/CaseRankingVo.java | 17 + .../boecase/vo/CaseViewRankingItemVo.java | 29 + .../boecase/vo/CasesBrowsingHistoryVo.java | 31 + .../boecase/vo/CasesQueryRecommendRankVo.java | 37 ++ .../boecase/vo/FavoriteCaseOfIndexVo.java | 23 + .../interaction/dto/FavoriteCaseDto.java | 1 + 20 files changed, 1348 insertions(+), 198 deletions(-) create mode 100644 servers/boe-server-all/src/main/java/com/xboe/enums/CasesRankEnum.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRank.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CaseRankingVo.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CaseViewRankingItemVo.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CasesBrowsingHistoryVo.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CasesQueryRecommendRankVo.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/FavoriteCaseOfIndexVo.java diff --git a/servers/boe-server-all/src/main/java/com/xboe/BoeServerAllApplication.java b/servers/boe-server-all/src/main/java/com/xboe/BoeServerAllApplication.java index 5dfeacda..d390a4c8 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/BoeServerAllApplication.java +++ b/servers/boe-server-all/src/main/java/com/xboe/BoeServerAllApplication.java @@ -12,12 +12,14 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.system.ApplicationPid; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; @Configuration @SpringBootApplication @EnableCaching @EnableAsync @EnableRetry +@EnableScheduling public class BoeServerAllApplication { public static void main(String[] args) { diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java b/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java index 831e2299..f5167e03 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java @@ -16,6 +16,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; + +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.Collection; import java.util.List; import java.util.Optional; @@ -231,5 +234,38 @@ public class ThirdApi { } + /** + * 获取案例浏览记录 + */ + public UserDynamicResult getAllUserdynamicListOfCaseRead(UserdynamicParam userdynamicParam, String token) { + String s = buildFormData(userdynamicParam); + String resp = Optional.ofNullable(HttpRequest + .post(userdynamicListUrl) + .header("Content-Type", "application/x-www-form-urlencoded") + .body(s) + .header("XBOE-Access-Token", token) + .execute().body()).orElseThrow(() -> new RuntimeException("token校验失败")); + DynamicBean dynamicBean = JSONUtil.toBean(resp, DynamicBean.class); + UserDynamicResult userdynamicResult = dynamicBean.getResult(); + return userdynamicResult; + } + + private String buildFormData(UserdynamicParam param) { + StringBuilder builder = new StringBuilder(); + try { + builder.append("pageIndex=").append(URLEncoder.encode(param.getPageIndex().toString(), "UTF-8")); + + builder.append("&pageSize=").append(URLEncoder.encode(param.getPageSize().toString(), "UTF-8")); + builder.append("&contentType=").append(URLEncoder.encode(param.getContentType().toString(), "UTF-8")); + builder.append("&aid=").append(URLEncoder.encode(param.getAid().toString(), "UTF-8")); + builder.append("&eventKey=").append(URLEncoder.encode("ReadCase", "UTF-8")); + if (param.getHidden() != null) { + builder.append("&hidden=").append(URLEncoder.encode(param.getHidden(), "UTF-8")); + } + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + return builder.toString(); + } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/constants/CacheName.java b/servers/boe-server-all/src/main/java/com/xboe/constants/CacheName.java index 3d765d51..07810238 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/constants/CacheName.java +++ b/servers/boe-server-all/src/main/java/com/xboe/constants/CacheName.java @@ -135,4 +135,24 @@ public interface CacheName { String KEY_DICT="dict"; String STUDY_KEY = "StudyKey:"; + + /** + * 季度观看量排行key + * */ + String CASE_RANK_VIEWS_QUARTER="case:rank:views:quarter"; + + /** + * 总观看排行key + * */ + String CASE_RANK_VIEWS_ALL="case:rank:views:all"; + + /** + * 季度点赞排行key + * */ + String CASE_RANK_PRAISE_QUARTER ="case:rank:praise:quarter"; + + /** + * 总点赞排行key + * */ + String CASE_RANK_PRAISE_ALL="case:rank:praise:all"; } diff --git a/servers/boe-server-all/src/main/java/com/xboe/enums/CasesRankEnum.java b/servers/boe-server-all/src/main/java/com/xboe/enums/CasesRankEnum.java new file mode 100644 index 00000000..ce570db2 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/enums/CasesRankEnum.java @@ -0,0 +1,26 @@ +package com.xboe.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import static com.xboe.constants.CacheName.*; + +/** + * 案例排行榜类型 + */ +@AllArgsConstructor +@Getter +public enum CasesRankEnum { + + QUARTER_VIEWS(1,"季度观看量排行",CASE_RANK_VIEWS_QUARTER), + ALL_VIEWS(2,"总观看排行",CASE_RANK_VIEWS_ALL), + QUARTER_PRAISES(3,"季度点赞排行",CASE_RANK_PRAISE_QUARTER), + ALL_PRAISES(4,"总点赞排行",CASE_RANK_PRAISE_ALL), + ; + + private Integer type; + private String name; + private String cacheKey; + + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java new file mode 100644 index 00000000..243ae1eb --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java @@ -0,0 +1,29 @@ +package com.xboe.module.boecase.api; + +import com.xboe.module.boecase.service.ICasesService; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Component +public class CaseScheduledTasks { + + @Resource + private ICasesService casesService; + + @Scheduled(cron = "0 0 1 1 * ?") // 每月的第一天的1:00执行 + public void refreshViewsRankOfMajor() { + casesService.refreshViewsRankOfMajor(); + } + + /** + * 季初执行,cron表达式设置为每个季度的第一个月的第一天的特定时间。每个季度的第一个月是1月、4月、7月和10月: + */ + @Scheduled(cron = "0 0 2 1 1,4,7,10 ?") + public void refreshLastQuarterStatistics() { + casesService.refreshLastQuarterStatistics(); + } + + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java index 60bf649b..441923e1 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java @@ -11,18 +11,14 @@ import com.xboe.module.boecase.dao.CasesMajorTypeDao; import com.xboe.module.boecase.dto.*; import com.xboe.module.boecase.entity.CasesMajorType; import com.xboe.module.boecase.service.ICasesRecommendPushRecordService; -import com.xboe.module.boecase.vo.CaseExportVo; +import com.xboe.module.boecase.vo.*; import com.xboe.module.dict.entity.DictItem; import com.xboe.module.excel.ExportsExcelSenderUtil; import com.xboe.system.user.dao.UserDao; import com.xboe.system.user.entity.User; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.LocalDateTimeUtil; @@ -39,6 +35,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.validation.annotation.Validated; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.time.LocalDateTime; @@ -127,25 +124,12 @@ public class CasesApi extends ApiBaseController { @PostMapping("/queryListV2") public JsonResponse> queryCaseBreV2(@Validated @RequestBody CasePageVo req) { String type = req.getType(); - PageList subViews1; - PageList subViews2; - PageList views = null; req.setUserId(getCurrent().getAccountId()); - if (StringUtils.isNotEmpty(type)) { - if ("recommend".equals(type)) { - views = casesService.queryRecommendPageCasesV2(req); - } else { - views = casesService.queryPageCasesV2(req); - } + PageList views = null; + if (type.equals("recommend")) { + views = casesService.queryRecommendPageCasesV2(req); } else { - PageDto pageDto = new PageDto(); - pageDto.setPageIndex(req.getPageIndex()); - pageDto.setPageSize(req.getPageSize()); - req.setPageSize(1000000); - req.setPageIndex(1); - subViews1 = casesService.queryRecommendPageCasesV2(req); - subViews2 = casesService.queryPageCasesV2(req); - views = merge(subViews1, subViews2, pageDto); + views = casesService.queryPageCasesV2(req); } if (views != null) { @@ -175,24 +159,6 @@ public class CasesApi extends ApiBaseController { return success(views); } - public static PageList merge(PageList pageList1, PageList pageList2, PageDto pageDto) { - List mergedCaseList = new ArrayList<>(); - mergedCaseList.addAll(pageList1.getList()); - mergedCaseList.addAll(pageList2.getList()); - List pageCaseList = mergedCaseList.stream() - .skip((long) (pageDto.getPageIndex() - 1) * pageDto.getPageSize()) - .limit(pageDto.getPageSize()) - .collect(Collectors.toList()); - int totalCount = pageList1.getCount() + pageList2.getCount(); - int pageSize = pageDto.getPageSize(); - - PageList mergePageList = new PageList<>(); - mergePageList.setList(pageCaseList); - mergePageList.setCount(totalCount); - mergePageList.setPageSize(pageSize); - return mergePageList; - } - @PostMapping("/caseYears") public JsonResponse> caseYears() { List result = casesService.getCaseYears(); @@ -646,7 +612,8 @@ public class CasesApi extends ApiBaseController { if (ids.isEmpty()) { return badRequest("参数异常"); } - List cases = casesService.ids(ids); + String accountId = getCurrent().getAccountId(); + List cases = casesService.ids(ids,accountId); return success(cases); } @@ -654,7 +621,7 @@ public class CasesApi extends ApiBaseController { * 设置/取消优秀案例 */ @PostMapping("/excellent") - public JsonResponse excellent(String id, Boolean excellent) { + public JsonResponse excellent(String id, Boolean excellent,String excellentReason) { if (StringUtil.isBlank(id)) { return badRequest("参数异常"); } @@ -662,12 +629,145 @@ public class CasesApi extends ApiBaseController { excellent = false;//默认设置取消 } try { - casesService.excellent(id, excellent); + casesService.excellent(id, excellent,excellentReason); return success(true); } catch (Exception e) { return error("设置或者取消失败", e.getMessage()); } } + /** + * 不同专业分类下排行榜刷新 + * 注意!!!定时统计任务是在本月月初执行的,而上榜时间是在上个月最后一天23:59:59 + */ + @PostMapping("/refreshViewsRankOfMajor") + public JsonResponse refreshViewsRankOfMajor() { + casesService.refreshViewsRankOfMajor(); + return success(true); + } + + @PostMapping("/refreshLastQuarterStatistics") + public JsonResponse refreshLastQuarterStatistics() { + casesService.refreshLastQuarterStatistics(); + return success(true); + } + + + /** + * 热度榜(当前季度、总榜) 按观看量排行 + * @param pageSize + * @param rankType 1:当前季度,2:总榜 + * @return + */ + @SuppressWarnings("unchecked") + @GetMapping("/queryPopularity") + public JsonResponse> queryPopularity(@RequestParam(required = false) Integer pageSize,@RequestParam Integer rankType) { + List caseRankingVoList =casesService.queryRank(pageSize,rankType); + return success(caseRankingVoList); + } + + + /** + * 好评榜 (当前季度、总榜) 按点赞量排行 + * @param pageSize + * @param rankType + * @return + */ + @SuppressWarnings("unchecked") + @GetMapping("/queryHighOpinion") + public JsonResponse> queryHighOpinion(@RequestParam(required = false) Integer pageSize,@RequestParam Integer rankType) { + List caseRankingVoList =casesService.queryRank(pageSize,rankType); + return success(caseRankingVoList); + } + + /** + * 不同专业月热度榜 按观看量排行 + */ + @SuppressWarnings("unchecked") + @GetMapping("/queryPopularityOfMajor") + public JsonResponse> queryPopularityOfMajor(@RequestParam(required = false) Integer pageSize, + @RequestParam Long majorId, + @RequestParam LocalDateTime rankMonth) { + String accountId = getCurrent().getAccountId(); + List caseRankingVoList =casesService.queryPopularityOfMajor(pageSize,majorId,rankMonth,accountId); + return success(caseRankingVoList); + } + + + /** + * 所有上榜的的(专业ID-时间), 用于下拉框.优化可将majorName一并查询,返回为List> todo by anyone + */ + @GetMapping("/queryAllTimePopularityOfMajor") + public JsonResponse>> queryAllTimePopularityOfMajor() { + Map> time = casesService.queryAllTimePopularityOfMajor(); + return success(time); + } + + + /** + * 查询推荐案例榜单 + * @return + */ + @SuppressWarnings("unchecked") + @GetMapping("/queryRecommendRank") + public JsonResponse> queryRecommendRank(@RequestParam(required = false,defaultValue = "3") Integer pageSize) { + List list = casesService.queryRecommendRank(pageSize); + return success(list); + } + + /** + * 案例上榜 + */ + @SuppressWarnings("unchecked") + @PostMapping("/riseIntoRank") + public JsonResponse riseIntoRank(@RequestParam Long caseId) { + casesService.riseIntoRank(caseId,getCurrent()); + return success(true); + } + + /** + * 案例下榜 + */ + @SuppressWarnings("unchecked") + @PostMapping("/cancelRiseIntoRank") + public JsonResponse cancelRiseIntoRank(@RequestParam Long caseId) { + casesService.cancelRiseIntoRank(caseId); + return success(true); + } + + /** + * 推荐案例调整排名 + */ + @SuppressWarnings("unchecked") + @PostMapping("/adjustRank") + public JsonResponse adjustRank(@RequestParam List caseIds) { + casesService.adjustRank(caseIds); + return success(true); + } + + /** + * 查询收藏 + * @param pageIndex + * @param pageSize + * @return + */ + @SuppressWarnings("unchecked") + @GetMapping("/queryFavoriteCaseOfIndex") + public JsonResponse> queryFavoriteCaseOfIndex(@RequestParam(required = false,defaultValue = "1") Integer pageIndex, + @RequestParam(required = false,defaultValue = "5") Integer pageSize) { + String accountId = this.getCurrent().getAccountId(); + PageList casesList = casesService.queryFavoriteCaseOfIndex(pageIndex,pageSize,accountId); + return success(casesList); + } + + @GetMapping("/browsingHistory") + public JsonResponse> browsingHistory(@RequestParam(required = false,defaultValue = "1") Integer pageIndex, + @RequestParam(required = false,defaultValue = "5") Integer pageSize, + HttpServletRequest request) { + String accountId = this.getCurrent().getAccountId(); + PageList casesList = casesService.browsingHistory(pageIndex,pageSize,accountId,request); + return success(casesList); + } + } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesDao.java index 1ffa20db..b4294a9f 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesDao.java @@ -1,18 +1,24 @@ package com.xboe.module.boecase.dao; -import java.util.List; - -import org.springframework.stereotype.Repository; - import com.xboe.common.OrderCondition; import com.xboe.common.PageList; import com.xboe.core.orm.BaseDao; +import com.xboe.core.orm.FieldFilters; import com.xboe.core.orm.IFieldFilter; import com.xboe.module.boecase.entity.Cases; -import com.xboe.core.orm.FieldFilters; -import com.xboe.module.boecase.dto.CaseVo; +import com.xboe.module.boecase.vo.CaseRankingVo; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +import static com.xboe.enums.CasesRankEnum.*; @Repository +@Slf4j public class CasesDao extends BaseDao { /** @@ -35,4 +41,106 @@ public class CasesDao extends BaseDao { public Cases getByTitle(String title) { return this.getGenericDao().findOne(Cases.class, FieldFilters.eq("title", title)); } + + public HashMap findExcellentCount(List authorIdList) { + String sql = + "SELECT author_id,COUNT(1) AS excellentCount\n" + + "FROM boe_cases \n" + + "WHERE excellent = 1 AND author_id IN (?1) AND deleted=0 \n" + + "GROUP BY author_id"; + List list = this.sqlFindList(sql, authorIdList); + + HashMap map = new HashMap<>(); + + list.forEach(objects -> { + String authorId = objects[0].toString(); + int excellentCount = Integer.parseInt(objects[1].toString()); + map.put(authorId, excellentCount); + }); + + return map; + } + + private List handleCaseRank(List listFields) { + List list = new ArrayList<>(); + for (Object[] o : listFields) { + CaseRankingVo dto = new CaseRankingVo(); + dto.setCaseId(String.valueOf(o[0])); + dto.setCaseTitle((String) o[1]); + list.add(dto); + } + return list; + } + + public List findPopularityOfAll(Integer pageSize) { + + String sql = + "SELECT id,title\n" + + "FROM boe_cases \n" + + "WHERE deleted=0\n" + + "ORDER BY views DESC,sys_create_time DESC\n" + + "LIMIT ?1"; + + List listFields = this.sqlFindList(sql, pageSize); + List caseRankingVoList = handleCaseRank(listFields); + return caseRankingVoList; + } + + public List findPopularityOfQuarter(Integer pageSize) { + String sql = + "SELECT id,title\n" + + "FROM boe_cases \n" + + "WHERE deleted=0\n" + + "ORDER BY (views-last_quarter_views) DESC,sys_create_time DESC \n" + + "LIMIT ?1"; + + List listFields = this.sqlFindList(sql, pageSize); + + List caseRankingVoList = handleCaseRank(listFields); + return caseRankingVoList; + } + + public List findHighOpinionOfAll(Integer pageSize) { + String sql = + "SELECT id,title\n" + + "FROM boe_cases \n" + + "WHERE deleted=0\n" + + "ORDER BY praises DESC,sys_create_time DESC \n" + + "LIMIT ?1"; + List listFields = this.sqlFindList(sql, pageSize); + List caseRankingVoList = handleCaseRank(listFields); + return caseRankingVoList; + } + + + public List findHighOpinionOfQuarter(Integer pageSize) { + String sql = + "SELECT id,title\n" + + "FROM boe_cases \n" + + "WHERE deleted=0\n" + + "ORDER BY (praises-last_quarter_praises) DESC,sys_create_time DESC \n" + + "LIMIT ?1"; + + List listFields = this.sqlFindList(sql, pageSize); + List caseRankingVoList = handleCaseRank(listFields); + return caseRankingVoList; + } + + public List findRank(Integer pageSize, Integer rankType) { + List popularityOfQuarter = Collections.emptyList(); + if (rankType == QUARTER_VIEWS.getType()){ + popularityOfQuarter = findPopularityOfQuarter(pageSize); + } + if (rankType == ALL_VIEWS.getType()){ + popularityOfQuarter = findPopularityOfAll(pageSize); + } + if (rankType == QUARTER_PRAISES.getType()){ + popularityOfQuarter = findHighOpinionOfQuarter(pageSize); + } + if (rankType == ALL_PRAISES.getType()){ + popularityOfQuarter = findHighOpinionOfAll(pageSize); + } + return popularityOfQuarter; + } + } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java new file mode 100644 index 00000000..98c5b576 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java @@ -0,0 +1,87 @@ +package com.xboe.module.boecase.dao; + +import com.xboe.core.orm.BaseDao; +import com.xboe.module.boecase.entity.CasesRank; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +@Repository +@Slf4j +public class CasesRankDao extends BaseDao { + + public List findViewsRankRecordByCaseId(String caseId) { + String sql = + "SELECT bdmt.name,bcvr.rise_rank_time,bcvr.rank,bcvr.major_id \n" + + "FROM\n" + + " boe_cases_rank bcvr\n" + + "JOIN boe_dict_major_type bdmt \n" + + " ON CAST(bdmt.code AS SIGNED) = bcvr.major_id \n" + + "WHERE bcvr.case_id = ?1 AND bcvr.deleted=0 AND bdmt.deleted=0\n" + + "ORDER BY bcvr.sys_update_time DESC \n" + + "LIMIT 2;"; + + List list = this.sqlFindList(sql, caseId); + + List resultList = new ArrayList<>(); + for (Object[] o : list) { + CasesRank casesRank = new CasesRank(); + casesRank.setMajorName(o[0].toString()); + casesRank.setRiseRankTime(((Timestamp) o[1]).toLocalDateTime()); + casesRank.setRank(Integer.valueOf(o[2].toString())); + casesRank.setMajorId(Long.valueOf(o[3].toString())); + resultList.add(casesRank); + } + return resultList; + } + + public HashMap findViewTopCount(List authorIdList) { + String sql= + "SELECT author_id,COUNT(1) as viewTopCount\n" + + "FROM boe_cases bc JOIN boe_cases_rank bcvr ON bcvr.case_id = bc.id\n" + + "WHERE bc.author_id IN (?1) \n" + + " AND bcvr.deleted = 0 \n" + + " AND bc.deleted = 0\n" + + "GROUP BY bc.author_id;"; + List list = this.sqlFindList(sql, authorIdList); + + HashMap map = new HashMap<>(); + + list.forEach(objects -> { + String authorId = objects[0].toString(); + Integer viewTopCount = Integer.parseInt(objects[1].toString()); + map.put(authorId, viewTopCount); + }); + + return map; + } + + + public List> findPopularityOfMajor(Integer pageSize, LocalDateTime startTime, LocalDateTime endTime, Long majorId) { + + String sql = + "SELECT bcr.case_id,bcr.rank\n" + + "FROM boe_cases_rank bcr\n" + + "JOIN boe_cases bc on bcr.case_id = bc.id\n" + + "WHERE bcr.deleted=0 AND bc.deleted=0 AND bcr.rise_rank_time BETWEEN ?1 and ?2 AND major_id=?3\n" + + "ORDER BY rank\n" + + "LIMIT ?4"; + + List listFields = this.sqlFindList(sql, startTime, endTime,majorId,pageSize); + + List> collect = listFields.stream().map(item -> { + HashMap map = new HashMap<>(); + map.put("caseId", item[0].toString()); + map.put("rank", item[1].toString()); + return map; + }).collect(Collectors.toList()); + + return collect; + } +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRecordDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRecordDao.java index 65ce714a..7d0ae946 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRecordDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRecordDao.java @@ -21,50 +21,79 @@ import java.util.List; */ @Repository public interface CasesRecordDao extends JpaRepository, JpaSpecificationExecutor { - @Query(nativeQuery = true, value = "select c.* from ( select b.*" + - " from boe_cases_recommend_push_record a left JOIN boe_cases b on a.case_id = b.id" + - " where b.deleted=0 and a.push_status = 3 and a.deleted=0 and a.push_user_id= :#{#condition.userId}" + - " and if(IFNULL(:#{#condition.keyWord},'')!='',b.title like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.author_name like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.keyword1 like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.keyword2 like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.keyword3 like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.keyword4 like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.keyword5 like CONCAT('%',:#{#condition.keyWord},'%'),1=1)" + - " and if(:#{#condition.yearsEmpty},1=1, YEAR(b.sys_create_time) in (:#{#condition.years}))" + - " and if(:#{#condition.caseIdsEmpty}, 1=1, b.id in (:#{#condition.caseIds}))" + - " and ("+ - " if(:#{#condition.allOrgEmpty}, 1=1, 1=2)" + - " or if(:#{#condition.org1Empty}, 1=2, b.org_domain_parent in (:#{#condition.org1}))" + - " or if(:#{#condition.org2Empty}, 1=2, b.org_domain_parent2 in (:#{#condition.org2}))" + - " or if(:#{#condition.org3Empty}, 1=2, b.org_domain_parent3 in (:#{#condition.org3}))" + - ")" + - " and if(:#{#condition.isSysType1Empty} , 1=1, b.sys_type1 = :#{#condition.sysType1} )"+ - " and if(:#{#condition.isSysType2Empty} , 1=1, b.sys_type2 = :#{#condition.sysType2} )"+ - " and if(:#{#condition.isSysType3Empty} , 1=1, b.sys_type3 = :#{#condition.sysType3} )"+ - " order by a.sys_create_time DESC, a.read_flag ASC) as c group by c.id", - countQuery = "select count(*) FROM (select c.* from ( select b.*" + - " from boe_cases_recommend_push_record a left JOIN boe_cases b on a.case_id = b.id " + - " where b.deleted=0 and a.push_status = 3 and a.deleted=0 and a.push_user_id= :#{#condition.userId}" + - " and if(IFNULL(:#{#condition.keyWord},'')!='',b.title like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.author_name like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.keyword1 like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.keyword2 like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.keyword3 like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.keyword4 like CONCAT('%',:#{#condition.keyWord},'%')" + - " or b.keyword5 like CONCAT('%',:#{#condition.keyWord},'%'),1=1)" + - " and if(:#{#condition.yearsEmpty},1=1, YEAR(b.sys_create_time) in (:#{#condition.years}))" + - " and if(:#{#condition.caseIdsEmpty}, 1=1, b.id in (:#{#condition.caseIds}))" + - " and ("+ - " if(:#{#condition.allOrgEmpty}, 1=1, 1=2)" + - " or if(:#{#condition.org1Empty}, 1=1, b.org_domain_parent in (:#{#condition.org1}))" + - " or if(:#{#condition.org2Empty}, 1=1, b.org_domain_parent2 in (:#{#condition.org2}))" + - " or if(:#{#condition.org3Empty}, 1=1, b.org_domain_parent3 in (:#{#condition.org3}))" + - ")" + - " and if(:#{#condition.isSysType1Empty} , 1=1, b.sys_type1 = :#{#condition.sysType1} )"+ - " and if(:#{#condition.isSysType2Empty} , 1=1, b.sys_type2 = :#{#condition.sysType2} )"+ - " and if(:#{#condition.isSysType3Empty} , 1=1, b.sys_type3 = :#{#condition.sysType3} )"+ - " order by a.sys_create_time DESC, a.read_flag ASC ) as c group by c.id) as d") + @Query(nativeQuery = true, value = + " SELECT c.* FROM ( " + + " SELECT b.*,a.sys_create_time as recommendPushTime" + + " FROM boe_cases_recommend_push_record a " + + " LEFT JOIN boe_cases b ON a.case_id = b.id " + + " WHERE b.deleted = 0 " + + " AND a.push_status = 3 " + + " AND a.deleted = 0 " + + " AND a.push_user_id = :#{#condition.userId} " + + " AND IF(IFNULL(:#{#condition.keyWord}, '') != '', " + + " b.title LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.author_name LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.keyword1 LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.keyword2 LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.keyword3 LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.keyword4 LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.keyword5 LIKE CONCAT('%', :#{#condition.keyWord}, '%'), " + + " 1 = 1) " + + " AND IF(:#{#condition.yearsEmpty}, 1 = 1, YEAR(b.sys_create_time) IN (:#{#condition.years})) " + + " AND IF(:#{#condition.caseIdsEmpty}, 1 = 1, b.id IN (:#{#condition.caseIds})) " + + " AND ( " + + " IF(:#{#condition.allOrgEmpty}, 1 = 1, 1 = 2) " + + " OR IF(:#{#condition.org1Empty}, 1 = 2, b.org_domain_parent IN (:#{#condition.org1})) " + + " OR IF(:#{#condition.org2Empty}, 1 = 2, b.org_domain_parent2 IN (:#{#condition.org2})) " + + " OR IF(:#{#condition.org3Empty}, 1 = 2, b.org_domain_parent3 IN (:#{#condition.org3})) " + + " ) " + + " AND IF(:#{#condition.isSysType1Empty}, 1 = 1, b.sys_type1 = :#{#condition.sysType1}) " + + " AND IF(:#{#condition.isSysType2Empty}, 1 = 1, b.sys_type2 = :#{#condition.sysType2}) " + + " AND IF(:#{#condition.isSysType3Empty}, 1 = 1, b.sys_type3 = :#{#condition.sysType3}) " + + " ) AS c GROUP BY c.id " + + " ORDER BY " + + " IF(:#{#condition.orderField}='views' and :#{#condition.orderAsc}=true,c.views, null) asc," + + " IF(:#{#condition.orderField}='views' and :#{#condition.orderAsc}=false,c.views, null) desc," + + " IF(:#{#condition.orderField}='sysCreateTime' and :#{#condition.orderAsc}=true ,c.sys_create_time,null) asc," + + " IF(:#{#condition.orderField}='sysCreateTime' and :#{#condition.orderAsc}=false , c.sys_create_time,null) desc," + + " IF(:#{#condition.orderField}='recommendPushTime', c.recommendPushTime,null) desc", + countQuery = + " SELECT count(*) FROM ( " + + " SELECT b.*,a.sys_create_time as recommendPushTime" + + " FROM boe_cases_recommend_push_record a " + + " LEFT JOIN boe_cases b ON a.case_id = b.id " + + " WHERE b.deleted = 0 " + + " AND a.push_status = 3 " + + " AND a.deleted = 0 " + + " AND a.push_user_id = :#{#condition.userId} " + + " AND IF(IFNULL(:#{#condition.keyWord}, '') != '', " + + " b.title LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.author_name LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.keyword1 LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.keyword2 LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.keyword3 LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.keyword4 LIKE CONCAT('%', :#{#condition.keyWord}, '%') " + + " OR b.keyword5 LIKE CONCAT('%', :#{#condition.keyWord}, '%'), " + + " 1 = 1) " + + " AND IF(:#{#condition.yearsEmpty}, 1 = 1, YEAR(b.sys_create_time) IN (:#{#condition.years})) " + + " AND IF(:#{#condition.caseIdsEmpty}, 1 = 1, b.id IN (:#{#condition.caseIds})) " + + " AND ( " + + " IF(:#{#condition.allOrgEmpty}, 1 = 1, 1 = 2) " + + " OR IF(:#{#condition.org1Empty}, 1 = 2, b.org_domain_parent IN (:#{#condition.org1})) " + + " OR IF(:#{#condition.org2Empty}, 1 = 2, b.org_domain_parent2 IN (:#{#condition.org2})) " + + " OR IF(:#{#condition.org3Empty}, 1 = 2, b.org_domain_parent3 IN (:#{#condition.org3})) " + + " ) " + + " AND IF(:#{#condition.isSysType1Empty}, 1 = 1, b.sys_type1 = :#{#condition.sysType1}) " + + " AND IF(:#{#condition.isSysType2Empty}, 1 = 1, b.sys_type2 = :#{#condition.sysType2}) " + + " AND IF(:#{#condition.isSysType3Empty}, 1 = 1, b.sys_type3 = :#{#condition.sysType3}) " + + " ) AS c GROUP BY c.id " + + " ORDER BY " + + " IF(:#{#condition.orderField}='views' and :#{#condition.orderAsc}=true,c.views, null) asc," + + " IF(:#{#condition.orderField}='views' and :#{#condition.orderAsc}=false,c.views, null) desc," + + " IF(:#{#condition.orderField}='sysCreateTime' and :#{#condition.orderAsc}=true ,c.sys_create_time,null) asc," + + " IF(:#{#condition.orderField}='sysCreateTime' and :#{#condition.orderAsc}=false , c.sys_create_time,null) desc," + + " IF(:#{#condition.orderField}='recommendPushTime', c.recommendPushTime,null) desc" + ) Page queryList(Pageable pageable, @Param("condition") CasePageVo casePage); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/Cases.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/Cases.java index 7e933ba8..aa8fd353 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/Cases.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/Cases.java @@ -3,6 +3,7 @@ package com.xboe.module.boecase.entity; import com.fasterxml.jackson.annotation.JsonFormat; import com.xboe.core.SysConstant; import com.xboe.core.orm.BaseEntity; +import com.xboe.module.boecase.vo.CaseViewRankingItemVo; import lombok.Data; import lombok.EqualsAndHashCode; @@ -248,16 +249,7 @@ public class Cases extends BaseEntity { @Column(name = "case_value") private String caseValue; - // 种类字段1 - // 暂不上线 -// @Column(name = "sys_type1") -// private String sysType1; - //种类字段2 -// @Column(name = "sys_type2") -// private String sysType2; - //种类字段3 -// @Column(name = "sys_type3") -// private String sysType3; + /** * 最佳案例标识 @@ -272,6 +264,48 @@ public class Cases extends BaseEntity { @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime excellentTime; + /** + * 最佳时间 + * */ + @Column(name = "excellent_reason") + private String excellentReason; + + /** + * 上月浏览量 + */ + @Column(name = "last_month_views") + private Integer lastMonthViews; + + /** + * 上季度浏览量 + */ + @Column(name = "last_quarter_views") + private Integer lastQuarterViews; + + /** + * 上季度点赞量 + */ + @Column(name = "last_quarter_praises") + private Integer lastQuarterPraises; + + /** + * 推荐榜排序 + * */ + @Column(name = "recommend_rank") + private Integer recommendRank; + + /** + * 推送用户名称 + */ + @Column(name = "recommend_rank_push_user_name") + private String recommendRankPushUserName; + + /** + * 推送时间 + */ + @Column(name = "recommend_rank_push_time") + private LocalDateTime recommendRankPushTime; + /** * type 种类 * 区分 案例/推荐案例 @@ -279,11 +313,6 @@ public class Cases extends BaseEntity { @Transient private String type; - /** - * id - */ - - @Transient private List majorIds; @@ -296,6 +325,15 @@ public class Cases extends BaseEntity { @Transient private String refId; + @Transient + private String excellentTag; + + @Transient + private List viewRankTags; + + @Transient + private List authorTags; + public String getRefId() { return refId; } @@ -380,7 +418,7 @@ public class Cases extends BaseEntity { this.title=title; } public Cases(String id,String title,String summary,String coverUrl,String authorId,String authorName,LocalDateTime sysCreateTime,Integer breCommend,Integer views,Integer comments,Integer praises,Integer shares,Integer favorites,Boolean deleted - ,String sysCreateBy,String sysCreateAid){ + ,String sysCreateBy,String sysCreateAid){ this.title=title; super.setId(id); this.authorId=authorId; @@ -398,7 +436,6 @@ public class Cases extends BaseEntity { this.favorites=favorites; super.setDeleted(deleted); } - public Cases(String title) { this.title = title; } @@ -415,4 +452,29 @@ public class Cases extends BaseEntity { this.authorName = authorName; this.confidentialityLevel = confidentialityLevel; } + + public Cases(String id,String title,String summary,String coverUrl,String authorId,String authorName,LocalDateTime sysCreateTime,Integer breCommend,Integer views,Integer comments,Integer praises,Integer shares,Integer favorites,Boolean deleted + ,String sysCreateBy,String sysCreateAid,String keyword1,String keyword2,String keyword3,String keyword4,String keyword5){ + this.title=title; + super.setId(id); + this.authorId=authorId; + this.authorName=authorName; + super.setSysCreateTime(sysCreateTime); + super.setSysCreateAid(sysCreateAid); + super.setSysCreateBy(sysCreateBy); + this.summary=summary; + this.coverUrl=coverUrl; + this.breCommend=breCommend; + this.views=views; + this.comments=comments; + this.praises=praises; + this.shares=shares; + this.favorites=favorites; + this.keyword1=keyword1; + this.keyword2=keyword2; + this.keyword3=keyword3; + this.keyword4=keyword4; + this.keyword5=keyword5; + super.setDeleted(deleted); + } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRank.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRank.java new file mode 100644 index 00000000..51baf8dc --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRank.java @@ -0,0 +1,61 @@ +package com.xboe.module.boecase.entity; + +import com.xboe.core.SysConstant; +import com.xboe.core.orm.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.persistence.Transient; +import java.time.LocalDateTime; + +/** +* 案例推荐表 +* @TableName boe_cases_rank +*/ +@Data +@NoArgsConstructor +@Entity +@EqualsAndHashCode(callSuper = false) +@Table(name = SysConstant.TABLE_PRE+"cases_rank") +public class CasesRank extends BaseEntity { + + /** + * 案例ID + */ + @Column(name = "case_id") + private Long caseId; + + /** + * 专业ID + */ + @Column(name = "major_id") + private Long majorId; + + /** + * 排名 + */ + @Column(name = "rank") + private Integer rank; + + /** + * 浏览量每月增量 + */ + @Column(name = "monthly_increment") + private Integer monthlyIncrement; + + + @Column(name = "rise_rank_time") + private LocalDateTime riseRankTime; + + @Transient + private String majorName; + + public CasesRank(Long majorId, LocalDateTime riseRankTime) { + this.majorId = majorId; + this.riseRankTime = riseRankTime; + } +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommend.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommend.java index 69ac0a5a..25dbcfdd 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommend.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRecommend.java @@ -54,8 +54,15 @@ public class CasesRecommend extends BaseEntity { public CasesRecommend() { } + public CasesRecommend(String id, String recommendOrgName) { this.setId(id); this.recommendOrgName = recommendOrgName; } + + public CasesRecommend(String id, String recommendOrgName,LocalDateTime recommendTime) { + this.setId(id); + this.recommendOrgName = recommendOrgName; + this.recommendTime = recommendTime; + } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java index 151af48b..aebdf2c7 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java @@ -1,14 +1,22 @@ package com.xboe.module.boecase.service; -import java.util.List; - import com.xboe.common.PageList; import com.xboe.core.CurrentUser; import com.xboe.module.boecase.dto.*; import com.xboe.module.boecase.entity.Cases; +import com.xboe.module.boecase.vo.CasesBrowsingHistoryVo; +import com.xboe.module.boecase.vo.CaseRankingVo; +import com.xboe.module.boecase.vo.CasesQueryRecommendRankVo; +import com.xboe.module.boecase.vo.FavoriteCaseOfIndexVo; import com.xboe.module.dict.entity.DictItem; import com.xboe.school.vo.CasesVo; +import javax.servlet.http.HttpServletRequest; +import javax.transaction.Transactional; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; + public interface ICasesService{ /** * 案例分页搜索,是否被推荐 @@ -91,7 +99,7 @@ public interface ICasesService{ /** * 用于二次查询 * */ - List ids(List ids); + List ids(List ids, String accountId); /** *二期 首页的推荐案例 @@ -101,7 +109,7 @@ public interface ICasesService{ /** * 设置或者取消优秀案例 * */ - void excellent(String id,Boolean excellent); + void excellent(String id, Boolean excellent, String excellentReason); PageList queryRecommendPageCasesV2(CasePageVo req); @@ -110,5 +118,27 @@ public interface ICasesService{ List getCaseYears(); + @Transactional + void refreshViewsRankOfMajor(); + + void refreshLastQuarterStatistics(); + + List queryRecommendRank(Integer pageSize); + + void riseIntoRank(Long caseId, CurrentUser currentUser); + + void cancelRiseIntoRank(Long caseId); + + void adjustRank(List caseIdList); + + List queryRank(Integer pageSize, Integer rankType); + + List queryPopularityOfMajor(Integer pageSize, Long majorId, LocalDateTime month, String accountId); + + PageList queryFavoriteCaseOfIndex(Integer pageIndex, Integer pageSize, String accountId); + + PageList browsingHistory(Integer pageIndex, Integer pageSize, String accountId, HttpServletRequest request); + + Map> queryAllTimePopularityOfMajor(); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java index c546e399..e9d13cf1 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java @@ -2,8 +2,14 @@ package com.xboe.module.boecase.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.xboe.api.ThirdApi; +import com.xboe.api.vo.UserDynamic; +import com.xboe.api.vo.UserDynamicResult; +import com.xboe.api.vo.UserdynamicParam; import com.xboe.common.OrderCondition; import com.xboe.common.OrderDirection; import com.xboe.common.PageList; @@ -11,29 +17,40 @@ import com.xboe.common.utils.IDGenerator; import com.xboe.common.utils.StringUtil; import com.xboe.core.CurrentUser; import com.xboe.core.orm.*; +import com.xboe.enums.CasesRankEnum; import com.xboe.module.boecase.dao.*; import com.xboe.module.boecase.dto.*; -import com.xboe.module.boecase.entity.Cases; -import com.xboe.module.boecase.entity.CasesMajorType; -import com.xboe.module.boecase.entity.CasesRecommend; -import com.xboe.module.boecase.entity.CasesRecommendPushRecord; +import com.xboe.module.boecase.entity.*; import com.xboe.module.boecase.service.ICasesService; +import com.xboe.module.boecase.vo.*; import com.xboe.module.dict.dao.SysDictionaryDao; import com.xboe.module.dict.entity.DictItem; +import com.xboe.module.interaction.entity.Favorites; import com.xboe.orm.CustomFieldInFilter; import com.xboe.school.vo.CasesVo; +import com.xboe.standard.enums.BoedxResourceType; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import javax.transaction.Transactional; +import javax.servlet.http.HttpServletRequest; +import java.lang.reflect.Array; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAdjusters; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; +import java.util.stream.IntStream; + @Slf4j @Service @@ -61,6 +78,15 @@ public class CasesServiceImpl implements ICasesService { @Autowired private CasesRecommendDao casesRecommendDao; + @Resource + private CasesRankDao casesRankDao; + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @Resource + private ThirdApi thirdApi; + /** * 案例分页查询,用于门户的查询 */ @@ -178,12 +204,6 @@ public class CasesServiceImpl implements ICasesService { @Override public PageList queryPageCasesV2(CasePageVo caseVo) { - String type = caseVo.getType(); - if (!StrUtil.equals(type,"excellent")) { - caseVo.setOrderField(""); - caseVo.setOrderAsc(null); - } - String keyword = caseVo.getKeyWord(); QueryBuilder query = QueryBuilder.from(Cases.class); PageList page = null; @@ -296,18 +316,16 @@ public class CasesServiceImpl implements ICasesService { filters.add(FieldFilters.eq("excellent", caseVo.getExcellent())); } OrderCondition order = null; - if (StringUtils.isNotBlank(caseVo.getOrderField())) { - if (caseVo.getOrderAsc() == null || caseVo.getOrderAsc()) { + if (StringUtils.isNotBlank(caseVo.getOrderField()) && caseVo.getOrderAsc() != null && ("sysCreateTime".equals(caseVo.getOrderField()) || "views".equals(caseVo.getOrderField()))) { + if (caseVo.getOrderAsc()) { order = OrderCondition.asc(caseVo.getOrderField()); } else { order = OrderCondition.desc(caseVo.getOrderField()); } - } - if (StrUtil.equals(type,"new")) { + } else { order = OrderCondition.desc("sysCreateTime"); - } else if (StrUtil.equals(type,"hot")) { - order = OrderCondition.desc("views"); } + if(Objects.nonNull(order)) { query.addOrder(order); } @@ -315,53 +333,18 @@ public class CasesServiceImpl implements ICasesService { query.setPageIndex(caseVo.getPageIndex()); query.setPageSize(caseVo.getPageSize()); page = casesDao.findPage(query.builder()); - List list = page.getList(); - list.forEach(it->{ + List casesList = page.getList(); + casesList.forEach(it->{ it.setBreCommend(0); }); - if (CollUtil.isNotEmpty(list) && StrUtil.isNotBlank(caseVo.getUserId())) { - List caseIds = list.stream().map(Cases::getId).collect(Collectors.toList()); - QueryBuilder recommendCasesQuery = QueryBuilder.from(CasesRecommendPushRecord.class); - recommendCasesQuery.addField("new CasesRecommendPushRecord(id,recommendId,caseId)"); - List subFilters = new ArrayList<>(); - subFilters.add(FieldFilters.eq("pushUserId", caseVo.getUserId())); - subFilters.add(FieldFilters.in("caseId", caseIds)); - subFilters.add(FieldFilters.eq("pushStatus", 3)); - subFilters.add(FieldFilters.eq("deleted", Boolean.FALSE)); - - QueryBuilder queryBuilder = recommendCasesQuery.addFilters(subFilters) - .addOrder("sysCreateTime", OrderDirection.DESC) - .addGroupBy("caseId"); - List pushRecords = casesRecommendPushRecordDao.findList(queryBuilder.builder()); - if (CollUtil.isNotEmpty(pushRecords)) { - List rIds = pushRecords.stream().map(CasesRecommendPushRecord::getRecommendId).distinct().collect(Collectors.toList()); - QueryBuilder builder = QueryBuilder.from(CasesRecommend.class); - builder.addField("new CasesRecommend(id,recommendOrgName)"); - List recommendFilters = new ArrayList<>(); - recommendFilters.add(FieldFilters.eq("deleted", Boolean.FALSE)); - recommendFilters.add(FieldFilters.in("id", rIds)); - builder.addFilters(recommendFilters); - List recommands = casesRecommendDao.findList(builder.builder()); - if (CollUtil.isNotEmpty(recommands)) { - Map collect = recommands.stream().collect(Collectors.toMap(k -> k.getId(), v -> v.getRecommendOrgName())); - list.forEach(it -> { - CasesRecommendPushRecord one = CollUtil.findOne(pushRecords, (a) -> StrUtil.equals(a.getCaseId(), it.getId())); - if (Objects.nonNull(one)) { - String recommendOrgName = collect.get(one.getRecommendId()); - it.setBreCommend(1); - it.setRecommendOrgName(recommendOrgName); - } else { - it.setBreCommend(0); - } - }); - } - } - - } + casesList = caseListCommonHandle(casesList, caseVo.getUserId()); + page.setList(casesList); return page; } + + @Override public PageList queryRecommendPageCasesV2(CasePageVo caseVo) { @@ -408,37 +391,68 @@ public class CasesServiceImpl implements ICasesService { caseVo.setOrg2(level2); caseVo.setOrg3(level3); + Set validOrderFields = new HashSet<>(); + validOrderFields.add("sysCreateTime"); + validOrderFields.add("views"); + validOrderFields.add("recommendPushTime"); + if (StringUtils.isBlank(caseVo.getOrderField()) || caseVo.getOrderAsc() == null || !validOrderFields.contains(caseVo.getOrderField())) { + caseVo.setOrderField("recommendPushTime"); + caseVo.setOrderAsc(false); + } + Page cases = casesRecordDao.queryList(pageRequest,caseVo); PageList pageList = new PageList<>(); pageList.setCount((int) cases.getTotalElements()); pageList.setPageSize(cases.getSize()); List content = cases.getContent(); - List caseIds = content.stream().map(Cases::getId).collect(Collectors.toList()); - String userId = caseVo.getUserId(); - if (CollUtil.isNotEmpty(caseIds)) { - QueryBuilder recommendCasesQuery = QueryBuilder.from(CasesRecommendPushRecord.class); - recommendCasesQuery.addField("new CasesRecommendPushRecord(id,recommendId,caseId)"); - List subFilters = new ArrayList<>(); - subFilters.add(FieldFilters.eq("pushUserId", userId)); - subFilters.add(FieldFilters.in("caseId", caseIds)); - subFilters.add(FieldFilters.eq("pushStatus", 3)); - subFilters.add(FieldFilters.eq("deleted", Boolean.FALSE)); - QueryBuilder queryBuilder = recommendCasesQuery.addFilters(subFilters) + caseListCommonHandle(content, caseVo.getUserId()); + + pageList.setList(content); + return pageList; + } + + private List caseListCommonHandle(List casesList, String accountId) { + if (CollUtil.isEmpty(casesList)) { + return casesList; + } + //1.推荐案例数据处理 + recommendCasesDataHandle(casesList, accountId); + //2.标签处理,添加作者标签和新的案例标签 + addAuthorTagAndCaseNewTag(casesList); + + return casesList; + } + + private void recommendCasesDataHandle(List casesList, String accountId) { + if (StrUtil.isNotBlank(accountId)) { + List caseIdList = casesList.stream().map(Cases::getId).collect(Collectors.toList()); + QueryBuilder queryBuilder = QueryBuilder.from(CasesRecommendPushRecord.class) + .addField("new CasesRecommendPushRecord(id,recommendId,caseId)") + .addFilters(Arrays.asList( + FieldFilters.eq("pushUserId", accountId), + FieldFilters.in("caseId", caseIdList), + FieldFilters.eq("pushStatus", 3), + FieldFilters.eq("deleted", Boolean.FALSE) + )) .addOrder("sysCreateTime", OrderDirection.DESC) .addGroupBy("caseId"); + List pushRecords = casesRecommendPushRecordDao.findList(queryBuilder.builder()); + if (CollUtil.isNotEmpty(pushRecords)) { List rIds = pushRecords.stream().map(CasesRecommendPushRecord::getRecommendId).distinct().collect(Collectors.toList()); - QueryBuilder builder = QueryBuilder.from(CasesRecommend.class); - List recommendFilters = new ArrayList<>(); - recommendFilters.add(FieldFilters.eq("deleted", Boolean.FALSE)); - recommendFilters.add(FieldFilters.in("id", rIds)); - builder.addFilters(recommendFilters); + QueryBuilder builder = QueryBuilder.from(CasesRecommend.class) + .addField("new CasesRecommend(id,recommendOrgName,recommendTime)") + .addFilters(Arrays.asList( + FieldFilters.eq("deleted", Boolean.FALSE), + FieldFilters.in("id", rIds) + )); + List recommands = casesRecommendDao.findList(builder.builder()); if (CollUtil.isNotEmpty(recommands)) { - Map collect = recommands.stream().collect(Collectors.toMap(k -> k.getId(), item->item)); - content.forEach(it -> { + Map collect = recommands.stream().collect(Collectors.toMap(k -> k.getId(), item -> item)); + casesList.forEach(it -> { CasesRecommendPushRecord one = CollUtil.findOne(pushRecords, (a) -> StrUtil.equals(a.getCaseId(), it.getId())); if (Objects.nonNull(one)) { CasesRecommend recommend = collect.get(one.getRecommendId()); @@ -446,13 +460,72 @@ public class CasesServiceImpl implements ICasesService { it.setRefId(one.getId()); it.setRecommendOrgName(recommend.getRecommendOrgName()); it.setSysCreateTime(recommend.getRecommendTime()); + } else { + it.setBreCommend(0); } }); } } } - pageList.setList(content); - return pageList; + } + + /** + * 添加案例标签、作者标签(最佳案例N篇、上榜浏览量TOP榜单N次)、案例标签(xx分类浏览量TOP、最佳案例) + */ + private void addAuthorTagAndCaseNewTag(List caseList) { + if (CollUtil.isEmpty(caseList)) { + return; + } + + List authorIdList = caseList.stream().map(Cases::getAuthorId).distinct().collect(Collectors.toList()); + HashMap excellentCountMap = casesDao.findExcellentCount(authorIdList); + HashMap viewTopCountMap = casesRankDao.findViewTopCount(authorIdList); + + + caseList.forEach(e -> { + // 获取最新的两个浏览量上榜记录 + List viewsRankRecords = casesRankDao.findViewsRankRecordByCaseId(e.getId()); + if (CollUtil.isNotEmpty(viewsRankRecords)) { + // 拼接生成浏览量排行榜的标签 + List viewRankTags = viewsRankRecords.stream().map(casesRank -> { + String pattern = casesRank.getRiseRankTime().getMonthValue() < 10 ? "yy年M月" : "yy年MM月"; + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + String time = casesRank.getRiseRankTime().format(formatter); + + // 2023年6月 经营管理类 浏览量 TOP1 + String viewRankTag = time + casesRank.getMajorName() + "类浏览量TOP" + (casesRank.getRank() + 1); + + CaseViewRankingItemVo caseViewRankingItemVo = new CaseViewRankingItemVo(); + caseViewRankingItemVo.setMajorId(String.valueOf(casesRank.getMajorId())); + caseViewRankingItemVo.setMajorName(casesRank.getMajorName()); + caseViewRankingItemVo.setTagName(viewRankTag); + caseViewRankingItemVo.setRiseRankTime(casesRank.getRiseRankTime()); + + return caseViewRankingItemVo; + }).collect(Collectors.toList()); + e.setViewRankTags(viewRankTags); + + } + + // 拼接生成年度最佳标签 + if (e.getExcellent()!=null && e.getExcellent()) { + e.setExcellentTag(e.getExcellentTime().format(DateTimeFormatter.ofPattern("yy年"))+"度最佳"); + } + + List authorTags = new ArrayList<>(); + + if (excellentCountMap.get(e.getAuthorId())!=null){ + String authorTagOfExcellent = excellentCountMap.get(e.getAuthorId()) + "篇最佳案例"; + authorTags.add(authorTagOfExcellent); + } + + if (viewTopCountMap.get(e.getAuthorId())!=null){ + String authorTagOfView = "上榜浏览量TOP榜单" + viewTopCountMap.get(e.getAuthorId()) + "次"; + authorTags.add(authorTagOfView); + } + + e.setAuthorTags(authorTags); + }); } public static void main(String[] args) { @@ -945,11 +1018,12 @@ public class CasesServiceImpl implements ICasesService { } @Override - public List ids(List ids) { + public List ids(List ids, String accountId) { QueryBuilder builder = QueryBuilder.from(Cases.class); builder.addFilter(FieldFilters.in("id", ids)); - builder.addFields("new Cases(id,title,summary,coverUrl,authorId,authorName,sysCreateTime,breCommend,views,comments,praises,shares,favorites,deleted,sysCreateBy,sysCreateAid)"); + builder.addFields("new Cases(id,title,summary,coverUrl,authorId,authorName,sysCreateTime,breCommend,views,comments,praises,shares,favorites,deleted,sysCreateBy,sysCreateAid,keyword1,keyword2,keyword3,keyword4,keyword5)"); List cases = casesDao.findList(builder.builder()); + cases = caseListCommonHandle(cases, accountId); return cases; } @@ -1078,15 +1152,356 @@ public class CasesServiceImpl implements ICasesService { } @Override - public void excellent(String id, Boolean excellent) { + public void excellent(String id, Boolean excellent, String excellentReason) { //取消时,把时间清空 if (excellent) { - casesDao.updateMultiFieldById(id, UpdateBuilder.create("excellent", excellent), UpdateBuilder.create("excellentTime", LocalDateTime.now())); + casesDao.updateMultiFieldById(id, UpdateBuilder.create("excellent", excellent), UpdateBuilder.create("excellentTime", LocalDateTime.now()), UpdateBuilder.create("excellentReason", excellentReason)); } else { - casesDao.updateMultiFieldById(id, UpdateBuilder.create("excellent", excellent), UpdateBuilder.create("excellentTime", null)); + casesDao.updateMultiFieldById(id, UpdateBuilder.create("excellent", excellent), UpdateBuilder.create("excellentTime", null), UpdateBuilder.create("excellentReason", null)); } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void refreshViewsRankOfMajor(){ + log.info("开始执行每月案例浏览量相关定时任务"); + // 获取上个月的第一天的00:00 +// LocalDateTime firstDayOfLastMonth = LocalDateTime.now().minusMonths(1).with(TemporalAdjusters.firstDayOfMonth()).toLocalDate().atStartOfDay(); + // 获取上个月的最后一天的23:59:59,将其设置为上榜时间。注意,定时统计任务是在本月月初执行的,而上榜时间是在上个月最后一天23:59:59 + LocalDateTime lastDayOfLastMonth = LocalDateTime.now().minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()).toLocalDate().atTime(23, 59, 59); // 设置为当天的几乎结束时刻 + + int count = casesRankDao.sqlCount("SELECT count(1) FROM boe_cases_rank WHERE deleted=0 AND rise_rank_time = ?1" , lastDayOfLastMonth); + if (count > 0){ + log.info("已生成上个月排行榜数据,本次不执行"); + throw new RuntimeException("已生成上个月排行榜数据,请将上月排行榜数据删除"); + } + + //获取案例当月排名 + String sql = + "SELECT bc.id,bcmt.major_id,bc.views - COALESCE(bc.last_month_views, 0) AS increment\n" + + "FROM boe_cases bc\n" + + "JOIN boe_cases_major_type bcmt ON bcmt.case_id = bc.id and bc.deleted=0 and file_path is not null and file_path!='' and bc.views - COALESCE(bc.last_month_views, 0)!=0"; + List caseListOfObject = casesDao.sqlFindList(sql); + + // 转为casesRank + List casesRankList = caseListOfObject.stream() + .map(o -> { + CasesRank casesRank = new CasesRank(); + casesRank.setCaseId(Long.valueOf(Array.get(o, 0).toString())); + casesRank.setMajorId(Long.valueOf(Array.get(o, 1).toString())); + casesRank.setMonthlyIncrement(Integer.parseInt(Array.get(o, 2).toString())); + casesRank.setRiseRankTime(lastDayOfLastMonth); + return casesRank; + }).collect(Collectors.toList()); + // 根据专业分类进行分组 + Map> casesRankMap = casesRankList.stream().collect(Collectors.groupingBy(CasesRank::getMajorId)); + + // 生成当前月不同分类的最新的浏览量排名 + ArrayList lastMonthRank = new ArrayList<>(); + casesRankMap.forEach((majorId, caseList) -> { + List sortedCaseList = caseList.stream() + .sorted(Comparator.comparingInt(CasesRank::getMonthlyIncrement).reversed()).limit(10) + .collect(Collectors.toList()); + + IntStream.range(0, sortedCaseList.size()) + .forEach(i -> sortedCaseList.get(i).setRank(i)); + lastMonthRank.addAll(sortedCaseList); + }); + + + casesRankDao.saveList(lastMonthRank); + // 重置上月观看量:last_month_views + int i = casesDao.sqlUpdate("update boe_cases set last_month_views=views where deleted=0"); + log.info("每月案例浏览量相关定时任务执行完成,boe_cases更新数据量为条数为"+i); + log.info("每月案例浏览量相关定时任务执行完成,boe_cases_rank添加数据量为条数为"+lastMonthRank.size()); } + @Override + public void refreshLastQuarterStatistics() { + log.info("开始执行每季案例相关定时任务"); + int i = casesDao.sqlUpdate("update boe_cases set last_quarter_views=views,last_quarter_praise=praise where deleted=0"); + log.info("每季案例相关定时任务执行完成,boe_cases更新数据量为条数为"+i); + } + + @Override + public List queryRank(Integer pageSize, Integer rankType) { + if (pageSize == null) { + pageSize = 3; + } + String cacheKey = ""; + // 获取缓存key + for (CasesRankEnum enumValue : CasesRankEnum.values()) { + if (rankType == enumValue.getType()) { + // 格式如:case:rank:praise:all3 + cacheKey = enumValue.getCacheKey()+pageSize; + } + } + + List caseListOfJson = stringRedisTemplate.opsForList().range(cacheKey, 0, -1); + + if (CollectionUtil.isNotEmpty(caseListOfJson)) { + // 缓存中存在数据 + List casesList = caseListOfJson.stream().map(item -> JSONUtil.toBean(item, CaseRankingVo.class)).collect(Collectors.toList()); + return casesList; + } + + List casesList = casesDao.findRank(pageSize,rankType); + + if (CollectionUtil.isNotEmpty(casesList)) { + // 缓存不存在数据,数据库中不存在数据,重建缓存 + List serializedCases = casesList.stream().map(item -> JSONUtil.toJsonStr(item)).collect(Collectors.toList()); + stringRedisTemplate.opsForList().rightPushAll(cacheKey, serializedCases); + stringRedisTemplate.expire(cacheKey, 600, TimeUnit.SECONDS); + return casesList; + } + return Collections.emptyList(); + + } + + + @Override + public List queryPopularityOfMajor(Integer pageSize, Long majorId, LocalDateTime month, String accountId) { + if (pageSize == null) { + pageSize = 10; + } + + LocalDateTime startTime = month.withDayOfMonth(1); + LocalDateTime endTime = month.plusMonths(1).withDayOfMonth(1).withMinute(0); + + List> popularityOfMajor = casesRankDao.findPopularityOfMajor(pageSize, startTime, endTime, majorId); + List caseIdList = popularityOfMajor.stream().map(map -> map.get("caseId").toString()).collect(Collectors.toList()); + + Map collect = popularityOfMajor.stream().collect(Collectors.toMap(map -> map.get("caseId").toString(), map -> Integer.valueOf(map.get("rank").toString()))); + + QueryBuilder query = QueryBuilder.from(Cases.class); + query.addFilter(FieldFilters.in("id",caseIdList)); + query.addFilter(FieldFilters.eq("deleted",false)); + + List casesList = casesDao.findList(query.builder()); + casesList = caseListCommonHandle(casesList, accountId); + + Collections.sort(casesList, new Comparator() { + @Override + public int compare(Cases c1, Cases c2) { + Integer order1 = collect.get(c1.getId()); + Integer order2 = collect.get(c2.getId()); + return Integer.compare(order1, order2); + } + }); + return casesList; + } + + + + @Override + public List queryRecommendRank(Integer pageSize) { + QueryBuilder queryBuilder = QueryBuilder.from(Cases.class); + queryBuilder.setPageSize(pageSize); + queryBuilder.addFilter(FieldFilters.eq("deleted",false)); + queryBuilder.addFilter(FieldFilters.isNotNull("recommend_rank")); + queryBuilder.addOrder(OrderCondition.asc("recommend_rank")); + + List recommendRank = casesDao.findList(queryBuilder.builder()); + + List collect = recommendRank.stream().map(e -> { + CasesQueryRecommendRankVo casesQueryRecommendRankVo = new CasesQueryRecommendRankVo(); + casesQueryRecommendRankVo.setCaseId(e.getId()); + casesQueryRecommendRankVo.setCaseTitle(e.getTitle()); + casesQueryRecommendRankVo.setCaseAuthor(e.getAuthorName()); + casesQueryRecommendRankVo.setRecommendRankPushUserName(e.getRecommendRankPushUserName()); + casesQueryRecommendRankVo.setRecommendRankPusTime(e.getRecommendRankPushTime()); + return casesQueryRecommendRankVo; + }).collect(Collectors.toList()); + return collect; + } + + @Override + public void riseIntoRank(Long caseId, CurrentUser currentUser) { + Cases caseOfNewRise = casesDao.findOne(FieldFilters.eq("id", String.valueOf(caseId)),FieldFilters.isNull("recommend_rank"),FieldFilters.eq("deleted",false)); + if (caseOfNewRise == null) { + log.error("案例不存在或已经在榜,不可上榜", caseId); + return; + } + + int count = casesDao.sqlCount("select count(1) from boe_cases where deleted=0 and recommend_rank is not null order by recommend_rank asc limit 10"); + + if (count == 10){ + log.error("已满10条,无法添加"); + throw new RuntimeException("已满10条,无法添加"); + } + + caseOfNewRise.setRecommendRank(count); + caseOfNewRise.setRecommendRankPushUserName(currentUser.getLoginName()); + caseOfNewRise.setRecommendRankPushTime(LocalDateTime.now()); + + casesDao.update(caseOfNewRise); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelRiseIntoRank(Long caseId) { + Cases caseOfCancelRise = casesDao.findOne(FieldFilters.eq("id", String.valueOf(caseId)),FieldFilters.isNotNull("recommend_rank"),FieldFilters.eq("deleted",false)); + if (caseOfCancelRise == null) { + log.error("案例不存在或已经在榜,不可下榜", caseId); + return; + } + QueryBuilder queryBuilder = QueryBuilder.from(Cases.class); + queryBuilder.setPageSize(10); + queryBuilder.addFilter(FieldFilters.eq("deleted",false)); + queryBuilder.addOrder(OrderCondition.asc("recommend_rank")); + queryBuilder.addFilter(FieldFilters.gt("recommend_rank",caseOfCancelRise.getRecommendRank())); + List recommendRank = casesDao.findList(queryBuilder.builder()); + + if (CollectionUtils.isEmpty(recommendRank)){ + // 更新排序 + for (int i = 0; i < recommendRank.size(); i++){ + Integer currentSort = recommendRank.get(i).getRecommendRank(); + recommendRank.get(i).setRecommendRank(currentSort - 1); + casesDao.update(recommendRank.get(i)); + } + } + + // 取消排序 + caseOfCancelRise.setRecommendRank(null); + caseOfCancelRise.setRecommendRankPushTime(null); + caseOfCancelRise.setRecommendRankPushUserName(null); + casesDao.update(caseOfCancelRise); + } + + @Override + public void adjustRank(List caseIdList) { + QueryBuilder queryBuilder = QueryBuilder.from(Cases.class); + queryBuilder.setPageSize(10); + queryBuilder.addFilter(FieldFilters.eq("deleted",false)); + queryBuilder.addFilter(FieldFilters.isNotNull("recommend_rank")); + queryBuilder.addOrder(OrderCondition.asc("recommend_rank")); + List recommendRank = casesDao.findList(queryBuilder.builder()); + + // 遍历排序后的案例列表,并根据 caseIdList 设置或重置 recommendRank + recommendRank.forEach(caseItem -> { + int index = caseIdList.indexOf(Long.valueOf(caseItem.getId())); + // 如果 ID 存在于 caseIdList 中,则设置推荐等级为该 ID 的索引位置,否则设置为 null + if (index != -1) { + caseItem.setRecommendRank(index); + } else { + caseItem.setRecommendRank(null); + caseItem.setRecommendRankPushTime(null); + caseItem.setRecommendRankPushUserName(null); + } + }); + + // 保存对案例排序的更改 + recommendRank.forEach(casesDao::update); + } + + @Override + public PageList queryFavoriteCaseOfIndex(Integer pageIndex, Integer pageSize, String accountId) { + String from = Favorites.class.getSimpleName()+" f,"+ Cases.class.getSimpleName()+" c"; + QueryBuilder builder = QueryBuilder.from(from); + builder.addFields("f.id","f.sysCreateTime","c"); + + builder.addFilter(FieldFilters.eqField("f.objId","c.id")); + builder.addFilter(FieldFilters.eq("f.objType", BoedxResourceType.Case.value())); + builder.addFilter(FieldFilters.eq("f.sysCreateAid",accountId)); + builder.addFilter(FieldFilters.eq("c.deleted", false)); + builder.addOrder(OrderCondition.desc("f.sysCreateTime")); + + builder.setPageIndex(pageIndex); + builder.setPageSize(pageSize); + + PageList pageFields=null; + try { + pageFields = casesDao.findPageFields(builder.builder()); + } catch (Exception e) { + log.error("收藏案例查询错误",e); + } + + List list = pageFields.getList(); + + // 提取出 Cases 对象,添加标签 + List casesList = list.stream().map(o -> { + Cases cases = (Cases) o[2]; + FavoriteCaseOfIndexVo favoriteCaseOfIndexVo = new FavoriteCaseOfIndexVo(); + BeanUtils.copyProperties(cases, favoriteCaseOfIndexVo); + favoriteCaseOfIndexVo.setFavoriteId(o[0].toString()); + favoriteCaseOfIndexVo.setFavoriteTime(LocalDateTime.parse(o[1].toString())); + return favoriteCaseOfIndexVo; + }).collect(Collectors.toList()); + + casesList = caseListCommonHandle(casesList, accountId); + + List collect = casesList.stream().map(cases -> (FavoriteCaseOfIndexVo) cases).collect(Collectors.toList()); + + PageList favoriteCaseOfIndexVoPageList = new PageList<>(); + favoriteCaseOfIndexVoPageList.setList(collect); + favoriteCaseOfIndexVoPageList.setPageSize(pageSize); + favoriteCaseOfIndexVoPageList.setCount(pageFields.getCount()); + + return favoriteCaseOfIndexVoPageList; + + } + + @Override + public PageList browsingHistory(Integer pageIndex, Integer pageSize, String accountId, HttpServletRequest request) { + UserdynamicParam userdynamicParam = new UserdynamicParam(); + userdynamicParam.setPageIndex(pageIndex); + userdynamicParam.setPageSize(pageSize); + userdynamicParam.setContentType(3); + userdynamicParam.setAid(Long.valueOf(accountId)); + userdynamicParam.setHidden(""); + + String token = request.getHeader("Xboe-Access-Token"); + if (StringUtils.isEmpty(token)) { + token = request.getHeader("token"); + } + // 获取案例浏览记录 + UserDynamicResult userDynamicResult = thirdApi.getAllUserdynamicListOfCaseRead(userdynamicParam, token); + + List allUserdynamicList = userDynamicResult.getList(); + List collect = allUserdynamicList.stream().map(UserDynamic::getContentId).distinct().collect(Collectors.toList()); + // 查询案例信息 + List caseList = this.ids(collect, accountId); + Map map = caseList.stream().collect(Collectors.toMap(Cases::getId, cases -> cases)); + + // 组合案例信息与浏览记录 + List batchHistoryVoList = allUserdynamicList.stream().map(userDynamic -> { + CasesBrowsingHistoryVo browsingHistoryVo = new CasesBrowsingHistoryVo(); + browsingHistoryVo.setBrowsingHistoryId(userDynamic.getId()); + browsingHistoryVo.setContentInfo(userDynamic.getContentInfo()); + browsingHistoryVo.setEventTime(userDynamic.getEventTime()); + browsingHistoryVo.setContentId(userDynamic.getContentId()); + if (map.containsKey(userDynamic.getContentId())){ + // 重名属性,如ID,copy会出现覆盖。 + BeanUtils.copyProperties(map.get(userDynamic.getContentId()),browsingHistoryVo); + } + return browsingHistoryVo; + }).collect(Collectors.toList()); + + PageList pageList = new PageList<>(); + pageList.setList(batchHistoryVoList); + pageList.setCount(userDynamicResult.getCount()); + pageList.setPageSize(userDynamicResult.getPageSize()); + + return pageList; + } + + @Override + public Map> queryAllTimePopularityOfMajor() { + QueryBuilder builder = QueryBuilder.from(CasesRank.class); + builder.addField("new CasesRank(majorId,riseRankTime)"); + builder.addFilter(FieldFilters.eq("deleted",false)); + builder.addGroupBy("majorId"); + builder.addGroupBy("riseRankTime"); + List list = casesRankDao.findList(builder.builder()); + // 定义日期时间的格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy-MM"); + + Map> collect = list.stream().collect(Collectors.groupingBy + (CasesRank::getMajorId, Collectors.mapping(casesRank -> casesRank.getRiseRankTime().format(formatter), Collectors.toList()))); + + return collect; + } + } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CaseRankingVo.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CaseRankingVo.java new file mode 100644 index 00000000..d906144b --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CaseRankingVo.java @@ -0,0 +1,17 @@ +package com.xboe.module.boecase.vo; + +import lombok.Data; + +@Data +public class CaseRankingVo { + /** + * 案例id + */ + private String caseId; + + /** + * 案例标题 + */ + private String caseTitle; + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CaseViewRankingItemVo.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CaseViewRankingItemVo.java new file mode 100644 index 00000000..88191080 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CaseViewRankingItemVo.java @@ -0,0 +1,29 @@ +package com.xboe.module.boecase.vo; + +import lombok.Data; +import java.time.LocalDateTime; + +@Data +public class CaseViewRankingItemVo { + + /** + * 分类id + */ + private String majorId; + + /** + * 分类名称 + */ + private String majorName; + + /** + * 上榜时间,目前默认为一月中的最后一天的23:59:59 + */ + private LocalDateTime riseRankTime; + + /** + * 标签名称 + */ + private String tagName; + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CasesBrowsingHistoryVo.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CasesBrowsingHistoryVo.java new file mode 100644 index 00000000..93775a0f --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CasesBrowsingHistoryVo.java @@ -0,0 +1,31 @@ +package com.xboe.module.boecase.vo; + +import com.xboe.module.boecase.entity.Cases; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class CasesBrowsingHistoryVo extends Cases{ + + /** + * 浏览记录id + * */ + private String browsingHistoryId; + + /** + * 案例标题 + * */ + private String contentInfo; + + /** + * 事件时间,查看案例时,有定时接口触发,名为send,eventTime为该时间 + * */ + private LocalDateTime eventTime; + + /** + * 案例ID + * */ + private String contentId; + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CasesQueryRecommendRankVo.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CasesQueryRecommendRankVo.java new file mode 100644 index 00000000..5e6d5a27 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/CasesQueryRecommendRankVo.java @@ -0,0 +1,37 @@ +package com.xboe.module.boecase.vo; + +import lombok.Data; + +import java.time.LocalDateTime; + + +@Data +public class CasesQueryRecommendRankVo { + + /** + * 案例id + */ + private String caseId; + + /** + * 案例标题 + */ + private String caseTitle; + + /** + * 案例作者 + */ + private String caseAuthor; + + /** + * 推送用户名称 + */ + private String recommendRankPushUserName; + + /** + * 推送时间 + */ + private LocalDateTime recommendRankPusTime; + + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/FavoriteCaseOfIndexVo.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/FavoriteCaseOfIndexVo.java new file mode 100644 index 00000000..bb59e316 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/vo/FavoriteCaseOfIndexVo.java @@ -0,0 +1,23 @@ +package com.xboe.module.boecase.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xboe.module.boecase.entity.Cases; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class FavoriteCaseOfIndexVo extends Cases{ + + /** + * 收藏id + */ + private String favoriteId; + + /** + * 收藏时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime favoriteTime; + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/interaction/dto/FavoriteCaseDto.java b/servers/boe-server-all/src/main/java/com/xboe/module/interaction/dto/FavoriteCaseDto.java index af70ed9e..8487ada9 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/interaction/dto/FavoriteCaseDto.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/interaction/dto/FavoriteCaseDto.java @@ -12,6 +12,7 @@ public class FavoriteCaseDto { private String id; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime time; /** From 012f987de0176ff64f31c82b5eb6b226ca714bcc Mon Sep 17 00:00:00 2001 From: nisen Date: Sat, 14 Sep 2024 12:33:31 +0800 Subject: [PATCH 71/93] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E8=90=83=E5=8F=96?= =?UTF-8?q?=EF=BC=8C=E6=9A=82=E6=97=B6=E6=B3=A8=E9=87=8A=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boecase/service/impl/CasesServiceImpl.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java index e9d13cf1..649d109a 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java @@ -1177,10 +1177,16 @@ public class CasesServiceImpl implements ICasesService { } //获取案例当月排名 +// String sql = +// "SELECT bc.id,bcmt.major_id,bc.views - COALESCE(bc.last_month_views, 0) AS increment\n" + +// "FROM boe_cases bc\n" + +// "JOIN boe_cases_major_type bcmt ON bcmt.case_id = bc.id and bc.deleted=0 and file_path is not null and file_path!='' and bc.views - COALESCE(bc.last_month_views, 0)!=0"; + String sql = - "SELECT bc.id,bcmt.major_id,bc.views - COALESCE(bc.last_month_views, 0) AS increment\n" + - "FROM boe_cases bc\n" + - "JOIN boe_cases_major_type bcmt ON bcmt.case_id = bc.id and bc.deleted=0 and file_path is not null and file_path!='' and bc.views - COALESCE(bc.last_month_views, 0)!=0"; + "SELECT bc.id,bcmt.major_id,bc.views AS increment\n" + + "FROM boe_cases bc\n" + + "JOIN boe_cases_major_type bcmt ON bcmt.case_id = bc.id and bc.deleted=0 and file_path is not null and file_path!='' and bc.views !=0 and bc.views is not null"; + List caseListOfObject = casesDao.sqlFindList(sql); // 转为casesRank From e6feea6dbf912f4f01db4821d0cba65dc715179a Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Sat, 14 Sep 2024 12:52:37 +0800 Subject: [PATCH 72/93] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E8=90=83=E5=8F=96?= =?UTF-8?q?=EF=BC=8C=E7=B1=BB=E5=9E=8B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/module/boecase/api/CasesApi.java | 4 ++-- .../java/com/xboe/module/boecase/dao/CasesRankDao.java | 2 +- .../java/com/xboe/module/boecase/entity/CasesRank.java | 4 ++-- .../com/xboe/module/boecase/service/ICasesService.java | 2 +- .../module/boecase/service/impl/CasesServiceImpl.java | 8 ++++---- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java index 441923e1..70291073 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java @@ -698,8 +698,8 @@ public class CasesApi extends ApiBaseController { * 所有上榜的的(专业ID-时间), 用于下拉框.优化可将majorName一并查询,返回为List> todo by anyone */ @GetMapping("/queryAllTimePopularityOfMajor") - public JsonResponse>> queryAllTimePopularityOfMajor() { - Map> time = casesService.queryAllTimePopularityOfMajor(); + public JsonResponse>> queryAllTimePopularityOfMajor() { + Map> time = casesService.queryAllTimePopularityOfMajor(); return success(time); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java index 98c5b576..4669fe76 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java @@ -35,7 +35,7 @@ public class CasesRankDao extends BaseDao { casesRank.setMajorName(o[0].toString()); casesRank.setRiseRankTime(((Timestamp) o[1]).toLocalDateTime()); casesRank.setRank(Integer.valueOf(o[2].toString())); - casesRank.setMajorId(Long.valueOf(o[3].toString())); + casesRank.setMajorId(o[3].toString()); resultList.add(casesRank); } return resultList; diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRank.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRank.java index 51baf8dc..0d3a3cfc 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRank.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/entity/CasesRank.java @@ -33,7 +33,7 @@ public class CasesRank extends BaseEntity { * 专业ID */ @Column(name = "major_id") - private Long majorId; + private String majorId; /** * 排名 @@ -54,7 +54,7 @@ public class CasesRank extends BaseEntity { @Transient private String majorName; - public CasesRank(Long majorId, LocalDateTime riseRankTime) { + public CasesRank(String majorId, LocalDateTime riseRankTime) { this.majorId = majorId; this.riseRankTime = riseRankTime; } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java index aebdf2c7..659174ea 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java @@ -139,6 +139,6 @@ public interface ICasesService{ PageList browsingHistory(Integer pageIndex, Integer pageSize, String accountId, HttpServletRequest request); - Map> queryAllTimePopularityOfMajor(); + Map> queryAllTimePopularityOfMajor(); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java index e9d13cf1..7d5592a0 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java @@ -1188,13 +1188,13 @@ public class CasesServiceImpl implements ICasesService { .map(o -> { CasesRank casesRank = new CasesRank(); casesRank.setCaseId(Long.valueOf(Array.get(o, 0).toString())); - casesRank.setMajorId(Long.valueOf(Array.get(o, 1).toString())); + casesRank.setMajorId(Array.get(o, 1).toString()); casesRank.setMonthlyIncrement(Integer.parseInt(Array.get(o, 2).toString())); casesRank.setRiseRankTime(lastDayOfLastMonth); return casesRank; }).collect(Collectors.toList()); // 根据专业分类进行分组 - Map> casesRankMap = casesRankList.stream().collect(Collectors.groupingBy(CasesRank::getMajorId)); + Map> casesRankMap = casesRankList.stream().collect(Collectors.groupingBy(CasesRank::getMajorId)); // 生成当前月不同分类的最新的浏览量排名 ArrayList lastMonthRank = new ArrayList<>(); @@ -1488,7 +1488,7 @@ public class CasesServiceImpl implements ICasesService { } @Override - public Map> queryAllTimePopularityOfMajor() { + public Map> queryAllTimePopularityOfMajor() { QueryBuilder builder = QueryBuilder.from(CasesRank.class); builder.addField("new CasesRank(majorId,riseRankTime)"); builder.addFilter(FieldFilters.eq("deleted",false)); @@ -1498,7 +1498,7 @@ public class CasesServiceImpl implements ICasesService { // 定义日期时间的格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yy-MM"); - Map> collect = list.stream().collect(Collectors.groupingBy + Map> collect = list.stream().collect(Collectors.groupingBy (CasesRank::getMajorId, Collectors.mapping(casesRank -> casesRank.getRiseRankTime().format(formatter), Collectors.toList()))); return collect; From c2de2a433b092bb003f01da56f38dc052ab2ef32 Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Sat, 14 Sep 2024 13:15:21 +0800 Subject: [PATCH 73/93] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E8=90=83=E5=8F=96?= =?UTF-8?q?=EF=BC=8C=E7=B1=BB=E5=9E=8B=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/xboe/module/boecase/api/CasesApi.java | 2 +- .../src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java | 2 +- .../java/com/xboe/module/boecase/service/ICasesService.java | 2 +- .../com/xboe/module/boecase/service/impl/CasesServiceImpl.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java index 70291073..1fdce29b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java @@ -686,7 +686,7 @@ public class CasesApi extends ApiBaseController { @SuppressWarnings("unchecked") @GetMapping("/queryPopularityOfMajor") public JsonResponse> queryPopularityOfMajor(@RequestParam(required = false) Integer pageSize, - @RequestParam Long majorId, + @RequestParam String majorId, @RequestParam LocalDateTime rankMonth) { String accountId = getCurrent().getAccountId(); List caseRankingVoList =casesService.queryPopularityOfMajor(pageSize,majorId,rankMonth,accountId); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java index 4669fe76..decfa067 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java @@ -63,7 +63,7 @@ public class CasesRankDao extends BaseDao { } - public List> findPopularityOfMajor(Integer pageSize, LocalDateTime startTime, LocalDateTime endTime, Long majorId) { + public List> findPopularityOfMajor(Integer pageSize, LocalDateTime startTime, LocalDateTime endTime, String majorId) { String sql = "SELECT bcr.case_id,bcr.rank\n" + diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java index 659174ea..b114932e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/ICasesService.java @@ -133,7 +133,7 @@ public interface ICasesService{ List queryRank(Integer pageSize, Integer rankType); - List queryPopularityOfMajor(Integer pageSize, Long majorId, LocalDateTime month, String accountId); + List queryPopularityOfMajor(Integer pageSize, String majorId, LocalDateTime month, String accountId); PageList queryFavoriteCaseOfIndex(Integer pageIndex, Integer pageSize, String accountId); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java index 7d5592a0..cb9dfd94 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java @@ -1262,7 +1262,7 @@ public class CasesServiceImpl implements ICasesService { @Override - public List queryPopularityOfMajor(Integer pageSize, Long majorId, LocalDateTime month, String accountId) { + public List queryPopularityOfMajor(Integer pageSize, String majorId, LocalDateTime month, String accountId) { if (pageSize == null) { pageSize = 10; } From e04735ee440b19fde3637a7624960e6027cb8ccb Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Sat, 14 Sep 2024 13:25:02 +0800 Subject: [PATCH 74/93] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E8=90=83=E5=8F=96?= =?UTF-8?q?=EF=BC=8C=E6=9C=80=E4=BD=B3=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/boecase/service/impl/CasesServiceImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java index cb9dfd94..17525163 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java @@ -509,7 +509,11 @@ public class CasesServiceImpl implements ICasesService { // 拼接生成年度最佳标签 if (e.getExcellent()!=null && e.getExcellent()) { - e.setExcellentTag(e.getExcellentTime().format(DateTimeFormatter.ofPattern("yy年"))+"度最佳"); + if (e.getDraftingTime()!=null){ + e.setExcellentTag(e.getDraftingTime().format(DateTimeFormatter.ofPattern("yy年"))+"度最佳"); + } else { + e.setExcellentTag(e.getSysCreateTime().format(DateTimeFormatter.ofPattern("yy年"))+"度最佳"); + } } List authorTags = new ArrayList<>(); From 7c840d2bfc7cd8ad0c5f13256d0622ec447be360 Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Sat, 14 Sep 2024 13:49:22 +0800 Subject: [PATCH 75/93] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E8=90=83=E5=8F=96?= =?UTF-8?q?=EF=BC=8C=E6=A1=88=E4=BE=8B=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java index decfa067..2ad38cb2 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java @@ -22,7 +22,7 @@ public class CasesRankDao extends BaseDao { "FROM\n" + " boe_cases_rank bcvr\n" + "JOIN boe_dict_major_type bdmt \n" + - " ON CAST(bdmt.code AS SIGNED) = bcvr.major_id \n" + + " ON bdmt.code = bcvr.major_id \n" + "WHERE bcvr.case_id = ?1 AND bcvr.deleted=0 AND bdmt.deleted=0\n" + "ORDER BY bcvr.sys_update_time DESC \n" + "LIMIT 2;"; From 57e04f46c054c345ebdf8d1624e7c65147619058 Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Fri, 27 Sep 2024 14:22:51 +0800 Subject: [PATCH 76/93] =?UTF-8?q?=E8=AF=95=E9=A2=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/exam/api/ExamQuestionApi.java | 123 +++++++++++------- 1 file changed, 74 insertions(+), 49 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java index 7c0beb6e..e9eb6b59 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java @@ -170,7 +170,7 @@ public class ExamQuestionApi extends ApiBaseController { //从第二行开始获取数据 List examQuestions1 = new ArrayList<>(); QuestionDto questionDto = new QuestionDto(); - if(sheetAt.getRow(1).getCell(0).getStringCellValue().equals("标题(*)")){ + if(sheetAt.getRow(1).getCell(0).getStringCellValue().equals("标题(*)") && !sheetAt.getRow(1).getCell(0).getStringCellValue().equals("")){ row = sheetAt.getRow(1); for (int i = 2;i examOptions = new ArrayList<>(); - for (int j=7;j<=13;j++) { + for (int j=6;j<=12;j++) { if(row1.getCell(j)!=null) { ExamOption examOption = new ExamOption(); // 截取表头 String substring = row.getCell(j).getStringCellValue().substring(3, 4); - if (row1.getCell(6).getStringCellValue().contains(substring)) { + if (row1.getCell(5).getStringCellValue().contains(substring)) { examOption.setIsAnswer(true); - examOption.setScore(Float.valueOf(row1.getCell(4).getStringCellValue())); + if (row1.getCell(3).getStringCellValue().isEmpty()){ + examOption.setScore(null); + }else { + examOption.setScore(Float.valueOf(row1.getCell(3).getStringCellValue())); + } } else { examOption.setIsAnswer(false); } if (examOption.getIsAnswer()) { - examOption.setScore(Float.valueOf(row1.getCell(4).getStringCellValue())); + if (row1.getCell(3).getStringCellValue().isEmpty()){ + examOption.setScore(null); + }else { + examOption.setScore(Float.valueOf(row1.getCell(3).getStringCellValue())); + } } examOption.setOptions(row.getCell(j).getStringCellValue()); @@ -258,19 +269,19 @@ public class ExamQuestionApi extends ApiBaseController { } } examQuestion.setDefaultScore(Float.valueOf(max)); - Cell cell1 = row1.getCell(5, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); + Cell cell1 = row1.getCell(4, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); cell1.setCellType(CellType.STRING); examQuestion.setAnalysis(cell1.getStringCellValue()); - examQuestion.setAnswer(row1.getCell(6).getStringCellValue()); + examQuestion.setAnswer(row1.getCell(5).getStringCellValue()); List examOptions = new ArrayList<>(); //A - for (int j=7;j<=13;j++){ + for (int j=6;j<=12;j++){ if(row1.getCell(j)!=null && StringUtil.isNotBlank(row1.getCell(j).getStringCellValue())){ ExamOption examOption=new ExamOption(); examOption.setOptions(row.getCell(j).getStringCellValue()); examOption.setContent(row1.getCell(j).getStringCellValue()); examOption.setIsAnswer(true); - examOption.setScore(Float.valueOf(strings[j-7])); + examOption.setScore(Float.valueOf(strings[j-6])); if(examOption!=null && StringUtil.isNotBlank(examOption.getContent())){ examOptions.add(examOption); } @@ -301,45 +312,56 @@ public class ExamQuestionApi extends ApiBaseController { if(row1.getCell(1).getStringCellValue().equals("多选题")){ examQuestion.setType(2); } - examQuestion.setKnowledge(row1.getCell(2).getStringCellValue()); - if(row1.getCell(3).getStringCellValue().equals("中")){ + if(row1.getCell(2).getStringCellValue().equals("中")){ examQuestion.setDifficulty(2f); - } - if(row1.getCell(3).getStringCellValue().equals("难")){ + }else if(row1.getCell(2).getStringCellValue().equals("难")){ examQuestion.setDifficulty(3f); - } - if(row1.getCell(3).getStringCellValue().equals("低")){ + } else if(row1.getCell(2).getStringCellValue().equals("易")){ examQuestion.setDifficulty(1f); + }else if(row1.getCell(2).getStringCellValue().equals("")){ + examQuestion.setDifficulty(null); } - Cell cell = row1.getCell(4); + Cell cell = row1.getCell(3); cell.setCellType(CellType.STRING); // examQuestion.setDefaultScore(Float.valueOf(cell.getStringCellValue())); //单选 if (!cell.getStringCellValue().contains(",")){ - examQuestion.setAnswer(row1.getCell(6).getStringCellValue()); - examQuestion.setDefaultScore(Float.valueOf(row1.getCell(4).getStringCellValue())); - Cell cell1 = row1.getCell(5, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); + examQuestion.setAnswer(row1.getCell(5).getStringCellValue()); + if (row1.getCell(3).getStringCellValue().isEmpty()){ + examQuestion.setDefaultScore(null); + }else { + examQuestion.setDefaultScore(Float.valueOf(row1.getCell(3).getStringCellValue())); + } + Cell cell1 = row1.getCell(4, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); cell1.setCellType(CellType.STRING); examQuestion.setAnalysis(cell1.getStringCellValue()); List examOptions = new ArrayList<>(); - for (int j=7;j<=13;j++) { + for (int j=6;j<=12;j++) { if(row1.getCell(j)!=null) { ExamOption examOption = new ExamOption(); // 截取表头 String substring = row.getCell(j).getStringCellValue().substring(3, 4); - if (row1.getCell(6).getStringCellValue().contains(substring)) { + if (row1.getCell(5).getStringCellValue().contains(substring)) { examOption.setIsAnswer(true); - examOption.setScore(Float.valueOf(row1.getCell(4).getStringCellValue())); + if (row1.getCell(3).getStringCellValue().isEmpty()){ + examOption.setScore(null); + }else { + examOption.setScore(Float.valueOf(row1.getCell(3).getStringCellValue())); + } } else { examOption.setIsAnswer(false); } if (examOption.getIsAnswer()) { - examOption.setScore(Float.valueOf(row1.getCell(4).getStringCellValue())); + if (row1.getCell(3).getStringCellValue().isEmpty()){ + examOption.setScore(null); + }else { + examOption.setScore(Float.valueOf(row1.getCell(3).getStringCellValue())); + } } examOption.setOptions(row.getCell(j).getStringCellValue()); @@ -369,19 +391,19 @@ public class ExamQuestionApi extends ApiBaseController { } } examQuestion.setDefaultScore(Float.valueOf(max)); - Cell cell1 = row1.getCell(5, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); + Cell cell1 = row1.getCell(4, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); cell1.setCellType(CellType.STRING); examQuestion.setAnalysis(cell1.getStringCellValue()); - examQuestion.setAnswer(row1.getCell(6).getStringCellValue()); + examQuestion.setAnswer(row1.getCell(5).getStringCellValue()); List examOptions = new ArrayList<>(); //A - for (int j=7;j<=13;j++){ + for (int j=6;j<=13;j++){ if(row1.getCell(j)!=null && StringUtil.isNotBlank(row1.getCell(j).getStringCellValue())){ ExamOption examOption=new ExamOption(); examOption.setOptions(row.getCell(j).getStringCellValue()); examOption.setContent(row1.getCell(j).getStringCellValue()); examOption.setIsAnswer(true); - examOption.setScore(Float.valueOf(strings[j-7])); + examOption.setScore(Float.valueOf(strings[j-6])); if(examOption!=null && StringUtil.isNotBlank(examOption.getContent())){ examOptions.add(examOption); } @@ -413,27 +435,30 @@ public class ExamQuestionApi extends ApiBaseController { ExamQuestion examQuestion1 = new ExamQuestion(); examQuestion1.setTitle(row2.getCell(0).getStringCellValue()); examQuestion1.setType(3); - examQuestion1.setKnowledge(row2.getCell(1).getStringCellValue()); - if(row2.getCell(2).getStringCellValue().equals("中")){ + System.out.println("1+++++++"+row2.getCell(1)); + if(row2.getCell(1).getStringCellValue().equals("中")){ examQuestion1.setDifficulty(2f); - } - if(row2.getCell(2).getStringCellValue().equals("难")){ + }else if(row2.getCell(1).getStringCellValue().equals("难")){ examQuestion1.setDifficulty(3f); - } - if(row2.getCell(2).getStringCellValue().equals("易")){ + } else if(row2.getCell(1).getStringCellValue().equals("易")){ examQuestion1.setDifficulty(1f); + }else if(row2.getCell(1).getStringCellValue().equals("")){ + examQuestion1.setDifficulty(null); } - Cell cell1 = row2.getCell(3); + Cell cell1 = row2.getCell(2); cell1.setCellType(CellType.STRING); - examQuestion1.setDefaultScore(Float.valueOf(cell1.getStringCellValue())); - - if(row2.getCell(4)!=null) { - examQuestion1.setAnalysis(row2.getCell(4).getStringCellValue()); + if (row2.getCell(2).getStringCellValue().isEmpty()){ + examQuestion1.setDefaultScore(null); + }else { + examQuestion1.setDefaultScore(Float.valueOf(row2.getCell(2).getStringCellValue())); + } + if(row2.getCell(3)!=null) { + examQuestion1.setAnalysis(row2.getCell(3).getStringCellValue()); }else { examQuestion1.setAnalysis(""); } - String cvalue=row2.getCell(5).getStringCellValue(); + String cvalue=row2.getCell(4).getStringCellValue(); examQuestion1.setAnswer(cvalue.equals("正确")? "true":"false"); if(examQuestion1!=null){ examQuestions2.add(examQuestion1); From 28af48581e65fcbeed56be8ccf03b3576c03dd58 Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Fri, 20 Sep 2024 15:29:55 +0800 Subject: [PATCH 77/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=EF=BC=8C=E7=9B=B8=E5=85=B3bug=E4=BF=AE=E5=A4=8D=E4=B8=8E?= =?UTF-8?q?=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 作业导出,计算时长 作业导出,分数设置 作业导出,最高分、与作业完成时间 作业导出,考试 作业导出,模糊搜索 作业导出,优化导包 在线导出 作业导出,token 作业导出,bug修复 --- .../src/main/java/com/xboe/api/ThirdApi.java | 34 +++++++ .../java/com/xboe/api/vo/UserBasicInfo.java | 23 +++++ .../com/xboe/api/vo/UserBasicInfoResult.java | 35 +++++++ .../module/course/api/CoursePortalApi.java | 74 ++++++--------- .../xboe/school/study/entity/StudyExam.java | 2 +- .../school/study/service/IStudyService.java | 1 - .../service/impl/StudyExamServiceImpl.java | 95 +++++++++---------- .../impl/StudyHomeWorkServiceImpl.java | 1 + .../study/service/impl/StudyServiceImpl.java | 7 +- .../src/main/resources/application.properties | 3 +- 10 files changed, 174 insertions(+), 101 deletions(-) create mode 100644 servers/boe-server-all/src/main/java/com/xboe/api/vo/UserBasicInfo.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/api/vo/UserBasicInfoResult.java diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java b/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java index b9b6155e..2336a165 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/api/ThirdApi.java @@ -14,10 +14,13 @@ import com.xboe.school.study.entity.StudyCourse; import com.xboe.system.user.dao.UserDao; import com.xboe.system.user.entity.User; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -66,6 +69,10 @@ public class ThirdApi { @Value("${manageApi.editExam}") private String editExam; + + @Value("${userBasic.getUserBasicInfo}") + private String getUserBasicInfo; + //获取例外人员的id public List getUserId(){ String responseBody = Optional.ofNullable(HttpRequest.get(infarasApiUrl+"?pid=316&type=1").execute() //prod 316 @@ -234,5 +241,32 @@ public class ThirdApi { } + /** + * 虽然当前已存在接口查询用户基本信息,目前仅仅包括用户名、工号、用户ID + */ + public List getUserBasicInfoByUserId(List userIds, HttpServletRequest request) { + String token = request.getHeader("Xboe-Access-Token"); + if (StringUtils.isEmpty(token)) { + token = request.getHeader("token"); + } + if (StringUtils.isEmpty(token)) { + token = request.getHeader("x-access-token"); + } + + // 将userIds列表转换为逗号分隔的字符串 + String userIdsStr = userIds.stream() + .collect(Collectors.joining(",")); + String url = getUserBasicInfo +"?userIds=" + userIdsStr; + + String respStr = Optional.ofNullable(HttpRequest + .get(url) + .header("token", token) + .execute().body()).orElseThrow(() -> new RuntimeException("用户中心用户数据获取失败")); + + UserBasicInfoResult userBasicInfoResult = JSONUtil.parseObj(respStr).toBean(UserBasicInfoResult.class); + List basicInfos = userBasicInfoResult.getResult(); + return basicInfos; + + } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/vo/UserBasicInfo.java b/servers/boe-server-all/src/main/java/com/xboe/api/vo/UserBasicInfo.java new file mode 100644 index 00000000..d016597f --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/api/vo/UserBasicInfo.java @@ -0,0 +1,23 @@ +package com.xboe.api.vo; + +import lombok.Data; + +@Data +public class UserBasicInfo { + + /** + * 用户ID + */ + private String userId; + + /** + * 用户名。 + */ + private String userName; + + /** + * 工号。 + */ + private String workNum; + +} \ No newline at end of file diff --git a/servers/boe-server-all/src/main/java/com/xboe/api/vo/UserBasicInfoResult.java b/servers/boe-server-all/src/main/java/com/xboe/api/vo/UserBasicInfoResult.java new file mode 100644 index 00000000..1f69a2ee --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/api/vo/UserBasicInfoResult.java @@ -0,0 +1,35 @@ +package com.xboe.api.vo; + +import cn.hutool.json.JSONUtil; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; +import java.util.List; + + +@Data +@Slf4j +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class UserBasicInfoResult { + + private String error; + private String message; + private String permissions; + private List result; + private int status; + private Date timestamp; + + public UserBasicInfoResult success() { + if (this.status != 200) { + log.error("获取用户基本信息失败----{}", JSONUtil.toJsonPrettyStr(this)); + return null; + } + return this; + } +} \ No newline at end of file diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index 75d3d6a7..b9f12ae3 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -1,64 +1,50 @@ package com.xboe.module.course.api; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.URLEncoder; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.util.*; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import com.xboe.api.ThirdApi; -import com.xboe.core.orm.FieldFilters; -import com.xboe.module.course.entity.*; -import com.xboe.module.course.vo.TeacherVo; -import com.xboe.school.study.dao.StudyCourseDao; -import com.xboe.school.study.entity.StudyHomeWork; -import com.xboe.school.study.service.IStudyHomeWorkService; -import com.xboe.school.study.service.IStudyService; -import com.xboe.system.user.entity.User; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - +import com.xboe.api.vo.UserBasicInfo; import com.xboe.common.PageList; import com.xboe.common.Pagination; import com.xboe.common.utils.StringUtil; import com.xboe.core.JsonResponse; import com.xboe.core.api.ApiBaseController; +import com.xboe.core.orm.FieldFilters; import com.xboe.module.course.dto.CourseQueryDto; import com.xboe.module.course.dto.CourseTeacherDto; import com.xboe.module.course.dto.RankingDto; +import com.xboe.module.course.entity.*; import com.xboe.module.course.service.ICourseContentService; import com.xboe.module.course.service.ICourseSectionService; import com.xboe.module.course.service.ICourseService; import com.xboe.module.course.service.ICourseTeacherService; import com.xboe.module.course.vo.CourseStudyVo; +import com.xboe.module.course.vo.TeacherVo; import com.xboe.module.teacher.entity.Teacher; import com.xboe.module.teacher.service.ITeacherService; import com.xboe.module.usergroup.service.IUserGroupService; +import com.xboe.school.study.dao.StudyCourseDao; import com.xboe.school.study.entity.StudyCourse; import com.xboe.school.study.entity.StudyCourseItem; +import com.xboe.school.study.entity.StudyHomeWork; import com.xboe.school.study.service.IStudyCourseService; - +import com.xboe.school.study.service.IStudyHomeWorkService; +import com.xboe.school.study.service.IStudyService; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; /** @@ -365,13 +351,15 @@ public class CoursePortalApi extends ApiBaseController{ } //作业导出 @GetMapping("/export") - public JsonResponse export(String courseId,String courseName,String contentId,String name,Integer status) throws IOException { + public JsonResponse export(String courseId,String courseName,String contentId,String name,Integer status,HttpServletRequest request) throws IOException { Mapmap=new HashMap<>(); List userIds = studyCourseDao.findList(FieldFilters.eq("courseId", courseId)).stream().filter(Objects::nonNull).map(StudyCourse::getAid).collect(Collectors.toList()); if (userIds.isEmpty()){ return error("查询不到用户"); } - Listuser=studyService.getUserNo(userIds); + + List userBasicInfoList =thirdApi.getUserBasicInfoByUserId(userIds,request); + try {//筛选出的人员 List list = studyService.getList(courseId, contentId, name, status); if(list.isEmpty()){ @@ -383,12 +371,12 @@ public class CoursePortalApi extends ApiBaseController{ return success("暂无数据"); } studyHomeWorks.forEach(e->{ - user.forEach(u->{ - if(u.getId().equals(s.getAid())){ + userBasicInfoList.forEach(u->{ + if(u.getUserId().equals(s.getAid())){ //取后缀 int dotIndex = e.getFilePath().lastIndexOf('.'); // 查找最后一个'.'的位置 String extension = e.getFilePath().substring(dotIndex); - map.put(u.getName()+"-"+u.getUserNo()+extension,"/home/www/elearning/upload"+e.getFilePath()); + map.put(u.getUserName()+"-"+u.getWorkNum()+extension,"/home/www/elearning/upload"+e.getFilePath()); } }); }); diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/entity/StudyExam.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/entity/StudyExam.java index 5e55a9bc..18e833c5 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/entity/StudyExam.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/entity/StudyExam.java @@ -117,7 +117,7 @@ public class StudyExam extends IdEntity { /* * 开始时间 * */ - @JsonFormat(pattern = "yyyy--MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Column(name = "start_time") private LocalDateTime startTime; /* diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java index 40a39db7..540ef110 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/IStudyService.java @@ -99,5 +99,4 @@ public interface IStudyService { List getList(String courseId, String contentId, String name, Integer status); - List getUserNo(List userIds); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyExamServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyExamServiceImpl.java index 3a9401d4..64362fc9 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyExamServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyExamServiceImpl.java @@ -1,24 +1,9 @@ package com.xboe.school.study.service.impl; -import java.time.LocalDateTime; -import java.util.List; -import java.util.concurrent.TimeUnit; - -import javax.annotation.Resource; -import javax.transaction.Transactional; - -import com.xboe.api.ThirdApi; -import com.xboe.core.orm.QueryBuilder; -import com.xboe.school.study.entity.StudyCourse; -import com.xboe.system.user.entity.Message; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.stereotype.Service; - import com.xboe.common.OrderCondition; import com.xboe.core.orm.FieldFilters; +import com.xboe.core.orm.QueryBuilder; +import com.xboe.core.orm.UpdateBuilder; import com.xboe.module.course.dao.CourseContentDao; import com.xboe.module.course.dao.CourseExamDao; import com.xboe.module.course.entity.CourseExam; @@ -28,6 +13,17 @@ import com.xboe.school.study.dao.StudyExamDao; import com.xboe.school.study.entity.StudyCourseItem; import com.xboe.school.study.entity.StudyExam; import com.xboe.school.study.service.IStudyExamService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.transaction.Transactional; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.List; @Slf4j @Service @@ -73,29 +69,31 @@ public class StudyExamServiceImpl implements IStudyExamService{ exam.setPassLine(0); } - int prog=exam.getScore().intValue()>=exam.getPassLine()?100:exam.getScore().intValue(); //完成处理,判断是否已存在 Object obj=scItemDao.findField("id", FieldFilters.eq("studyId", exam.getStudyId()), FieldFilters.eq("contentId", exam.getContentId())); + //获取本次考试提交,学习状态与学习进度 int status=exam.getScore()>=exam.getPassLine()?StudyCourseItem.STATUS_FINISH:StudyCourseItem.STATUS_STUDYING; + int progress = exam.getScore().intValue() >= exam.getPassLine() ? 100 : 0; + //计算时长 + LocalDateTime ldt=LocalDateTime.now(); + if(obj==null) { StudyCourseItem sci=new StudyCourseItem(); - LocalDateTime ldt=LocalDateTime.now(); sci.setStudyId(exam.getStudyId()); sci.setContentId(exam.getContentId()); //sci.setContentName(homework.getContentName()); sci.setCourseId(exam.getCourseId()); //sci.setCsectionId(homework.getCsectionId()); - sci.setProgress(prog);//直接设置为学习完成 + sci.setProgress(progress);//直接设置为学习完成 sci.setStatus(status);//状态直接更新为已完成 - sci.setStartTime(ldt); + sci.setStartTime(exam.getStartTime()); sci.setAid(exam.getStudentId()); sci.setAname(exam.getStudentName()); - sci.setFinishTime(LocalDateTime.now()); + sci.setFinishTime(ldt); sci.setLastStudyTime(0);//此项用户记录视频内容当前学习的时间点 sci.setLastTime(ldt); - if(cexam.getScoringType()==CourseExam.SCORINGTYPE_LAST) { - sci.setScore(exam.getScore()); - } + sci.setScore(exam.getScore()); + sci.setStudyDuration(exam.getTestDuration()); scItemDao.save(sci); exam.setStudyItemId(sci.getId()); dao.save(exam); @@ -108,35 +106,34 @@ public class StudyExamServiceImpl implements IStudyExamService{ }else { exam.setStudyItemId(obj.toString());//此项就是学习条目的id + Float maxScore = (Float) dao.findField("max(score)", FieldFilters.eq("contentId", exam.getContentId()), FieldFilters.eq("courseId", exam.getCourseId()), FieldFilters.eq("studyId", exam.getStudyId())); dao.save(exam); - if(cexam.getScoringType()==CourseExam.SCORINGTYPE_LAST){ - scItemDao.updateFieldById(exam.getStudyItemId(), "score",exam.getScore()); - scItemDao.updateFieldById(exam.getStudyItemId(), "progress",prog); - if(exam.getScore()>=exam.getPassLine()){ - scItemDao.updateFieldById(exam.getStudyId(), "progress",100); - scItemDao.updateFieldById(exam.getStudyId(), "finish_time",LocalDateTime.now()); - scItemDao.updateFieldById(exam.getStudyId(), "status",StudyCourseItem.STATUS_FINISH); - scItemDao.updateFieldById(exam.getStudyId(), "score",exam.getScore()); - //scDao.updateFieldById(exam.getStudyId(), "last_score",100.0f); + //最新考试分值 + if (cexam.getScoringType() == CourseExam.SCORINGTYPE_LAST) { + scItemDao.updateMultiFieldById(exam.getStudyItemId(), + UpdateBuilder.create("startTime", exam.getStartTime()), + UpdateBuilder.create("finishTime", ldt), + UpdateBuilder.create("score", exam.getScore()), + UpdateBuilder.create("progress", progress), + UpdateBuilder.create("status", status), + UpdateBuilder.create("studyDuration", exam.getTestDuration()) + ); + } + + //最高分 + if (cexam.getScoringType() == CourseExam.SCORINGTYPE_MAX) { + if (exam.getScore() > maxScore) { + scItemDao.updateMultiFieldById(exam.getStudyItemId(), + UpdateBuilder.create("startTime", exam.getStartTime()), + UpdateBuilder.create("finishTime", LocalDateTime.now()), + UpdateBuilder.create("score", exam.getScore()), + UpdateBuilder.create("progress", progress), + UpdateBuilder.create("status", status) + ); } } } - //1最高一次,用于最高一次的计算 - if(cexam.getScoringType()==CourseExam.SCORINGTYPE_MAX) { - Float f=(Float)dao.findField("max(score)", FieldFilters.eq("contentId", exam.getContentId()), FieldFilters.eq("courseId", exam.getCourseId()), FieldFilters.eq("studyId", exam.getStudyId())); - scItemDao.updateFieldById(exam.getStudyItemId(), "score", f); - scItemDao.updateFieldById(exam.getStudyItemId(), "status", f>=exam.getPassLine()?StudyCourseItem.STATUS_FINISH:StudyCourseItem.STATUS_STUDYING); - scItemDao.updateFieldById(exam.getStudyItemId(), "progress",f>=exam.getPassLine()?100:f.intValue()); - if(f>=exam.getPassLine()){ - scItemDao.updateFieldById(exam.getStudyId(), "progress",100); - scItemDao.updateFieldById(exam.getStudyId(), "finish_time",LocalDateTime.now()); - scItemDao.updateFieldById(exam.getStudyId(), "status",StudyCourseItem.STATUS_FINISH); - scItemDao.updateFieldById(exam.getStudyId(), "score",exam.getScore()); - //scDao.updateFieldById(exam.getStudyId(), "last_score",100.0f); - } - - } int totalContent = courseContentDao.getCount(exam.getCourseId()); scDao.finishCheck(exam.getStudyId(),exam.getCourseId(),totalContent,token); scDao.updateFieldById(exam.getStudyId(), "last_score",exam.getScore()); diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyHomeWorkServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyHomeWorkServiceImpl.java index 2396d5f8..760fd8e6 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyHomeWorkServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyHomeWorkServiceImpl.java @@ -64,6 +64,7 @@ public class StudyHomeWorkServiceImpl implements IStudyHomeWorkService{ int totalContent=courseContentDao.count(FieldFilters.eq("courseId", homework.getCourseId()),FieldFilters.eq("deleted",false)); scDao.finishCheck(homework.getStudyId(),homework.getCourseId(),totalContent,token); }else { + scItemDao.updateFieldById(obj.toString(), "finishTime", LocalDateTime.now()); //只是保留一条作业记录,不再保存多条记录了 //dao.save(homework); //设置id。然后进行悠 diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java index 78b11375..75ed9dd2 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyServiceImpl.java @@ -214,16 +214,11 @@ public class StudyServiceImpl implements IStudyService{ } if(StringUtils.isNotBlank(name)) { - query.addFilter(FieldFilters.eq("aname", name)); + query.addFilter(FieldFilters.like("aname", name)); } return scItemDao.findList(query.builder()); } - @Override - public List getUserNo(List userIds) { - return userDao.findList(FieldFilters.in("id", userIds)); - } - @Override @Transactional public void updateProcess(String studyContentId,String studyId, String courseId,Integer total, Integer progress,String token) { diff --git a/servers/boe-server-all/src/main/resources/application.properties b/servers/boe-server-all/src/main/resources/application.properties index 01a9218f..acb91e98 100644 --- a/servers/boe-server-all/src/main/resources/application.properties +++ b/servers/boe-server-all/src/main/resources/application.properties @@ -74,4 +74,5 @@ manageApi.stu.offcourse=${boe.domain}/manageApi/stu/offcourse/getOffCourseId manageApi.editExam=${boe.domain}/manageApi/admin/project/editExam #获取离职教师id userBasic.getTeacherIds=${boe.domain}/userbasic/user/getTeacherInfo -coursesuilt.getStudyStatus=${boe.domain}/manageApi/stu/project/completeStatus \ No newline at end of file +coursesuilt.getStudyStatus=${boe.domain}/manageApi/stu/project/completeStatus +userBasic.getUserBasicInfo=${boe.domain}/userbasic/user/getUserBasicInfo From e6bd808a3dd65fc41448ca8f080bbd5e8b76ba6a Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Fri, 27 Sep 2024 16:46:50 +0800 Subject: [PATCH 78/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=EF=BC=8C=E5=88=A0=E9=99=A4=E6=B3=A8=E9=87=8A=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CoursePortalApi.java | 43 ------------------- 1 file changed, 43 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java index ff0b211d..595a6bab 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CoursePortalApi.java @@ -396,49 +396,6 @@ public class CoursePortalApi extends ApiBaseController{ String zipFilePath = "/home/www/elearning/upload/saveZip/" + courseName+"【作业】" + ".zip"; createZipFile(map, zipFilePath); return success(zipFilePath); - // 创建一个临时文件用于存储ZIP文件 -// File tempZipFile = new File("/home/www/elearning/upload/temp.zip"); -// -// try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(tempZipFile))) { -// for (Map.Entry e : map.entrySet()) { -// File fileToZip = new File(e.getValue()); -// // 添加 ZIP 条目 -// ZipEntry entry = new ZipEntry(e.getKey()); -// entry.setSize(fileToZip.length()); -// -// zos.putNextEntry(entry); -// -// try (FileInputStream fis = new FileInputStream(fileToZip)) { -// byte[] buffer = new byte[4096]; -// int len; -// while ((len = fis.read(buffer)) > 0) { -// zos.write(buffer, 0, len); -// } -// } -// -// zos.closeEntry(); -// } -// } -// // 将临时文件移动到指定位置 -// Path source = tempZipFile.toPath(); -// //生成uuid -//// String uuid = UUID.randomUUID().toString(); -// Path destination = Paths.get("/home/www/elearning/upload/saveZip/" + courseName+"【作业】" + ".zip"); -// -// // 确保目标目录存在 -// Files.createDirectories(destination.getParent()); -// -// // 删除目标文件如果已存在 -// if (Files.exists(destination)) { -// Files.delete(destination); -// } -// -// // 移动文件 -// Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING); -// -// // 返回文件路径给前端 -// String filePath = destination.toAbsolutePath().toString(); -// return success(filePath); } private static void createZipFile(Map map, String zipFilePath) throws IOException { try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFilePath))) { From 003d227ba3e67c610ab213f17ce162ae2d153489 Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Sat, 14 Sep 2024 16:26:07 +0800 Subject: [PATCH 79/93] =?UTF-8?q?=E6=A1=88=E4=BE=8B=E8=90=83=E5=8F=96?= =?UTF-8?q?=EF=BC=8C=E6=A1=88=E4=BE=8B=E6=A6=9C=E5=8D=95=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=EF=BC=8C=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boecase/api/CaseScheduledTasks.java | 7 ++- .../com/xboe/module/boecase/api/CasesApi.java | 20 +------- .../xboe/module/boecase/dao/CasesRankDao.java | 7 +-- .../service/impl/CasesServiceImpl.java | 51 +++++++++++++++++-- 4 files changed, 58 insertions(+), 27 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java index 243ae1eb..4d97d245 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java @@ -12,13 +12,16 @@ public class CaseScheduledTasks { @Resource private ICasesService casesService; - @Scheduled(cron = "0 0 1 1 * ?") // 每月的第一天的1:00执行 + /** + * 每月的第一天的1:00执行 + */ + @Scheduled(cron = "0 0 1 1 * ?") public void refreshViewsRankOfMajor() { casesService.refreshViewsRankOfMajor(); } /** - * 季初执行,cron表达式设置为每个季度的第一个月的第一天的特定时间。每个季度的第一个月是1月、4月、7月和10月: + * 季初第一天两点执行,cron表达式设置为每个季度的第一个月的第一天的特定时间。每个季度的第一个月是1月、4月、7月和10月: */ @Scheduled(cron = "0 0 2 1 1,4,7,10 ?") public void refreshLastQuarterStatistics() { diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java index 1fdce29b..a2a88716 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java @@ -132,25 +132,7 @@ public class CasesApi extends ApiBaseController { views = casesService.queryPageCasesV2(req); } - if (views != null) { - List cases = views.getList(); - if (CollUtil.isNotEmpty(cases)) { - for (Cases c : cases) { - StringBuffer stringBuffer = new StringBuffer(); - List caseId = casesMajorTypeDao.findList(FieldFilters.eq("caseId", c.getId())); - if (caseId != null && !caseId.isEmpty()) { - for (CasesMajorType cm : caseId) { - stringBuffer.append(cm.getMajorId()); - stringBuffer.append(","); - } - } - if (stringBuffer.length() > 0) { - stringBuffer.deleteCharAt(stringBuffer.length() - 1); - c.setMajorType(stringBuffer.toString()); - } - } - } - } else { + if (views == null) { views = new PageList(); views.setList(Collections.emptyList()); views.setPageSize(req.getPageSize()); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java index 2ad38cb2..172b4512 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/dao/CasesRankDao.java @@ -15,7 +15,9 @@ import java.util.stream.Collectors; @Repository @Slf4j public class CasesRankDao extends BaseDao { - + /** + * 获取类别榜记录,默认按上榜时间降序排列 + */ public List findViewsRankRecordByCaseId(String caseId) { String sql = "SELECT bdmt.name,bcvr.rise_rank_time,bcvr.rank,bcvr.major_id \n" + @@ -24,8 +26,7 @@ public class CasesRankDao extends BaseDao { "JOIN boe_dict_major_type bdmt \n" + " ON bdmt.code = bcvr.major_id \n" + "WHERE bcvr.case_id = ?1 AND bcvr.deleted=0 AND bdmt.deleted=0\n" + - "ORDER BY bcvr.sys_update_time DESC \n" + - "LIMIT 2;"; + "ORDER BY bcvr.rise_rank_time DESC;"; List list = this.sqlFindList(sql, caseId); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java index 17525163..b22143f0 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java @@ -416,14 +416,36 @@ public class CasesServiceImpl implements ICasesService { if (CollUtil.isEmpty(casesList)) { return casesList; } + //1.推荐案例数据处理 recommendCasesDataHandle(casesList, accountId); //2.标签处理,添加作者标签和新的案例标签 addAuthorTagAndCaseNewTag(casesList); + //3.案例类型处理 + majorTypeHandle(casesList); return casesList; } + private void majorTypeHandle(List casesList) { + if (CollUtil.isNotEmpty(casesList)) { + for (Cases c : casesList) { + StringBuffer stringBuffer = new StringBuffer(); + List caseId = casesMajorTypeDao.findList(FieldFilters.eq("caseId", c.getId())); + if (caseId != null && !caseId.isEmpty()) { + for (CasesMajorType cm : caseId) { + stringBuffer.append(cm.getMajorId()); + stringBuffer.append(","); + } + } + if (stringBuffer.length() > 0) { + stringBuffer.deleteCharAt(stringBuffer.length() - 1); + c.setMajorType(stringBuffer.toString()); + } + } + } + } + private void recommendCasesDataHandle(List casesList, String accountId) { if (StrUtil.isNotBlank(accountId)) { List caseIdList = casesList.stream().map(Cases::getId).collect(Collectors.toList()); @@ -483,7 +505,7 @@ public class CasesServiceImpl implements ICasesService { caseList.forEach(e -> { - // 获取最新的两个浏览量上榜记录 + // 获取浏览量上榜记录 List viewsRankRecords = casesRankDao.findViewsRankRecordByCaseId(e.getId()); if (CollUtil.isNotEmpty(viewsRankRecords)) { // 拼接生成浏览量排行榜的标签 @@ -1225,7 +1247,7 @@ public class CasesServiceImpl implements ICasesService { @Override public void refreshLastQuarterStatistics() { log.info("开始执行每季案例相关定时任务"); - int i = casesDao.sqlUpdate("update boe_cases set last_quarter_views=views,last_quarter_praise=praise where deleted=0"); + int i = casesDao.sqlUpdate("update boe_cases set last_quarter_views=views,last_quarter_praises=praises where deleted=0"); log.info("每季案例相关定时任务执行完成,boe_cases更新数据量为条数为"+i); } @@ -1277,15 +1299,18 @@ public class CasesServiceImpl implements ICasesService { List> popularityOfMajor = casesRankDao.findPopularityOfMajor(pageSize, startTime, endTime, majorId); List caseIdList = popularityOfMajor.stream().map(map -> map.get("caseId").toString()).collect(Collectors.toList()); - Map collect = popularityOfMajor.stream().collect(Collectors.toMap(map -> map.get("caseId").toString(), map -> Integer.valueOf(map.get("rank").toString()))); QueryBuilder query = QueryBuilder.from(Cases.class); query.addFilter(FieldFilters.in("id",caseIdList)); query.addFilter(FieldFilters.eq("deleted",false)); List casesList = casesDao.findList(query.builder()); + //处理案例数据-通用操作 casesList = caseListCommonHandle(casesList, accountId); + //获取案例与排名的映射关系 + Map collect = popularityOfMajor.stream().collect(Collectors.toMap(map -> map.get("caseId").toString(), map -> Integer.valueOf(map.get("rank").toString()))); + //排序榜单案例顺序 Collections.sort(casesList, new Comparator() { @Override public int compare(Cases c1, Cases c2) { @@ -1294,6 +1319,26 @@ public class CasesServiceImpl implements ICasesService { return Integer.compare(order1, order2); } }); + + casesList.forEach(cases -> { + List viewRankTags = cases.getViewRankTags(); + + // 使用 Stream API 进行排序,保持其余元素的原始顺序 + List sortedList = viewRankTags.stream() + .sorted((o1, o2) -> { + // majorId 相等时放前面 + boolean o1Matches = o1.getMajorId().equals(majorId); + boolean o2Matches = o2.getMajorId().equals(majorId); + + if (o1Matches && !o2Matches) return -1; // o1是majorId, o2不是,o1排前 + if (!o1Matches && o2Matches) return 1; // o2是majorId, o1不是,o2排前 + return 0; // 如果两者都是或都不是majorId, 保持原有顺序 + }) + .collect(Collectors.toList()); + + // 更新原列表 + cases.setViewRankTags(sortedList); + }); return casesList; } From 516225f52ed4204b0e530834107e76786d484f52 Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Fri, 27 Sep 2024 22:38:35 +0800 Subject: [PATCH 80/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=EF=BC=8C=E6=A1=88=E4=BE=8B=E7=B1=BB=E5=9E=8B=E5=A4=84=E7=90=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9B=9E=E9=80=80=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/module/boecase/api/CasesApi.java | 20 ++++++++++++++++++- .../service/impl/CasesServiceImpl.java | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java index a2a88716..1fdce29b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CasesApi.java @@ -132,7 +132,25 @@ public class CasesApi extends ApiBaseController { views = casesService.queryPageCasesV2(req); } - if (views == null) { + if (views != null) { + List cases = views.getList(); + if (CollUtil.isNotEmpty(cases)) { + for (Cases c : cases) { + StringBuffer stringBuffer = new StringBuffer(); + List caseId = casesMajorTypeDao.findList(FieldFilters.eq("caseId", c.getId())); + if (caseId != null && !caseId.isEmpty()) { + for (CasesMajorType cm : caseId) { + stringBuffer.append(cm.getMajorId()); + stringBuffer.append(","); + } + } + if (stringBuffer.length() > 0) { + stringBuffer.deleteCharAt(stringBuffer.length() - 1); + c.setMajorType(stringBuffer.toString()); + } + } + } + } else { views = new PageList(); views.setList(Collections.emptyList()); views.setPageSize(req.getPageSize()); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java index 6f3816d2..8ec57200 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java @@ -422,7 +422,7 @@ public class CasesServiceImpl implements ICasesService { //2.标签处理,添加作者标签和新的案例标签 addAuthorTagAndCaseNewTag(casesList); //3.案例类型处理 - majorTypeHandle(casesList); +// majorTypeHandle(casesList); return casesList; } From 3af3c2eedf7591e1e2aa9fd9e74ab63883d2f1dd Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Sun, 29 Sep 2024 11:17:00 +0800 Subject: [PATCH 81/93] =?UTF-8?q?=E8=80=83=E8=AF=95=E9=9A=8F=E6=9C=BA?= =?UTF-8?q?=E8=AF=95=E9=A2=98=E5=8A=9F=E8=83=BD=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/exam/api/AloneExamApi.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/AloneExamApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/AloneExamApi.java index 5f81455e..bd601e13 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/AloneExamApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/AloneExamApi.java @@ -354,18 +354,18 @@ public class AloneExamApi extends ApiBaseController { if(StringUtils.isBlank(paperJson)) { return badRequest("此考试无试卷内容,考试已经过期或试卷已被删除"); } - try { - List qlist=this.randomQuestion(examTest, paperJson); - ObjectMapper objectMapper = new ObjectMapper(); - paperJson=objectMapper.writeValueAsString(qlist); - } catch (XaskException e) { - log.error("生成试卷错误",e); - return error("生成考试试卷错误",e.getMessage(),map); - } catch (JsonProcessingException e) { - log.error("生成试卷,解析生成json错误",e); - return error("生成考试试卷解析错误",e.getMessage(),map); - } } + try { + List qlist=this.randomQuestion(examTest, paperJson); + ObjectMapper objectMapper = new ObjectMapper(); + paperJson=objectMapper.writeValueAsString(qlist); + } catch (XaskException e) { + log.error("生成试卷错误",e); + return error("生成考试试卷错误",e.getMessage(),map); + } catch (JsonProcessingException e) { + log.error("生成试卷,解析生成json错误",e); + return error("生成考试试卷解析错误",e.getMessage(),map); + } map.put("paper", paperJson); long end=System.currentTimeMillis(); log.info("开始考试用时="+(end-start)+" ms"); From effb45c6d0b33b78ae213aaf1d64f81e9b1ae822 Mon Sep 17 00:00:00 2001 From: Wangxxz <980548574@qq.com> Date: Mon, 30 Sep 2024 11:51:47 +0800 Subject: [PATCH 82/93] =?UTF-8?q?=E5=8A=A0=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/exam/api/ExamQuestionApi.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java index e9eb6b59..fc6a2fb7 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java @@ -312,14 +312,19 @@ public class ExamQuestionApi extends ApiBaseController { if(row1.getCell(1).getStringCellValue().equals("多选题")){ examQuestion.setType(2); } - if(row1.getCell(2).getStringCellValue().equals("中")){ - examQuestion.setDifficulty(2f); - }else if(row1.getCell(2).getStringCellValue().equals("难")){ - examQuestion.setDifficulty(3f); - } else if(row1.getCell(2).getStringCellValue().equals("易")){ - examQuestion.setDifficulty(1f); - }else if(row1.getCell(2).getStringCellValue().equals("")){ + + if (row1.getCell(2).getStringCellValue() == null || row1.getCell(2).getStringCellValue().equals("")){ examQuestion.setDifficulty(null); + }else{ + if( row1.getCell(2).getStringCellValue().equals("中")){ + examQuestion.setDifficulty(2f); + }else if(row1.getCell(2).getStringCellValue().equals("难")){ + examQuestion.setDifficulty(3f); + } else if(row1.getCell(2).getStringCellValue().equals("易")){ + examQuestion.setDifficulty(1f); + }else if(row1.getCell(2).getStringCellValue().equals("")){ + examQuestion.setDifficulty(null); + } } Cell cell = row1.getCell(3); cell.setCellType(CellType.STRING); From 33df8b0831c904a12ca81867141ad3d9d463ecfa Mon Sep 17 00:00:00 2001 From: Wangxxz <980548574@qq.com> Date: Mon, 30 Sep 2024 11:57:55 +0800 Subject: [PATCH 83/93] =?UTF-8?q?=E5=8A=A0=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/module/exam/api/ExamQuestionApi.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java index fc6a2fb7..555f8b70 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/exam/api/ExamQuestionApi.java @@ -312,8 +312,8 @@ public class ExamQuestionApi extends ApiBaseController { if(row1.getCell(1).getStringCellValue().equals("多选题")){ examQuestion.setType(2); } - - if (row1.getCell(2).getStringCellValue() == null || row1.getCell(2).getStringCellValue().equals("")){ + log.debug("row1.getCell(2) = " + row1.getCell(2)); + if (row1.getCell(2)==null ||row1.getCell(2).getStringCellValue() == null || row1.getCell(2).getStringCellValue().equals("")){ examQuestion.setDifficulty(null); }else{ if( row1.getCell(2).getStringCellValue().equals("中")){ From 74a36d72a1e66c5220ab1608dc3226ff4887dc6a Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Tue, 8 Oct 2024 17:40:28 +0800 Subject: [PATCH 84/93] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=EF=BC=8C=E8=80=83=E8=AF=95=E9=9A=8F=E6=9C=BA=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CourseContentApi.java | 26 ++-- .../course/service/ICourseContentService.java | 2 + .../impl/CourseContentServiceImpl.java | 113 +++++++++++++++--- 3 files changed, 118 insertions(+), 23 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseContentApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseContentApi.java index d82811d2..198311ca 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseContentApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseContentApi.java @@ -4,13 +4,10 @@ import java.util.List; import javax.annotation.Resource; +import com.xboe.common.utils.StringUtil; +import com.xboe.core.log.AutoLog; import org.apache.commons.lang3.StringUtils; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.xboe.core.JsonResponse; import com.xboe.core.api.ApiBaseController; @@ -77,7 +74,22 @@ public class CourseContentApi extends ApiBaseController{ } return success(obj); } - + + @GetMapping("/exam/paper-content") + @AutoLog(module = "试卷",action = "查看试卷试题",info = "查看当前试题内容") + public JsonResponse paperContent(String courseExamId){ + if(StringUtil.isBlank(courseExamId)){ + return badRequest("缺少必要参数"); + } + try { + Object paperContentOfOnline = ccontentService.getPaperContentOfOnline(courseExamId); + return success(paperContentOfOnline); + } catch (Exception e) { + log.error("查询试卷内容json错误",e); + return error("查询失败",e.getMessage()); + } + } + /** * 获取评估信息 * @param ccid diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java index f1f7d543..99a4514f 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseContentService.java @@ -85,4 +85,6 @@ public interface ICourseContentService{ void updateProcessVideo(String contentId, String courseId, Float processVideo); + Object getPaperContentOfOnline(String courseExamId); + } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java index d517167d..a77620ea 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java @@ -1,23 +1,17 @@ package com.xboe.module.course.service.impl; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.util.List; - -import javax.annotation.Resource; -import javax.transaction.Transactional; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Service; - +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.xboe.common.OrderCondition; +import com.xboe.core.cache.IXaskCache; +import com.xboe.core.cache.XaskCacheProvider; import com.xboe.core.orm.FieldFilters; import com.xboe.core.orm.UpdateBuilder; -import com.xboe.module.course.dao.CourseAssessDao; -import com.xboe.module.course.dao.CourseContentDao; -import com.xboe.module.course.dao.CourseExamDao; -import com.xboe.module.course.dao.CourseHomeWorkDao; -import com.xboe.module.course.dao.CourseSectionDao; +import com.xboe.module.course.dao.*; import com.xboe.module.course.dto.CourseContentDto; import com.xboe.module.course.dto.SortItem; import com.xboe.module.course.entity.CourseAssess; @@ -25,8 +19,21 @@ import com.xboe.module.course.entity.CourseContent; import com.xboe.module.course.entity.CourseExam; import com.xboe.module.course.entity.CourseHomeWork; import com.xboe.module.course.service.ICourseContentService; +import com.xboe.module.exam.dao.ExamPaperDao; +import com.xboe.module.exam.vo.TestQuestionVo; import com.xboe.standard.enums.BoedxContentType; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import javax.annotation.Resource; +import javax.transaction.Transactional; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.TimeUnit; + +@Slf4j @Service public class CourseContentServiceImpl implements ICourseContentService { @@ -44,7 +51,13 @@ public class CourseContentServiceImpl implements ICourseContentService { @Resource private CourseHomeWorkDao homeworkDao; - + + @Resource + private CourseExamDao courseExamDao; + + @Resource + private ExamPaperDao examPaperDao; + @Override @Transactional @@ -78,6 +91,9 @@ public class CourseContentServiceImpl implements ICourseContentService { assessDao.saveOrUpdate(assess); } if(exam!=null) { + if ((exam.getRandomMode() && !(exam.getQnum() > 0)) || (!exam.getRandomMode() && exam.getQnum() > 0)) { + throw new RuntimeException("随机选题处参数错误"); + } exam.setCourseId(cc.getCourseId()); exam.setContentId(cc.getId()); if(exam.getPercentScore()==null) { @@ -188,4 +204,69 @@ public class CourseContentServiceImpl implements ICourseContentService { return ccDao.sumDurationByCourseId(courseId); } + + @Override + public Object getPaperContentOfOnline(String courseExamId) { + CourseExam courseExam = courseExamDao.findOne(FieldFilters.eq("id", courseExamId)); + if (courseExam == null) { + throw new RuntimeException("课程考试不存在"); + } + + String paperId = courseExam.getPaperId(); + Integer qnum = courseExam.getQnum(); + Boolean randomMode = courseExam.getRandomMode(); + + String paperJson = ""; + ObjectMapper objectMapper = new ObjectMapper(); + + try { + // 判断试卷类型 + if (courseExam.getPaperType() == 1 && StringUtils.isNotBlank(courseExam.getPaperContent()) && randomMode && qnum != null && qnum > 0) { + + paperJson = courseExam.getPaperContent(); + JsonNode rootNode = objectMapper.readTree(paperJson); + JsonNode itemsNode = rootNode.path("items"); + List itemsNodes = new ArrayList<>(); + itemsNode.forEach(itemsNodes::add); + + if (randomMode && qnum != null && qnum > 0 && itemsNodes.size() > qnum) { + Collections.shuffle(itemsNodes); + itemsNodes = itemsNodes.subList(0, qnum); + return itemsNodes; + } + } else if (courseExam.getPaperType() == 2 && randomMode && qnum != null && qnum > 0) { + IXaskCache cache = XaskCacheProvider.getCache(); + String cacheKey = "course:exam:" + courseExamId + ":" + paperId; + String cacheData = cache.getCacheObject(cacheKey); + + if (StringUtils.isBlank(cacheData)) { + paperJson = (String) examPaperDao.findField("paperContent", FieldFilters.eq("id", paperId)); + cache.setCacheObject(cacheKey, paperJson, 5, TimeUnit.HOURS); + } else { + paperJson = cacheData; + } + + objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + List eqVoList = objectMapper.readValue(paperJson, new TypeReference>() { + }); + + if (eqVoList.size() > qnum) { + Collections.shuffle(eqVoList); + eqVoList = eqVoList.subList(0, qnum); + return eqVoList; + } + } + + } catch (JsonProcessingException e) { + log.error("JSON处理错误", e); + throw new RuntimeException(e); + } + + if (StringUtils.isBlank(paperJson)) { + throw new RuntimeException("此考试无试卷内容,考试已经过期或试卷已被删除"); + } + + return null; + } + } From 9da0eae4c0b49c9dd9487be470a6598e771bc0db Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Tue, 8 Oct 2024 19:27:46 +0800 Subject: [PATCH 85/93] =?UTF-8?q?=E8=80=83=E8=AF=95=E9=9A=8F=E6=9C=BA?= =?UTF-8?q?=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/service/impl/CourseContentServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java index a77620ea..dddfbe16 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java @@ -232,8 +232,8 @@ public class CourseContentServiceImpl implements ICourseContentService { if (randomMode && qnum != null && qnum > 0 && itemsNodes.size() > qnum) { Collections.shuffle(itemsNodes); itemsNodes = itemsNodes.subList(0, qnum); - return itemsNodes; } + return itemsNodes; } else if (courseExam.getPaperType() == 2 && randomMode && qnum != null && qnum > 0) { IXaskCache cache = XaskCacheProvider.getCache(); String cacheKey = "course:exam:" + courseExamId + ":" + paperId; @@ -253,8 +253,8 @@ public class CourseContentServiceImpl implements ICourseContentService { if (eqVoList.size() > qnum) { Collections.shuffle(eqVoList); eqVoList = eqVoList.subList(0, qnum); - return eqVoList; } + return eqVoList; } } catch (JsonProcessingException e) { From 39e336d0448d9ac5cbbc31f2cce77897248d3bc1 Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Tue, 8 Oct 2024 20:17:08 +0800 Subject: [PATCH 86/93] =?UTF-8?q?=E6=A1=88=E4=BE=8Bbug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/boecase/service/impl/CasesServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java index 8ec57200..56a53aab 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java @@ -1299,8 +1299,8 @@ public class CasesServiceImpl implements ICasesService { pageSize = 10; } - LocalDateTime startTime = month.withDayOfMonth(1); - LocalDateTime endTime = month.plusMonths(1).withDayOfMonth(1).withMinute(0); + LocalDateTime startTime = month.withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0); + LocalDateTime endTime = YearMonth.from(month).atEndOfMonth().atTime(23, 59, 59); List> popularityOfMajor = casesRankDao.findPopularityOfMajor(pageSize, startTime, endTime, majorId); List caseIdList = popularityOfMajor.stream().map(map -> map.get("caseId").toString()).collect(Collectors.toList()); From 85517dcd5727e48b61bd8a67ebc1ebbb99b67363 Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Wed, 9 Oct 2024 14:57:56 +0800 Subject: [PATCH 87/93] =?UTF-8?q?=E9=9A=8F=E6=9C=BA=E9=80=89=E9=A2=98?= =?UTF-8?q?=EF=BC=8Cbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/service/impl/CourseContentServiceImpl.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java index dddfbe16..c982b756 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseContentServiceImpl.java @@ -221,20 +221,19 @@ public class CourseContentServiceImpl implements ICourseContentService { try { // 判断试卷类型 - if (courseExam.getPaperType() == 1 && StringUtils.isNotBlank(courseExam.getPaperContent()) && randomMode && qnum != null && qnum > 0) { - + if (courseExam.getPaperType() == 1 && StringUtils.isNotBlank(courseExam.getPaperContent())) { paperJson = courseExam.getPaperContent(); JsonNode rootNode = objectMapper.readTree(paperJson); JsonNode itemsNode = rootNode.path("items"); List itemsNodes = new ArrayList<>(); itemsNode.forEach(itemsNodes::add); - if (randomMode && qnum != null && qnum > 0 && itemsNodes.size() > qnum) { + if (randomMode && qnum != null && qnum > 0 && randomMode && qnum != null && qnum > 0 && itemsNodes.size() > qnum) { Collections.shuffle(itemsNodes); itemsNodes = itemsNodes.subList(0, qnum); } return itemsNodes; - } else if (courseExam.getPaperType() == 2 && randomMode && qnum != null && qnum > 0) { + } else if (courseExam.getPaperType() == 2) { IXaskCache cache = XaskCacheProvider.getCache(); String cacheKey = "course:exam:" + courseExamId + ":" + paperId; String cacheData = cache.getCacheObject(cacheKey); @@ -250,7 +249,7 @@ public class CourseContentServiceImpl implements ICourseContentService { List eqVoList = objectMapper.readValue(paperJson, new TypeReference>() { }); - if (eqVoList.size() > qnum) { + if (randomMode && qnum != null && qnum > 0 && eqVoList.size() > qnum) { Collections.shuffle(eqVoList); eqVoList = eqVoList.subList(0, qnum); } From 25d8594a2b050e8d857c3237e1099b157c1004c8 Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Wed, 9 Oct 2024 18:52:23 +0800 Subject: [PATCH 88/93] =?UTF-8?q?=E6=A1=88=E4=BE=8B=EF=BC=8Cbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boecase/service/impl/CasesServiceImpl.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java index 56a53aab..d7bff60a 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CasesServiceImpl.java @@ -44,6 +44,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Array; import java.time.LocalDateTime; +import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.*; @@ -1203,15 +1204,15 @@ public class CasesServiceImpl implements ICasesService { } //获取案例当月排名 -// String sql = -// "SELECT bc.id,bcmt.major_id,bc.views - COALESCE(bc.last_month_views, 0) AS increment\n" + -// "FROM boe_cases bc\n" + -// "JOIN boe_cases_major_type bcmt ON bcmt.case_id = bc.id and bc.deleted=0 and file_path is not null and file_path!='' and bc.views - COALESCE(bc.last_month_views, 0)!=0"; - String sql = - "SELECT bc.id,bcmt.major_id,bc.views AS increment\n" + - "FROM boe_cases bc\n" + - "JOIN boe_cases_major_type bcmt ON bcmt.case_id = bc.id and bc.deleted=0 and file_path is not null and file_path!='' and bc.views !=0 and bc.views is not null"; + "SELECT bc.id,bcmt.major_id,bc.views - COALESCE(bc.last_month_views, 0) AS increment\n" + + "FROM boe_cases bc\n" + + "JOIN boe_cases_major_type bcmt ON bcmt.case_id = bc.id and bc.deleted=0 and file_path is not null and file_path!='' and bc.views - COALESCE(bc.last_month_views, 0)!=0"; + +// String sql = +// "SELECT bc.id,bcmt.major_id,bc.views AS increment\n" + +// "FROM boe_cases bc\n" + +// "JOIN boe_cases_major_type bcmt ON bcmt.case_id = bc.id and bc.deleted=0 and file_path is not null and file_path!='' and bc.views !=0 and bc.views is not null"; List caseListOfObject = casesDao.sqlFindList(sql); From b509b783a1ac29586b2afff3489df6f33693f251 Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Mon, 21 Oct 2024 14:04:52 +0800 Subject: [PATCH 89/93] =?UTF-8?q?=E8=A7=86=E9=A2=91=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/api/CourseWareApi.java | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseWareApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseWareApi.java index 95cf3a93..6c00f0b5 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseWareApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseWareApi.java @@ -9,6 +9,7 @@ import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -28,6 +29,7 @@ import com.xboe.module.course.service.ICourseFileService; */ @RestController @RequestMapping(value = "/xboe/m/course/cware") +@Slf4j public class CourseWareApi extends ApiBaseController { private String cookieName = "PLAYSIGN_TIME"; @@ -97,24 +99,24 @@ public class CourseWareApi extends ApiBaseController { return badRequest("非法请求"); // return; } - + String httpReferer = request.getHeader("referer"); if (StringUtils.isBlank(httpReferer)) { return badRequest("非法请求"); // return "非法请求"; } - + boolean has=false; - for(String txt :allowUrlSet) { - if(httpReferer.indexOf(txt)>-1) { - has=true; - } - } - - if(!has) { - return badRequest("页面不存在"); - //return "非法请求"; - } + for(String txt :allowUrlSet) { + if(httpReferer.indexOf(txt)>-1) { + has=true; + } + } + + if(!has) { + return badRequest("页面不存在"); + //return "非法请求"; + } //读取cookies中的时间 String cookieTime = getSignTimeCookie(request); @@ -131,6 +133,8 @@ public class CourseWareApi extends ApiBaseController { // 第一个/前端是时间 int index = signStr.indexOf("/"); if (index <= 0) { + log.info("解密后的字符串:"+signStr); + log.info("解密后的字符串的时间拼接:"+index); return badRequest("验证错误"); } @@ -138,9 +142,13 @@ public class CourseWareApi extends ApiBaseController { String cfid = signStr.substring(index+1);// 文件路径 if (!time.equals(cookieTime)) { + log.info("请求头时间和解析后的时间对比:"+"解析时间:"+time+" 请求头时间:"+cookieTime); + log.info("解密后的字符串的时间拼接:"+signStr); return badRequest("验证错误"); } if(StringUtils.isBlank(cfid) || cfid.length()<10) { + log.info("查看时间文件路径:"+cfid); + log.info("解密后的字符串的时间拼接:"+signStr); return badRequest("验证错误"); } From 3d3e660e68da3c58c96e0d1d9bf49ae18ae1025e Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Tue, 22 Oct 2024 16:49:23 +0800 Subject: [PATCH 90/93] =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E8=AF=BE=E5=A4=9A?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E9=87=8D=E5=A4=8D=E5=AD=A6=E4=B9=A0=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/school/study/dao/StudyCourseDao.java | 4 ++++ .../school/study/service/impl/StudySignupServiceImpl.java | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/dao/StudyCourseDao.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/dao/StudyCourseDao.java index d0985202..462f9c26 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/dao/StudyCourseDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/dao/StudyCourseDao.java @@ -116,4 +116,8 @@ public class StudyCourseDao extends BaseDao { this.update(update.builder()); } + + public StudyCourse findByCourseIdAndAid(String aid, String courseId) { + return this.findOne(FieldFilters.eq("aid",aid),FieldFilters.eq("courseId",courseId)); + } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudySignupServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudySignupServiceImpl.java index 8d0fe70b..80512d23 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudySignupServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudySignupServiceImpl.java @@ -61,7 +61,10 @@ public class StudySignupServiceImpl implements IStudySignupService{ @Override public void selfSignup(StudySignup signup) { signup.setSignType(StudySignup.SIGNTYPE_SELF); - this.addSignup(signup); + StudyCourse sc=studyCourseDao.findByCourseIdAndAid(signup.getAid(), signup.getCourseId()); + if (sc == null){ + this.addSignup(signup); + } //更新课程学习人数 courseDao.updateMultiFieldById(signup.getCourseId(),UpdateBuilder.create("studys", "studys+1",FieldUpdateType.EXPRESSION)); } From ea1cda25bd4b238b012e6d27d4cd8e4c6b687735 Mon Sep 17 00:00:00 2001 From: zhaolongfei <2651195677@qq.com> Date: Thu, 24 Oct 2024 16:22:51 +0800 Subject: [PATCH 91/93] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=8A=A5=E5=90=8D?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/school/study/service/impl/StudyCourseServiceImpl.java | 1 + .../src/main/resources/application-dev.properties | 2 +- .../src/main/resources/application-pre.properties | 2 +- .../src/main/resources/application-pro.properties | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java index a7c0d7f6..663dea31 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/school/study/service/impl/StudyCourseServiceImpl.java @@ -265,6 +265,7 @@ public class StudyCourseServiceImpl implements IStudyCourseService{ } @Override public void deleteSignUp(String id,String courseId,String aid) { + log.info("参数id:"+id+"参数课程id:"+courseId+"参数用户id:"+aid); //删除课程学习记录主表 studyCourseDao.deleteById(id); //删除学习课程的评估测试结果 diff --git a/servers/boe-server-all/src/main/resources/application-dev.properties b/servers/boe-server-all/src/main/resources/application-dev.properties index cedf2932..4a0a4523 100644 --- a/servers/boe-server-all/src/main/resources/application-dev.properties +++ b/servers/boe-server-all/src/main/resources/application-dev.properties @@ -26,7 +26,7 @@ logging.level.org.hibernate.SQL=DEBUG logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE # 设置logback.xml位置 -logging.config=classpath:log/logback-dev.xml +logging.config=classpath:log/logback-@profileActive@.xml ## 静态文件目录,默认是在static下面,以后独立到nginx下面配置 spring.web.resources.static-locations=file:E:/Projects/BOE/10/static diff --git a/servers/boe-server-all/src/main/resources/application-pre.properties b/servers/boe-server-all/src/main/resources/application-pre.properties index 18426195..ddea8ece 100644 --- a/servers/boe-server-all/src/main/resources/application-pre.properties +++ b/servers/boe-server-all/src/main/resources/application-pre.properties @@ -23,7 +23,7 @@ logging.level.org.hibernate.SQL=ERROR #logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE # 设置logback.xml位置 -logging.config=classpath:log/logback-dev.xml +logging.config=classpath:log/logback-@profileActive@.xml ## 静态文件目录,默认是在static下面,以后独立到nginx下面配置 spring.web.resources.static-locations=file:E:/Projects/BOE/java/static diff --git a/servers/boe-server-all/src/main/resources/application-pro.properties b/servers/boe-server-all/src/main/resources/application-pro.properties index 6c34e8bb..21371d27 100644 --- a/servers/boe-server-all/src/main/resources/application-pro.properties +++ b/servers/boe-server-all/src/main/resources/application-pro.properties @@ -34,7 +34,7 @@ logging.level.org.hibernate.SQL=ERROR # logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE # 设置logback.xml位置 -logging.config=classpath:log/logback-dev.xml +logging.config=classpath:log/logback-@profileActive@.xml ## ???????????static????????nginx???? spring.web.resources.static-locations=file:E:/Projects/BOE/java/static From e51d4dd8cb36c1b7e21a6737e04d37ed019f4e1e Mon Sep 17 00:00:00 2001 From: nisen Date: Thu, 24 Oct 2024 19:29:42 +0800 Subject: [PATCH 92/93] =?UTF-8?q?=E8=A7=86=E9=A2=91=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=A4=B4=E8=A7=A3=E6=9E=90=E6=97=B6=E9=97=B4=E5=AF=B9=E6=AF=94?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/module/course/api/CourseWareApi.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseWareApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseWareApi.java index 6c00f0b5..32b6e693 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseWareApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseWareApi.java @@ -141,11 +141,11 @@ public class CourseWareApi extends ApiBaseController { String time = signStr.substring(0, signStr.indexOf("/"));// 时间字符中,long String cfid = signStr.substring(index+1);// 文件路径 - if (!time.equals(cookieTime)) { - log.info("请求头时间和解析后的时间对比:"+"解析时间:"+time+" 请求头时间:"+cookieTime); - log.info("解密后的字符串的时间拼接:"+signStr); - return badRequest("验证错误"); - } +// if (!time.equals(cookieTime)) { +// log.info("请求头时间和解析后的时间对比:"+"解析时间:"+time+" 请求头时间:"+cookieTime); +// log.info("解密后的字符串的时间拼接:"+signStr); +// return badRequest("验证错误"); +// } if(StringUtils.isBlank(cfid) || cfid.length()<10) { log.info("查看时间文件路径:"+cfid); log.info("解密后的字符串的时间拼接:"+signStr); From b0f01c6300c4d484e97f0d5d80d24dadde070a2c Mon Sep 17 00:00:00 2001 From: yang <1175@qq.com> Date: Sun, 27 Oct 2024 18:08:39 +0800 Subject: [PATCH 93/93] =?UTF-8?q?=E5=8F=96=E6=B6=88=E5=AE=9A=E6=97=B6?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/module/boecase/api/CaseScheduledTasks.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java index 4d97d245..49212347 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseScheduledTasks.java @@ -15,7 +15,7 @@ public class CaseScheduledTasks { /** * 每月的第一天的1:00执行 */ - @Scheduled(cron = "0 0 1 1 * ?") +// @Scheduled(cron = "0 0 1 1 * ?") public void refreshViewsRankOfMajor() { casesService.refreshViewsRankOfMajor(); }