From 5aba4ef45fc7772874b950f96158b94b34afca40 Mon Sep 17 00:00:00 2001 From: zhengsongbo Date: Sat, 2 Aug 2025 12:48:57 +0800 Subject: [PATCH 01/29] =?UTF-8?q?zhengsongbo:=E6=A0=87=E7=AD=BE=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=AC=AC=E4=B8=80=E6=AC=A1=E6=8F=90=E6=B5=8B=20on=202?= =?UTF-8?q?025-08-02?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/api/CourseTagApi.java | 174 ++++++++++ .../xboe/module/course/dao/CourseTagDao.java | 89 ++++++ .../course/dao/CourseTagRelationDao.java | 116 +++++++ .../course/dao/CourseTypeTagRelationDao.java | 17 + .../module/course/dto/CourseTagQueryDto.java | 40 +++ .../course/dto/CourseTagRelationDto.java | 49 +++ .../xboe/module/course/entity/CourseTag.java | 92 ++++++ .../course/entity/CourseTagRelation.java | 37 +++ .../course/entity/CourseTypeTagRelation.java | 39 +++ .../course/service/ICourseTagService.java | 83 +++++ .../service/impl/CourseTagServiceImpl.java | 299 ++++++++++++++++++ 11 files changed, 1035 insertions(+) create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagRelationDao.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTypeTagRelationDao.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseTagQueryDto.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseTagRelationDto.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTag.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTagRelation.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTypeTagRelation.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java create mode 100644 servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java new file mode 100644 index 00000000..b57826e0 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java @@ -0,0 +1,174 @@ +package com.xboe.module.course.api; + +import com.xboe.common.OrderCondition; +import com.xboe.common.PageList; +import com.xboe.common.Pagination; +import com.xboe.core.CurrentUser; +import com.xboe.core.JsonResponse; +import com.xboe.core.api.ApiBaseController; +import com.xboe.core.orm.FieldFilters; +import com.xboe.core.orm.IFieldFilter; +import com.xboe.module.article.entity.Article; +import com.xboe.module.article.service.IArticleService; +import com.xboe.module.course.dto.CourseTagQueryDto; +import com.xboe.module.course.dto.CourseTagRelationDto; +import com.xboe.module.course.entity.CourseTag; +import com.xboe.module.course.entity.CourseTagRelation; +import com.xboe.module.course.service.ICourseTagService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * @ClassName:CourseTagApi + * @author:zhengge@oracle.com + * @since:2025/7/2614:27 + */ +@Slf4j +@RestController +@RequestMapping(value="/xboe/m/coursetag") +public class CourseTagApi extends ApiBaseController { + + @Resource + ICourseTagService courseTagService; + + /** + * 标签列表:分页查询 + * @param pager + * @param courseTagQueryDto + * @return + */ + @RequestMapping(value="/page",method= {RequestMethod.GET,RequestMethod.POST}) + public JsonResponse> find(Pagination pager, CourseTagQueryDto courseTagQueryDto){ + List filters=new ArrayList(); + OrderCondition order = null; + if (courseTagQueryDto != null){ + String tagId = courseTagQueryDto.getId(); + String tagName = courseTagQueryDto.getTagName(); + Boolean isHot = courseTagQueryDto.getIsHot(); + String orderField = courseTagQueryDto.getOrderField(); + Boolean isAsc = courseTagQueryDto.getOrderAsc(); + if (StringUtils.isNotBlank(tagId)){ + filters.add(FieldFilters.eq("id",tagId)); + } + //课程标签名称:模糊查询 + if (StringUtils.isNotBlank(tagName)){ + filters.add(FieldFilters.like("tagName",tagName)); + } + // 构建排序条件:支持先按lastSetHotTime降序,再按动态字段升/降序排列‌ + if (isHot !=null ){ + filters.add(FieldFilters.eq("isHot",isHot)); + //order = OrderCondition.desc("lastSetHotTime");//固定降序 + } + // 动态排序处理 + if (StringUtils.isNotBlank(orderField)) { + if (order == null) { + order = isAsc ? OrderCondition.asc(orderField) : OrderCondition.desc(orderField); + } else { + order = isAsc ? order.asc(orderField) : order.desc(orderField); // 链式追加排序条件 + } + } + } + PageList list=courseTagService.query(pager.getPageIndex(),pager.getPageSize(),filters,order); + return success(list); + } + + /** + * 修改指定id的课程标签的公共属性 + * @param id + * @param isPublic + * @return + */ + @RequestMapping(value="/changePublicStatus",method= RequestMethod.POST) + public JsonResponse changePublicStatus(Long id,Boolean isPublic){ + courseTagService.changePublicStatus(id,isPublic); + return success(null); + } + + /** + * 修改指定id的课程标签的热点属性 + * @param id + * @param isHot + * @return + */ + @RequestMapping(value="/changeHotStatus",method= RequestMethod.POST) + public JsonResponse changeHotStatus(Long id,Boolean isHot){ + courseTagService.changeHotStatus(id,isHot); + return success(null); + } + + /** + * 分页查询:指定id的标签关联的所有课程 + * @param courseTagQueryDto + * @return + */ + @RequestMapping(value="/showCourseByTag",method= RequestMethod.POST) + public JsonResponse> showCourseByTag(Pagination pager, CourseTagQueryDto courseTagQueryDto){ + PageList list=null; + if (courseTagQueryDto != null) { + Long tagId = Long.valueOf(courseTagQueryDto.getId()); + Boolean isAsc = courseTagQueryDto.getOrderAsc()!=null?courseTagQueryDto.getOrderAsc():false; + list=courseTagService.getCourseByTag(pager.getPageIndex(),pager.getPageSize(),tagId,isAsc); + } + return success(list); + } + + /** + * 解除指定id的课程和某个标签之间的关联关系 + * @return + */ + @RequestMapping(value="/unbind",method= RequestMethod.POST) + public JsonResponse unbindCourseTagRelation(CourseTagRelationDto courseTagRelationDto){ + if (courseTagRelationDto!=null){ + courseTagService.unbind(courseTagRelationDto.getId()); + return success(null); + } + return error("解绑失败!"); + } + + /** + * 模糊检索标签 + * @return 符合检索条件的所有公共标签 + */ + @RequestMapping(value="/searchTags",method= RequestMethod.POST) + public JsonResponse> searchTags(String tagName){ + if (StringUtils.isNotBlank(tagName)){ + List courseTagList = courseTagService.searchTags(tagName); + return success(courseTagList); + } + return error("服务器端异常!"); + } + + /** + * 创建新标签,并与当前课程绑定 + * @param courseTagRelationDto + * @return + */ + @RequestMapping(value="/createTag",method= RequestMethod.POST) + public JsonResponse createTag(CourseTagRelationDto courseTagRelationDto){ + if (courseTagRelationDto!=null){ + CourseTag courseTag = courseTagService.createTag(courseTagRelationDto); + return success(courseTag); + } + return error("创建标签失败!"); + } + + /** + * 创建新标签,并与当前课程绑定 + * @param courseTagRelationDto + * @return + */ + @RequestMapping(value="/getHotTagList",method= RequestMethod.POST) + public JsonResponse> getHotTagList(CourseTagRelationDto courseTagRelationDto){ + List hotTagList = courseTagService.getHotTagList(courseTagRelationDto); + return success(hotTagList); + } + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java new file mode 100644 index 00000000..6df7427a --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -0,0 +1,89 @@ +package com.xboe.module.course.dao; + +import com.xboe.common.OrderCondition; +import com.xboe.common.PageList; +import com.xboe.core.orm.BaseDao; +import com.xboe.core.orm.IFieldFilter; +import com.xboe.core.orm.IQuery; +import com.xboe.module.course.entity.Course; +import com.xboe.module.course.entity.CourseFile; +import com.xboe.module.course.entity.CourseTag; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Repository; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.util.List; + +/** + * @ClassName:CourseTagDao + * @author:zhengge@oracle.com + * @since:2025/7/2516:50 + */ +@Repository +public class CourseTagDao extends BaseDao { + @PersistenceContext + private EntityManager entityManager; + + /** + * 获取热门标签列表(前10条) + * @return 热门标签列表 + */ + public List getHotTagList() { + // 原生SQL:注意表名和列名需与数据库实际一致 + String sql = "SELECT c.* FROM boe_course_tag c " + + "JOIN boe_course_type_tag_relation r ON c.id = r.tag_id " + + "WHERE r.deleted = 0 " + + "AND c.is_hot = true " + // 数据库字段为is_hot(与实体属性isHot对应) + "ORDER BY c.last_set_hot_time DESC"; // 数据库字段为last_set_hot_time + + // 创建原生查询并指定结果映射到CourseTag实体 + javax.persistence.Query query = entityManager.createNativeQuery(sql, CourseTag.class); + + // 分页:取前10条 + query.setFirstResult(0); + query.setMaxResults(10); + + // 执行查询并返回结果(已映射为CourseTag类型) + return query.getResultList(); + } + + /** + * 根据课程类型获取热门标签列表(前10条) + * @param sysType1 系统类型1 + * @param sysType2 系统类型2 + * @param sysType3 系统类型3 + * @return 热门标签列表 + */ + public List getHotTagListBySysTypes(String sysType1, String sysType2, String sysType3) { + if (StringUtils.isNotBlank(sysType1)){ + // 原生SQL:注意表名和列名需与数据库实际一致(此处假设表名为course_tag、course_type_tag_relation) + String sql = "SELECT c.* FROM boe_course_tag c " + + "JOIN boe_course_type_tag_relation r ON c.id = r.tag_id " + + "WHERE r.deleted = 0 " + + "AND c.is_hot = true " + // 假设数据库字段为is_hot(与实体属性isHot对应) + "AND r.sys_type1 = ?1 " + + "AND r.sys_type2 = ?2 " + + "AND r.sys_type3 = ?3 " + + "ORDER BY c.last_set_hot_time DESC"; // 假设数据库字段为last_set_hot_time + + // 创建原生查询并指定结果映射到CourseTag实体 + javax.persistence.Query query = entityManager.createNativeQuery(sql, CourseTag.class); + + // 绑定参数(注意参数索引从1开始) + query.setParameter(1, sysType1); + query.setParameter(2, StringUtils.isNotBlank(sysType2)?sysType2:"0"); + query.setParameter(3, StringUtils.isNotBlank(sysType3)?sysType3:"0"); + + // 分页:取前10条 + query.setFirstResult(0); + query.setMaxResults(10); + + // 执行查询并返回结果(已映射为CourseTag类型) + return query.getResultList(); + } + return null; + } + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagRelationDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagRelationDao.java new file mode 100644 index 00000000..7cc78aef --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagRelationDao.java @@ -0,0 +1,116 @@ +package com.xboe.module.course.dao; + +import com.xboe.common.PageList; +import com.xboe.core.orm.BaseDao; +import com.xboe.module.course.dto.CourseTagRelationDto; +import com.xboe.module.course.entity.CourseTagRelation; +import org.springframework.stereotype.Repository; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @ClassName:CourseTagRelationDao + * @author:zhengge@oracle.com + * @since:2025/7/2815:09 + */ +@Repository +public class CourseTagRelationDao extends BaseDao { + + @PersistenceContext + private EntityManager entityManager; + + private String sqlStr = "SELECT " + + " r1.id as id, " + + " c.id as courseId, " + + " r1.tag_id as tagId, " + + " c.`name` as courseName, " + + " r1.sys_create_by as sysCreateBy, " + + " r1.sys_create_time as sysCreateTime, " + + " COALESCE(GROUP_CONCAT(DISTINCT t.tag_name ORDER BY t.tag_name), '') AS otherTags " + + "FROM " + + " boe_course c " + + "JOIN " + + " boe_course_tag_relation r1 ON c.id = r1.course_id " + + "LEFT JOIN " + + " ( " + + " boe_course_tag_relation r2 " + + " JOIN boe_course_tag t ON r2.tag_id = t.id AND t.deleted = 0 " + + " ) " + + " ON c.id = r2.course_id AND r2.tag_id != r1.tag_id " + + "WHERE " + + " r1.tag_id = :tagId AND r1.deleted = 0 " + + " AND c.id IN ( " + + " SELECT course_id " + + " FROM boe_course_tag_relation " + + " WHERE tag_id = :tagId " + + " ) " + + "GROUP BY " + + " c.id, c.`name` "; + + public PageList findCoursesWithRelatedTagsDesc(Integer pageIndex, Integer pageSize, Long tagId){ + String sql = sqlStr + " ORDER BY r1.sys_create_time DESC"; + Query query = entityManager.createNativeQuery(sql); + query.setParameter("tagId", tagId); + query.setFirstResult((pageIndex - 1) * pageSize); // 设置起始位置 + query.setMaxResults(pageSize); // 设置每页大小 + + Query countQuery = entityManager.createNativeQuery(sql); + countQuery.setParameter("tagId", tagId); + List totalresults = countQuery.getResultList(); + + List results = query.getResultList(); + List list = results.stream() + .map(row -> { + String id = String.valueOf(row[0]); + String courseId = String.valueOf(row[1]); + String tagId2 = String.valueOf(row[2]); + return new CourseTagRelationDto( + id, + courseId, + tagId2, + (String) row[3], + (String) row[4], + (Date) row[5], + (String) row[6] + ); + }) + .collect(Collectors.toList()); + return new PageList(list,totalresults!=null?totalresults.size():0); + } + + public PageList findCoursesWithRelatedTagsAsc(Integer pageIndex, Integer pageSize, Long tagId) { + String sql = sqlStr + " ORDER BY r1.sys_create_time ASC"; + Query query = entityManager.createNativeQuery(sql); + query.setParameter("tagId", tagId); + query.setFirstResult((pageIndex - 1) * pageSize); // 设置起始位置 + query.setMaxResults(pageSize); // 设置每页大小 + + Query countQuery = entityManager.createNativeQuery(sql); + countQuery.setParameter("tagId", tagId); + List totalresults = countQuery.getResultList(); + + List results = query.getResultList(); + List list = results.stream() + .map(row ->{ + String id = String.valueOf(row[0]); + String courseId = String.valueOf(row[1]); + String tagId2 = String.valueOf(row[2]); + return new CourseTagRelationDto( + id, + courseId, + tagId2, + (String) row[3], + (String) row[4], + (Date) row[5], + (String) row[6] + ); + }) + .collect(Collectors.toList()); + return new PageList(list,totalresults!=null?totalresults.size():0); + } +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTypeTagRelationDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTypeTagRelationDao.java new file mode 100644 index 00000000..c9fcba30 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTypeTagRelationDao.java @@ -0,0 +1,17 @@ +package com.xboe.module.course.dao; + +import com.xboe.core.orm.BaseDao; +import com.xboe.module.course.entity.CourseTagRelation; +import com.xboe.module.course.entity.CourseTypeTagRelation; +import org.springframework.stereotype.Repository; + +/** + * @ClassName:CourseTypeTagRelationDao + * @author:zhengge@oracle.com + * @since:2025/8/113:42 + */ +@Repository +public class CourseTypeTagRelationDao extends BaseDao { + + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseTagQueryDto.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseTagQueryDto.java new file mode 100644 index 00000000..b276f007 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseTagQueryDto.java @@ -0,0 +1,40 @@ +package com.xboe.module.course.dto; + +import lombok.Data; + +/** + * 课程标签查询的条件对象 + * @ClassName:CourseTagQueryDto + * @author:zhengge@oracle.com + * @since:2025/7/2517:02 + */ +@Data +public class CourseTagQueryDto { + + /** + * 标签id + */ + private String id; + + /** + * 标签名称 + */ + private String tagName; + + + /** + * 是否热点标签( 0-否(默认) 1-是) + */ + private Boolean isHot; + + /** + * 排序字段 + */ + private String orderField; + + /** + * 排序顺序 + */ + private Boolean orderAsc; + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseTagRelationDto.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseTagRelationDto.java new file mode 100644 index 00000000..c276b15f --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseTagRelationDto.java @@ -0,0 +1,49 @@ +package com.xboe.module.course.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.persistence.Column; +import java.time.LocalDateTime; +import java.util.Date; + +/** + * @ClassName:CourseTagRelationDto + * @author:zhengge@oracle.com + * @since:2025/7/2815:00 + */ +@Data +@NoArgsConstructor +public class CourseTagRelationDto{ + + private String id; + private String courseId; + private String tagId; + private String tagName; + private String courseName; + private String sysCreateBy; + private Date sysCreateTime; + private String otherTags; // 改为字符串类型,与 GROUP_CONCAT 结果匹配 + private String sysType1; + private String sysType2; + private String sysType3; + + // 添加匹配查询字段顺序的构造函数 + public CourseTagRelationDto( + String id, + String courseId, + String tagId, + String courseName, + String sysCreateBy, + Date sysCreateTime, + String otherTags + ) { + this.id = id; + this.courseId = courseId; + this.tagId = tagId; + this.courseName = courseName; + this.sysCreateBy = sysCreateBy; + this.sysCreateTime = sysCreateTime; + this.otherTags = otherTags; + } +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTag.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTag.java new file mode 100644 index 00000000..77199d13 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTag.java @@ -0,0 +1,92 @@ +package com.xboe.module.course.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.xboe.core.SysConstant; +import com.xboe.core.orm.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import java.time.LocalDateTime; + +/** + * 在线课程的标签类 + * @ClassName:CourseTag + * @author:zhengge@oracle.com + * @since:2025/7/25 16:37 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Entity +@Table(name = SysConstant.TABLE_PRE+"course_tag") +public class CourseTag extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 标签名称 + */ + @Column(name = "tag_name",nullable=false, length = 50) + private String tagName; + + /** + * 是否设置为公共标签 + */ + @Column(name = "is_public",length = 1) + private Boolean isPublic; + + /** + * 是否设置为热点标签 + */ + @Column(name = "is_hot",length = 1) + private Boolean isHot; + + /** + * 使用次数(关联课程数) + */ + @Column(name = "use_count",length = 1) + private Integer useCount; + + /** + * 最近设置为公共标签的时间 + */ + @Column(name = "last_set_public_time", nullable = true) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime lastSetPublicTime; + + /** + * 最近设置为热点标签的时间 + */ + @Column(name = "last_set_hot_time", nullable = true) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime lastSetHotTime; + + public CourseTag() { + + } + public CourseTag(Long id, Boolean isPublic,Boolean isHot) { + this.setId(String.valueOf(id)); + this.isPublic=isPublic; + this.isHot=isHot; + } + + + public CourseTag(String id,String tagName,String sysCreateBy,String sysCreateAid,LocalDateTime sysCreateTime, + Boolean isPublic,Boolean isHot,Integer useCount,LocalDateTime lastSetPublicTime,LocalDateTime lastSetHotTime,Boolean deleted){ + this.setId(id); + this.setTagName(tagName); + super.setSysCreateBy(sysCreateBy); + super.setSysCreateAid(sysCreateAid); + super.setSysCreateTime(sysCreateTime); + this.isPublic = isPublic; + this.isHot = isHot; + this.useCount = useCount; + this.lastSetPublicTime = lastSetPublicTime; + this.lastSetHotTime = lastSetHotTime; + super.setDeleted(deleted); + } + + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTagRelation.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTagRelation.java new file mode 100644 index 00000000..714f9e5e --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTagRelation.java @@ -0,0 +1,37 @@ +package com.xboe.module.course.entity; + +import com.xboe.core.SysConstant; +import com.xboe.core.orm.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * @ClassName:CourseTagRelation + * @author:zhengge@oracle.com + * @since:2025/7/2814:54 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Entity +@Table(name = SysConstant.TABLE_PRE+"course_tag_relation") +public class CourseTagRelation extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 课程Id + */ + @Column(name = "course_id",length = 20) + private Long courseId; + + /** + * 标签id + */ + @Column(name = "tag_id",length = 20) + private Long tagId; + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTypeTagRelation.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTypeTagRelation.java new file mode 100644 index 00000000..20f37a3c --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTypeTagRelation.java @@ -0,0 +1,39 @@ +package com.xboe.module.course.entity; + +import com.xboe.core.SysConstant; +import com.xboe.core.orm.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; + +/** + * @ClassName:CourseTypeTagRelation + * @author:zhengge@oracle.com + * @since:2025/8/111:02 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Entity +@Table(name = SysConstant.TABLE_PRE+"course_type_tag_relation") +public class CourseTypeTagRelation extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @Column(name = "sys_type1",length = 20) + private String sysType1; + + @Column(name = "sys_type2",length = 20) + private String sysType2; + + @Column(name = "sys_type3",length = 20) + private String sysType3; + + @Column(name = "tag_id",length = 20) + private String tagId; + + + +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java new file mode 100644 index 00000000..c06832b1 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java @@ -0,0 +1,83 @@ +package com.xboe.module.course.service; + +import com.xboe.common.OrderCondition; +import com.xboe.common.PageList; +import com.xboe.core.CurrentUser; +import com.xboe.core.JsonResponse; +import com.xboe.core.orm.IFieldFilter; +import com.xboe.module.article.entity.Article; +import com.xboe.module.course.dto.CourseTagQueryDto; +import com.xboe.module.course.dto.CourseTagRelationDto; +import com.xboe.module.course.entity.CourseTag; +import com.xboe.module.course.entity.CourseTagRelation; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +import java.util.List; + +/** + * @InterfaceName:ICourseTagService + * @author:zhengge@oracle.com + * @since:2025/7/2516:53 + */ +public interface ICourseTagService { + + /** + * 分页查询标签列表,使用自定义filter + * @param pageIndex + * @param pageSize + * @return + */ + PageList query(Integer pageIndex, Integer pageSize, List filters, OrderCondition order); + + /** + * 分页查询指定id标签关联的课程列表,使用自定义filter + * @param pageIndex + * @param pageSize + * @return + */ + PageList getCourseByTag(Integer pageIndex, Integer pageSize, Long tagId, Boolean isAsc); + + /** + * 修改指定id的课程标签的公共属性 + * @param id + * @param isPublic + * @return + */ + void changePublicStatus(Long id,Boolean isPublic); + + /** + * 修改指定id的课程标签的热点属性 + * @param id + * @param isHot + * @return + */ + void changeHotStatus(Long id,Boolean isHot); + + /** + * 解除指定id的课程和某个标签之间的关联关系 + * @return + */ + void unbind(String id); + + /** + * 根据标签名称进行检索(模糊查询) + * @param tagName + * @return 符合检索条件的所有公共标签 + */ + List searchTags(String tagName); + + /** + * 创建新标签,并与当前课程绑定 + * @param courseTagRelationDto + * @return + */ + CourseTag createTag(CourseTagRelationDto courseTagRelationDto); + + /** + * 根据课程类型获取热点标签 + * @param courseTagRelationDto + * @return + */ + List getHotTagList(CourseTagRelationDto courseTagRelationDto); +} diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java new file mode 100644 index 00000000..14b75384 --- /dev/null +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -0,0 +1,299 @@ +package com.xboe.module.course.service.impl; + +import com.xboe.common.OrderCondition; +import com.xboe.common.PageList; +import com.xboe.core.orm.FieldFilters; +import com.xboe.core.orm.IFieldFilter; +import com.xboe.core.orm.QueryBuilder; +import com.xboe.module.course.dao.CourseTagDao; +import com.xboe.module.course.dao.CourseTagRelationDao; +import com.xboe.module.course.dao.CourseTypeTagRelationDao; +import com.xboe.module.course.dto.CourseTagRelationDto; +import com.xboe.module.course.entity.CourseTag; +import com.xboe.module.course.entity.CourseTagRelation; +import com.xboe.module.course.entity.CourseTypeTagRelation; +import com.xboe.module.course.service.ICourseTagService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; + +/** + * @ClassName:CourseTagServiceImpl + * @author:zhengge@oracle.com + * @since:2025/7/2516:55 + */ +@Slf4j +@Service +@Transactional +public class CourseTagServiceImpl implements ICourseTagService { + + @Resource + private CourseTagDao courseTagDao; + + @Resource + private CourseTagRelationDao courseTagRelationDao; + + @Resource + private CourseTypeTagRelationDao courseTypeTagRelationDao; + + /** + * 课程标签分页查询 + * @param pageIndex + * @param pageSize + * @param filters + * @param order + * @return + */ + @Override + public PageList query(Integer pageIndex, Integer pageSize, List filters, OrderCondition order) { + QueryBuilder query=QueryBuilder.from(CourseTag.class); + query.setPageIndex(pageIndex); + query.setPageSize(pageSize); + filters.add(FieldFilters.eq("deleted",false)); + query.addFilters(filters); + if(order!=null) { + query.addOrder(order); + }else { + query.addOrder(OrderCondition.desc("sysCreateTime")); + } + return courseTagDao.findPage(query.builder()); + } + + /** + * 分页查询指定id标签关联的课程 + * @param pageIndex + * @param pageSize + * @param tagId + * @param isAsc + * @return + */ + @Override + public PageList getCourseByTag(Integer pageIndex, Integer pageSize, Long tagId, Boolean isAsc) { + PageList list = null; + if(isAsc) { + list = courseTagRelationDao.findCoursesWithRelatedTagsAsc(pageIndex,pageSize,tagId); + }else { + list = courseTagRelationDao.findCoursesWithRelatedTagsDesc(pageIndex,pageSize,tagId); + } + return list; + } + + /** + * 修改指定id的课程标签的公共属性 + * @param id + * @param isPublic + * @return + */ + @Override + public void changePublicStatus(Long id, Boolean isPublic) { + CourseTag courseTag = courseTagDao.findOne(FieldFilters.eq("id", String.valueOf(id))); + if (courseTag!=null){ + courseTag.setIsPublic(isPublic); + courseTag.setLastSetPublicTime(isPublic?LocalDateTime.now():null); + courseTagDao.update(courseTag); + } + } + + /** + * 修改指定id的课程标签的热点属性 + * @param id + * @param isHot + * @return + */ + @Override + public void changeHotStatus(Long id, Boolean isHot) { + CourseTag courseTag = courseTagDao.findOne(FieldFilters.eq("id", String.valueOf(id))); + if (courseTag!=null){ + courseTag.setIsHot(isHot); + courseTag.setLastSetHotTime(isHot?LocalDateTime.now():null); + courseTagDao.update(courseTag); + } + } + + /** + * 解除指定id的课程和某个标签之间的关联关系 + * @return + */ + @Override + public void unbind(String id) { + //根据主键查询关联关系 + CourseTagRelation courseTagRelation = courseTagRelationDao.findOne(FieldFilters.eq("id", id)); + if (courseTagRelation != null){ + //修改该标签关联课程数 + CourseTag courseTag = courseTagDao.findOne(FieldFilters.eq("id", String.valueOf(courseTagRelation.getTagId()))); + if (courseTag != null){ + courseTag.setUseCount(courseTag.getUseCount()>1?courseTag.getUseCount()-1:0); + courseTagDao.updateFieldById(courseTag.getId(),"useCount",courseTag.getUseCount()); + } + //解绑(删除关联关系) + courseTagRelationDao.setDeleted(id); + } + } + + /** + * 根据标签名称进行检索(模糊查询) + * @param tagName + * @return 符合检索条件的所有公共标签 + */ + @Override + public List searchTags(String tagName){ + QueryBuilder query=QueryBuilder.from(CourseTag.class); + List filters = new ArrayList<>(); + filters.add(FieldFilters.eq("deleted",false));//未删除 + filters.add(FieldFilters.eq("isPublic",true));//公共标签 + filters.add(FieldFilters.like("tagName",tagName));//模糊检索 + query.addFilters(filters); + List courseTagList = courseTagDao.findList(query.builder()); + return courseTagList; + } + + /** + * 创建新标签,并与指定课程绑定 + * @param courseTagRelationDto + * @return + */ + @Override + public CourseTag createTag(CourseTagRelationDto courseTagRelationDto) { + CourseTag courseTag = null; + String tagName = courseTagRelationDto.getTagName(); + Long courseId = Long.valueOf(courseTagRelationDto.getCourseId()); + //1.创建标签:先判断是否已经存在该标签 + QueryBuilder query=QueryBuilder.from(CourseTag.class); + List filters = new ArrayList<>(); + filters.add(FieldFilters.eq("tagName",tagName));//精确匹配 + query.addFilters(filters); + List courseTagList = courseTagDao.findList(query.builder()); + if (courseTagList==null || courseTagList.size()==0){//1.1 如果该标签不存在,则新建标签 + courseTag = new CourseTag(); + courseTag.setTagName(tagName); + courseTag.setIsPublic(false); + courseTag.setIsHot(false); + courseTag.setUseCount(1); + courseTagDao.save(courseTag); + //新建一条标签和课程的关联关系 + CourseTagRelation courseTagRelation = new CourseTagRelation(); + courseTagRelation.setTagId(Long.valueOf(courseTag.getId())); + courseTagRelation.setCourseId(courseId); + courseTagRelationDao.save(courseTagRelation); + }else {//1.2 否则修改标签 + courseTag=courseTagList.get(0); + courseTag.setDeleted(false);//有可能是之前被删除的标签,这里恢复为有效 + //查找改课程与这个标签是否已经建立关联关系 + query=QueryBuilder.from(CourseTagRelation.class); + filters = new ArrayList<>(); + filters.add(FieldFilters.eq("tagId",Long.valueOf(courseTag.getId())));//精确匹配 + filters.add(FieldFilters.eq("courseId",courseId));//精确匹配 + query.addFilters(filters); + List courseTagRelationList = courseTagRelationDao.findList(query.builder()); + //1.2.1 如果还未建立关联关系,则新建一条标签和课程的关联关系 + if (courseTagRelationList==null || courseTagRelationList.size()==0){ + CourseTagRelation courseTagRelation = new CourseTagRelation(); + courseTagRelation.setTagId(Long.valueOf(courseTag.getId())); + courseTagRelation.setCourseId(courseId); + courseTagRelationDao.save(courseTagRelation); + //更新该标签的关联课程数量 + courseTag.setUseCount(courseTag.getUseCount()+1); + }else {//1.2.2 否则修改该标签和课程的关联关系 + CourseTagRelation courseTagRelation = courseTagRelationList.get(0); + if (courseTagRelation.getDeleted()){//之前"解绑",这里恢复为有效 + courseTagRelation.setDeleted(false); + courseTagRelationDao.saveOrUpdate(courseTagRelation); + //更新该标签的关联课程数量 + courseTag.setUseCount(courseTag.getUseCount()+1); + } + } + courseTagDao.saveOrUpdate(courseTag); + } + //2.创建该标签和课程分类之间的关联关系 + courseTagRelationDto.setTagId(courseTag.getId()); + createCourseTypeAndTagRelation(courseTagRelationDto); + return courseTag; + } + + /** + * 获取热门标签 + * @param courseTagRelationDto + * @return + */ + @Override + public List getHotTagList(CourseTagRelationDto courseTagRelationDto) { + List hotTagList = null; + if (StringUtils.isNotBlank(courseTagRelationDto.getSysType1())){ + String sysType1 = courseTagRelationDto.getSysType1(); + String sysType2 = courseTagRelationDto.getSysType2(); + String sysType3 = courseTagRelationDto.getSysType3(); + hotTagList = courseTagDao.getHotTagListBySysTypes(sysType1,sysType2,sysType3); + }else { + hotTagList = courseTagDao.getHotTagList(); + } + return hotTagList; + } + + /** + * 创建标签和课程分类之间的关联关系 + * @param courseTagRelationDto + */ + private void createCourseTypeAndTagRelation(CourseTagRelationDto courseTagRelationDto){ + String sysType1 = courseTagRelationDto!=null?courseTagRelationDto.getSysType1():null; + String tagId = courseTagRelationDto!=null?courseTagRelationDto.getTagId():null; + if (StringUtils.isNotBlank(sysType1) && StringUtils.isNotBlank(tagId)){ + String sysType2 = courseTagRelationDto.getSysType2(); + String sysType3 = courseTagRelationDto.getSysType3(); + //判断数据库中该课程分类和标签是否已经存在关联关系 + if (!isHadCourseTypeAndTagRelation(courseTagRelationDto,true)){//不存在,则新建 + CourseTypeTagRelation courseTypeTagRelation = new CourseTypeTagRelation(); + courseTypeTagRelation.setSysType1(sysType1); + courseTypeTagRelation.setSysType2(StringUtils.isNotBlank(sysType2)?sysType2:"0"); + courseTypeTagRelation.setSysType3(StringUtils.isNotBlank(sysType3)?sysType3:"0"); + courseTypeTagRelation.setTagId(tagId); + courseTypeTagRelationDao.save(courseTypeTagRelation); + } + } + } + + /** + * 判断数据库制定的课程分类和标签是否已经存在关联关系 + * @param courseTagRelationDto + * @param clearFlag 清理标识 true:清理已存在的数据,只保留一条有效数据 + * @return true:已存在;false:不存在 + */ + private Boolean isHadCourseTypeAndTagRelation(CourseTagRelationDto courseTagRelationDto,Boolean clearFlag){ + QueryBuilder query=QueryBuilder.from(CourseTypeTagRelation.class); + List filters = new ArrayList<>(); + filters.add(FieldFilters.eq("sysType1",courseTagRelationDto.getSysType1()));//一级分类 + filters.add(FieldFilters.eq("sysType2",courseTagRelationDto.getSysType1()));//二级分类 + filters.add(FieldFilters.eq("sysType3",courseTagRelationDto.getSysType1()));//三级分类 + filters.add(FieldFilters.eq("tagId",courseTagRelationDto.getTagId())); + List courseTypeTagRelList = courseTypeTagRelationDao.findList(query.addFilters(filters).builder()); + Boolean isExist = (courseTypeTagRelList!=null && courseTypeTagRelList.size()>0)?true:false; + if (isExist && clearFlag ){ + List toRemove = new ArrayList<>(); + for (CourseTypeTagRelation courseTypeTagRel : courseTypeTagRelList) { + if (courseTypeTagRel.getDeleted()) {//如果是逻辑删的本次物理删除 + courseTypeTagRelationDao.getGenericDao().delete(courseTypeTagRel); + toRemove.add(courseTypeTagRel); + } + } + courseTypeTagRelList.removeAll(toRemove);//移除逻辑删的数据 + //如果还存在有效数据 + if (courseTypeTagRelList!=null && courseTypeTagRelList.size()>0){ + //只保留一条有效数据,其余物理删除 + for (int i = courseTypeTagRelList.size() - 1; i >= 1; i--) { + CourseTypeTagRelation courseTypeTagRel = courseTypeTagRelList.get(i); + if (courseTypeTagRel.getDeleted()) { + courseTypeTagRelationDao.getGenericDao().delete(courseTypeTagRel); + courseTypeTagRelList.remove(i); // 倒序删除不影响未遍历的索引 + } + } + isExist = true;//存在一条有效数据 + }else { + isExist = false;//不存在有效数据了 + } + } + return isExist; + } +} From 6dc4e36222ca5ab3579ce6a968ab60325f37b78e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Wed, 20 Aug 2025 14:44:31 +0800 Subject: [PATCH 02/29] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BD=93=E5=90=8C?= =?UTF-8?q?=E4=B8=80=E6=A0=87=E7=AD=BE=E8=A2=AB3=E4=B8=AA=E5=8F=8A?= =?UTF-8?q?=E4=BB=A5=E4=B8=8A=E8=AF=BE=E7=AE=A1=E5=88=9B=E5=BB=BA=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=BC=80=E5=90=AF=E8=BF=99=E4=B8=AA?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E7=9A=84=E5=85=AC=E5=85=B1=E5=8C=96=EF=BC=8C?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E6=A0=87=E7=AD=BE=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E4=B9=9F=E5=8F=AF=E4=BB=A5=E6=89=8B=E5=8A=A8=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/service/impl/CourseTagServiceImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index 14b75384..b12778e5 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -180,6 +180,10 @@ public class CourseTagServiceImpl implements ICourseTagService { courseTagRelation.setCourseId(courseId); courseTagRelationDao.save(courseTagRelation); }else {//1.2 否则修改标签 + // 当同一标签被3个及以上课管创建时,默认开启这个标签的公共化 + if(courseTagList.get(0).getUseCount() >= 3){ + courseTag.setIsPublic(true); + } courseTag=courseTagList.get(0); courseTag.setDeleted(false);//有可能是之前被删除的标签,这里恢复为有效 //查找改课程与这个标签是否已经建立关联关系 From 41649aa32d1a5175e0f247591666eb818485eb93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Wed, 20 Aug 2025 17:22:08 +0800 Subject: [PATCH 03/29] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=AB=AF=E5=9C=A8=E7=BA=BF=E8=AF=BE=E7=A8=8B=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E6=B2=A1=E6=9C=89=E4=BC=A0=E9=80=92=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/CourseServiceImpl.java | 138 ++++++++++++++++-- 1 file changed, 128 insertions(+), 10 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java index 6e7e311b..2d81cf41 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java @@ -16,11 +16,21 @@ import javax.annotation.Resource; import javax.management.Query; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.JSON; import com.xboe.api.ThirdApi; import com.xboe.core.orm.*; +import com.xboe.module.course.dto.CourseTagRelationDto; +import com.xboe.module.course.entity.*; +import com.xboe.module.course.service.ICourseTagService; import com.xboe.school.study.dao.StudyCourseDao; import com.xboe.school.study.entity.StudyCourse; import org.apache.commons.lang3.StringUtils; +import org.apache.http.client.HttpClient; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.BoolQueryBuilder; @@ -53,12 +63,6 @@ import com.xboe.module.course.dao.CourseUpdateLogDao; import com.xboe.module.course.dto.CourseFullDto; import com.xboe.module.course.dto.CourseQueryDto; import com.xboe.module.course.dto.RankingDto; -import com.xboe.module.course.entity.Course; -import com.xboe.module.course.entity.CourseCrowd; -import com.xboe.module.course.entity.CourseHRBPAudit; -import com.xboe.module.course.entity.CourseSection; -import com.xboe.module.course.entity.CourseTeacher; -import com.xboe.module.course.entity.CourseUpdateLog; import com.xboe.module.course.service.ICourseFullTextSearch; import com.xboe.module.course.service.ICourseService; import com.xboe.module.interaction.service.ICourseGradeService; @@ -98,7 +102,8 @@ public class CourseServiceImpl implements ICourseService { @Resource private CourseHRBPAuditDao courseHRBPAuditDao; - + @Resource + private ICourseTagService courseTagService; @Resource private SysLogAuditDao logAuditDao;//审核日志记录 @@ -124,8 +129,6 @@ public class CourseServiceImpl implements ICourseService { @Resource RestHighLevelClient restHighLevelClient; - - /** * 生成过滤条件 @@ -978,7 +981,6 @@ public class CourseServiceImpl implements ICourseService { Course c = full.getCourse();//当前的课程信息 Course nowCourse = courseDao.get(c.getId());//修改之前的课程信息 - StringBuffer stringBuffer = new StringBuffer("["); //追加日志内容 appendUpdateLog(stringBuffer, nowCourse, c); @@ -996,6 +998,21 @@ public class CourseServiceImpl implements ICourseService { if (c.getVisible() == null) { c.setVisible(true); } + if (c.getTags() != null && !c.getTags().isEmpty()){ + CourseTagRelationDto courseTagRelationDto = new CourseTagRelationDto(); + courseTagRelationDto.setCourseId(c.getId()); + courseTagRelationDto.setSysType1(c.getSysType1()); + courseTagRelationDto.setSysType2(c.getSysType2()); + courseTagRelationDto.setSysType3(c.getSysType3()); + String tags = c.getTags(); + List tagList = courseTagService.getTagsByIds(tags); + if (ObjectUtil.isNotEmpty(tagList)){ + for (CourseTag tag : tagList) { + courseTagRelationDto.setTagName(tag.getTagName()); + courseTagService.createTag(courseTagRelationDto); + } + } + } courseDao.update(c); c.setSysVersion(courseDao.getVersion(c.getId())); full.getCourse().setSysVersion(c.getSysVersion()); @@ -1997,7 +2014,108 @@ public class CourseServiceImpl implements ICourseService { return courseDao.findListByHql("Select new Course(id,studys,score) from Course where id in(?1)", ids); } + private class Result{ + private Boolean success; + private Data data; + private class Data{ + private List> result; + public List> getResult() { + return result; + } + + public void setResult(List> result) { + this.result = result; + } + } + + public void setData(Data data) { + this.data = data; + } + + public Boolean getSuccess() { + return success; + } + + public void setSuccess(Boolean success) { + this.success = success; + } + + public Data getData() { + return data; + } + } + + @Override + public void getPhpCourseData() { + HttpRequest request = HttpUtil.createGet("https://u.boe.com/api/b1/new-employee/course-list"); + HttpResponse response = request.execute(); + String body = response.body(); + Result result = JSON.parseObject(body,Result.class); + log.info("php课程数据获取成功"); + List> phpCourseDataList = result.getData().getResult(); + for (Map phpCourseData : phpCourseDataList){ + log.info("开始同步数据:"+phpCourseData.get("course_name")); + } + List> phpStudyCourseList = null; + // 查询数据库中是否存在php课程数据 + for (int i = 0; i < phpCourseDataList.size(); i++) { + // 查询php的课程数据在数据库中是否已经存在 + String phpCourseName = (String) phpCourseDataList.get(i).get("course_name"); + Boolean exist = isCourseName(phpCourseName,""); + if (!exist){ + log.info(phpCourseName+"不存在,开始同步"); + Course newCourse = new Course(); + // 设置学习人数 + int studys = Integer.parseInt(phpCourseDataList.get(i).get("learned_number").toString()); + newCourse.setStudys(studys); + // 设置系统版本 + int version = Integer.parseInt(phpCourseDataList.get(i).get("version").toString()); + newCourse.setSysVersion(version); + // 设置电脑端还是手机端可见 + int pcDevice = Integer.parseInt(phpCourseDataList.get(i).get("is_display_pc").toString()); + int mobileDevice = Integer.parseInt(phpCourseDataList.get(i).get("is_display_mobile").toString()); + if (pcDevice == 1 && mobileDevice == 1){ + newCourse.setDevice(3); + } else if (pcDevice == 0 && mobileDevice == 1) { + newCourse.setDevice(2); + }else if(pcDevice == 1 && mobileDevice == 0){ + newCourse.setDevice(1); + } + // 判断是否按照顺序学习 + int orderStudy = Integer.parseInt(phpCourseDataList.get(i).get("mod_type").toString()); + newCourse.setOrderStudy(orderStudy == 1 ? true : false); + // 设置课程简介 + String summary = (String) phpCourseDataList.get(i).get("course_desc_nohtml"); + newCourse.setSummary(summary); + // 设置课程类型 + int courseType = Integer.parseInt(phpCourseDataList.get(i).get("course_type").toString()); + newCourse.setType(courseType == 0 ? 20 : 30); + // 设置学习时长 + int courseTime = Integer.parseInt(phpCourseDataList.get(i).get("course_period").toString()); + newCourse.setStudyTime(courseTime); + // 设置课程封面 + newCourse.setCoverImg("https://u.boe.com/pc/images/bgimg/course.png"); + newCourse.setName(phpCourseName); + newCourse.setStatus(5); + newCourse.setComments(0); + newCourse.setDeleted(false); + newCourse.setEnabled(true); + newCourse.setFavorites(0); + newCourse.setIsTop(false); + newCourse.setViews(0); + newCourse.setPraises(0); + newCourse.setTrampleCount(0); + newCourse.setShares(0); + newCourse.setScore(0f); + + courseDao.save(newCourse); + }else { + log.info(phpCourseName+"存在"); + } + } + + } @Override public void deletedStudyResourceBatchByCourseIdAndType(String courseId, Integer courseType) { DeleteByQueryRequest request = new DeleteByQueryRequest("new_study_resource"); From f821112715c4c5beb52d7ffcec06083b5d4bb139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Wed, 20 Aug 2025 17:26:25 +0800 Subject: [PATCH 04/29] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=AB=AF=E5=9C=A8=E7=BA=BF=E8=AF=BE=E7=A8=8B=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E6=B2=A1=E6=9C=89=E4=BC=A0=E9=80=92=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/module/course/service/ICourseService.java | 2 ++ .../module/course/service/impl/CourseTagServiceImpl.java | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseService.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseService.java index fe942b3d..3b44982d 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseService.java @@ -343,4 +343,6 @@ public interface ICourseService { List findByIds(List courseIds); void deletedStudyResourceBatchByCourseIdAndType(String courseId,Integer courseType); + + void getPhpCourseData(); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index b12778e5..90aa625a 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -218,6 +218,13 @@ public class CourseTagServiceImpl implements ICourseTagService { return courseTag; } + @Override + public List getTagsByIds(String id) { + // id=17,18 + List courseTagList = courseTagDao.getTagsByIds(id); + return courseTagList; + } + /** * 获取热门标签 * @param courseTagRelationDto From 7074255e9483a9ea733075458a1f52b210c6dd98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Wed, 20 Aug 2025 17:40:50 +0800 Subject: [PATCH 05/29] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=AB=AF=E5=9C=A8=E7=BA=BF=E8=AF=BE=E7=A8=8B=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E6=B2=A1=E6=9C=89=E4=BC=A0=E9=80=92=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/module/course/dao/CourseTagDao.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index 6df7427a..a3665887 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -2,6 +2,7 @@ package com.xboe.module.course.dao; import com.xboe.common.OrderCondition; import com.xboe.common.PageList; +import com.xboe.core.SysConstant; import com.xboe.core.orm.BaseDao; import com.xboe.core.orm.IFieldFilter; import com.xboe.core.orm.IQuery; @@ -9,6 +10,7 @@ import com.xboe.module.course.entity.Course; import com.xboe.module.course.entity.CourseFile; import com.xboe.module.course.entity.CourseTag; import org.apache.commons.lang3.StringUtils; +import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; @@ -86,4 +88,10 @@ public class CourseTagDao extends BaseDao { return null; } + public List getTagsByIds(String id) { + String sql = "select * from " + SysConstant.TABLE_PRE + "course_tag where id in (" + id + "0)"; + // 创建原生查询并指定结果映射到CourseTag实体 + javax.persistence.Query query = entityManager.createNativeQuery(sql, CourseTag.class); + return query.getResultList(); + } } From 9588235f872c852c76c98d834d97727bf16cbe1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Thu, 21 Aug 2025 09:36:49 +0800 Subject: [PATCH 06/29] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=89=8D=E5=8F=B0?= =?UTF-8?q?=E7=83=AD=E7=82=B9=E6=A0=87=E7=AD=BE10=E4=B8=AA=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=EF=BC=8C=E4=BB=8E=E7=83=AD=E7=82=B9=E6=B1=A0=E4=B8=AD?= =?UTF-8?q?=E9=80=89=E5=8F=96=E5=89=8D10=EF=BC=8C=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E5=92=8C=E6=8E=92=E5=BA=8F=E8=A7=84=E5=88=99=EF=BC=9A1?= =?UTF-8?q?=EF=BC=89=E6=89=8B=E5=8A=A8=E6=A0=87=E8=AE=B0=E7=83=AD=E7=82=B9?= =?UTF-8?q?=E7=9A=84=E6=A0=87=E7=AD=BE=E6=8C=89=E6=A0=87=E8=AE=B0=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E5=80=92=E5=BA=8F=E6=8E=92=E5=88=97=202=EF=BC=89?= =?UTF-8?q?=E5=85=B3=E8=81=94=E8=AF=BE=E7=A8=8B=E6=95=B0=E9=87=8F>4?= =?UTF-8?q?=E9=97=A8=E7=9A=84=E6=A0=87=E7=AD=BE=EF=BC=8C=E6=8C=89=E5=85=B3?= =?UTF-8?q?=E8=81=94=E8=AF=BE=E7=A8=8B=E6=95=B0=E9=87=8F=E5=A4=9A=E5=B0=91?= =?UTF-8?q?=E5=80=92=E5=BA=8F=E6=8E=92=E5=88=97=E3=80=82=E5=A6=821?= =?UTF-8?q?=EF=BC=89=E5=92=8C2=EF=BC=89=E5=90=88=E8=AE=A1=E4=B8=8D?= =?UTF-8?q?=E8=B6=B310=E4=B8=AA=EF=BC=8C=E5=88=99=E5=89=8D=E5=8F=B0?= =?UTF-8?q?=E6=A0=B9=E6=8D=AE=E5=AE=9E=E9=99=85=E6=95=B0=E9=87=8F=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/module/course/dao/CourseTagDao.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index a3665887..d3e347a9 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -34,11 +34,13 @@ public class CourseTagDao extends BaseDao { */ public List getHotTagList() { // 原生SQL:注意表名和列名需与数据库实际一致 - String sql = "SELECT c.* FROM boe_course_tag c " + - "JOIN boe_course_type_tag_relation r ON c.id = r.tag_id " + - "WHERE r.deleted = 0 " + - "AND c.is_hot = true " + // 数据库字段为is_hot(与实体属性isHot对应) - "ORDER BY c.last_set_hot_time DESC"; // 数据库字段为last_set_hot_time + String sql = "select t.*,COUNT(r.tag_id) AS relation_count\n" + + "from boe_course_tag t\n" + + "left join boe_course_tag_relation r\n" + + "on t.id = r.tag_id\n" + + "where t.is_hot = true\n" + + "GROUP BY t.id\n" + + "order by t.last_set_hot_time desc,relation_count desc"; // 数据库字段为last_set_hot_time // 创建原生查询并指定结果映射到CourseTag实体 javax.persistence.Query query = entityManager.createNativeQuery(sql, CourseTag.class); From 0e60251121f0a9a5f15655b03529803a64c4769b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Thu, 21 Aug 2025 13:32:21 +0800 Subject: [PATCH 07/29] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=9B=AE=E5=89=8D?= =?UTF-8?q?=E5=85=88=E6=8C=89=E7=85=A7=E7=B2=BE=E5=87=86=E5=8C=B9=E9=85=8D?= =?UTF-8?q?=E7=9A=84=E9=80=BB=E8=BE=91=EF=BC=8C=E6=9C=AA=E6=9D=A5=E5=B0=86?= =?UTF-8?q?=E5=BC=80=E6=94=BE=E8=AF=AD=E4=B9=89=E5=8C=B9=E9=85=8D=EF=BC=88?= =?UTF-8?q?=E5=90=91=E9=87=8F=E6=90=9C=E7=B4=A2=EF=BC=89=E7=AD=89=E9=AB=98?= =?UTF-8?q?=E7=BA=A7=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CourseFullTextApi.java | 23 +++++++++++++------ .../xboe/module/course/dao/CourseTagDao.java | 6 +++++ .../course/service/ICourseTagService.java | 9 ++++++++ .../service/impl/CourseTagServiceImpl.java | 6 +++++ 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java index c43f2a20..14a7a0b0 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java @@ -12,6 +12,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException; import com.xboe.api.ThirdApi; import com.xboe.data.outside.IOutSideDataService; +import com.xboe.module.course.entity.CourseTag; +import com.xboe.module.course.service.*; import com.xboe.module.course.vo.TeacherVo; import com.xboe.school.study.entity.StudyCourse; import com.xboe.school.study.service.IStudyCourseService; @@ -34,11 +36,6 @@ import com.xboe.module.course.dto.CourseTeacherDto; import com.xboe.module.course.entity.Course; import com.xboe.module.course.entity.CourseCrowd; import com.xboe.module.course.entity.CourseTeacher; -import com.xboe.module.course.service.CourseToCourseFullText; -import com.xboe.module.course.service.ICourseContentService; -import com.xboe.module.course.service.ICourseFullTextSearch; -import com.xboe.module.course.service.ICourseService; -import com.xboe.module.course.service.ICourseTeacherService; import lombok.extern.slf4j.Slf4j; @@ -63,7 +60,8 @@ public class CourseFullTextApi extends ApiBaseController{ ICourseFullTextSearch fullTextSearch; @Resource IOrganizationService organizationService; - + @Autowired + ICourseTagService courseTagService; @Resource IStudyCourseService IStudyCourseService; @@ -310,7 +308,18 @@ public class CourseFullTextApi extends ApiBaseController{ } paras.setDevice(dto.getDevice()); - + String tagIds = dto.getTags(); + if (tagIds != null && tagIds != ""){ + paras.setTags(tagIds); + }else { + String tagName = paras.getKeywords(); + if (tagName != null && tagName != ""){ + CourseTag courseTag = courseTagService.getTagByName(tagName); + if (courseTag != null){ + paras.setTags(courseTag.getId().toString()+","); + } + } + } try { //后续会根据当前用户的资源归属查询 PageList coursePageList = fullTextSearch.search(ICourseFullTextSearch.DEFAULT_INDEX_NAME,pager.getStartRow(), pager.getPageSize(),paras); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index d3e347a9..969a327c 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -4,6 +4,7 @@ import com.xboe.common.OrderCondition; import com.xboe.common.PageList; import com.xboe.core.SysConstant; import com.xboe.core.orm.BaseDao; +import com.xboe.core.orm.FieldFilters; import com.xboe.core.orm.IFieldFilter; import com.xboe.core.orm.IQuery; import com.xboe.module.course.entity.Course; @@ -96,4 +97,9 @@ public class CourseTagDao extends BaseDao { javax.persistence.Query query = entityManager.createNativeQuery(sql, CourseTag.class); return query.getResultList(); } + + public CourseTag getTagByName(String tagName) { + CourseTag courseTag = this.findOne((FieldFilters.eq("tag_name", tagName))); + return courseTag; + } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java index c06832b1..b63679db 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java @@ -80,4 +80,13 @@ public interface ICourseTagService { * @return */ List getHotTagList(CourseTagRelationDto courseTagRelationDto); + + /** + * 根据多个id获取标签 + * @param id + * @return + */ + List getTagsByIds(String id); + + CourseTag getTagByName(String tagName); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index 90aa625a..fdc7a18d 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -218,6 +218,12 @@ public class CourseTagServiceImpl implements ICourseTagService { return courseTag; } + @Override + public CourseTag getTagByName(String tagName) { + CourseTag courseTag = courseTagDao.getTagByName(tagName); + return courseTag; + } + @Override public List getTagsByIds(String id) { // id=17,18 From 6a04e5d58c2a312d89839329c8856d6f605af667 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Fri, 22 Aug 2025 15:11:14 +0800 Subject: [PATCH 08/29] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E6=9F=A5=E8=AF=A2=E4=B8=8D=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E6=96=B0=E5=BB=BA=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CourseManageApi.java | 29 +++++++------------ .../service/impl/CourseTagServiceImpl.java | 2 +- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java index 6e517c90..a7143440 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java @@ -9,6 +9,8 @@ import javax.servlet.http.HttpServletResponse; import com.xboe.api.ThirdApi; import com.xboe.module.course.dto.*; +import com.xboe.module.course.entity.*; +import com.xboe.module.course.service.*; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -28,19 +30,6 @@ import com.xboe.data.dto.UserOrgIds; import com.xboe.data.outside.IOutSideDataService; import com.xboe.data.service.IDataUserSyncService; import com.xboe.module.assistance.service.IEmailService; -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.CourseHRBPAudit; -import com.xboe.module.course.entity.CourseSection; -import com.xboe.module.course.entity.CourseTeacher; -import com.xboe.module.course.entity.CourseUpdateLog; -import com.xboe.module.course.service.ICourseContentService; -import com.xboe.module.course.service.ICourseCrowdService; -import com.xboe.module.course.service.ICourseHRBPAuditService; -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.excel.ExportsExcelSenderUtil; import com.xboe.standard.enums.BoedxContentType; import com.xboe.standard.enums.BoedxCourseType; @@ -91,10 +80,10 @@ public class CourseManageApi extends ApiBaseController{ @Resource private ICourseHRBPAuditService hrbpAuditService; - + @Resource + private ICourseTagService tagService; @Resource IOutSideDataService outSideDataService; - @Autowired IDataUserSyncService userSyncService; @Resource @@ -169,14 +158,18 @@ public class CourseManageApi extends ApiBaseController{ List sectionlist=sectionService.getByCourseId(id); List teachers=courseService.findTeachersByCourseId(id); List crowds=courseService.findCrowdByCourseId(id); - - // + if (StringUtils.isNotBlank(course.getTags())){ + List tagList = tagService.getTagsByIds(course.getTags()); + rs.put("tagList", tagList); + } + + rs.put("course",course); rs.put("contents",cclist); rs.put("sections",sectionlist); rs.put("teachers",teachers); rs.put("crowds",crowds); - + return success(rs); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index fdc7a18d..b7534035 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -180,11 +180,11 @@ public class CourseTagServiceImpl implements ICourseTagService { courseTagRelation.setCourseId(courseId); courseTagRelationDao.save(courseTagRelation); }else {//1.2 否则修改标签 + courseTag=courseTagList.get(0); // 当同一标签被3个及以上课管创建时,默认开启这个标签的公共化 if(courseTagList.get(0).getUseCount() >= 3){ courseTag.setIsPublic(true); } - courseTag=courseTagList.get(0); courseTag.setDeleted(false);//有可能是之前被删除的标签,这里恢复为有效 //查找改课程与这个标签是否已经建立关联关系 query=QueryBuilder.from(CourseTagRelation.class); From acb58cf9d64e8276cf68fc6c300c3a05c76da463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Wed, 27 Aug 2025 17:03:37 +0800 Subject: [PATCH 09/29] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E4=B8=8D=E5=BC=80=E5=90=AF=E5=85=AC=E5=85=B1=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/service/impl/CourseTagServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index b7534035..f8db2c5d 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -182,7 +182,7 @@ public class CourseTagServiceImpl implements ICourseTagService { }else {//1.2 否则修改标签 courseTag=courseTagList.get(0); // 当同一标签被3个及以上课管创建时,默认开启这个标签的公共化 - if(courseTagList.get(0).getUseCount() >= 3){ + if(courseTag.getUseCount() >= 3){ courseTag.setIsPublic(true); } courseTag.setDeleted(false);//有可能是之前被删除的标签,这里恢复为有效 From 4d320ea855016ca17b6b6ef79a682d2ea2a1b880 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Tue, 2 Sep 2025 13:34:57 +0800 Subject: [PATCH 10/29] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=BA=E5=B0=91tags?= =?UTF-8?q?=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/module/course/dto/CourseQueryDto.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseQueryDto.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseQueryDto.java index 5829d723..f4a1fb66 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseQueryDto.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dto/CourseQueryDto.java @@ -1,5 +1,6 @@ package com.xboe.module.course.dto; +import com.xboe.module.course.entity.CourseTag; import lombok.Data; import java.util.List; @@ -140,4 +141,6 @@ public class CourseQueryDto { */ private String userId; + private String tags; + } From 95d1b9071753e1350a6195322866247c20eed445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Fri, 12 Sep 2025 10:07:37 +0800 Subject: [PATCH 11/29] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E8=AF=BE=E7=A8=8B=E7=B1=BB=E5=9E=8B=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E5=AF=B9=E5=BA=94=E7=9A=84=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/dao/CourseTagDao.java | 46 +++++++++---------- .../service/impl/CourseTagServiceImpl.java | 4 +- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index 969a327c..aa95c17b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -62,33 +62,29 @@ public class CourseTagDao extends BaseDao { * @return 热门标签列表 */ public List getHotTagListBySysTypes(String sysType1, String sysType2, String sysType3) { + // 原生SQL:注意表名和列名需与数据库实际一致(此处假设表名为course_tag、course_type_tag_relation) + String sql = "SELECT DISTINCT c.* FROM boe_course_tag c " + + "JOIN boe_course_type_tag_relation r ON c.id = r.tag_id " + + "WHERE r.deleted = 0 " + + "AND c.is_hot = true "; // 假设数据库字段为is_hot(与实体属性isHot对应) if (StringUtils.isNotBlank(sysType1)){ - // 原生SQL:注意表名和列名需与数据库实际一致(此处假设表名为course_tag、course_type_tag_relation) - String sql = "SELECT c.* FROM boe_course_tag c " + - "JOIN boe_course_type_tag_relation r ON c.id = r.tag_id " + - "WHERE r.deleted = 0 " + - "AND c.is_hot = true " + // 假设数据库字段为is_hot(与实体属性isHot对应) - "AND r.sys_type1 = ?1 " + - "AND r.sys_type2 = ?2 " + - "AND r.sys_type3 = ?3 " + - "ORDER BY c.last_set_hot_time DESC"; // 假设数据库字段为last_set_hot_time - - // 创建原生查询并指定结果映射到CourseTag实体 - javax.persistence.Query query = entityManager.createNativeQuery(sql, CourseTag.class); - - // 绑定参数(注意参数索引从1开始) - query.setParameter(1, sysType1); - query.setParameter(2, StringUtils.isNotBlank(sysType2)?sysType2:"0"); - query.setParameter(3, StringUtils.isNotBlank(sysType3)?sysType3:"0"); - - // 分页:取前10条 - query.setFirstResult(0); - query.setMaxResults(10); - - // 执行查询并返回结果(已映射为CourseTag类型) - return query.getResultList(); + sql += "AND r.sys_type1 = ?1 ORDER BY c.last_set_hot_time DESC"; + }else if(StringUtils.isNotBlank(sysType2)){ + sql += "AND r.sys_type2 = ?1 ORDER BY c.last_set_hot_time DESC"; + }else { + sql += "AND r.sys_type3 = ?1 ORDER BY c.last_set_hot_time DESC"; } - return null; + // 创建原生查询并指定结果映射到CourseTag实体 + javax.persistence.Query query = entityManager.createNativeQuery(sql, CourseTag.class); + + // 绑定参数(注意参数索引从1开始) + query.setParameter(1, sysType1); + // 分页:取前10条 + query.setFirstResult(0); + query.setMaxResults(10); + + // 执行查询并返回结果(已映射为CourseTag类型) + return query.getResultList(); } public List getTagsByIds(String id) { diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index f8db2c5d..cb5b4d5b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -239,7 +239,9 @@ public class CourseTagServiceImpl implements ICourseTagService { @Override public List getHotTagList(CourseTagRelationDto courseTagRelationDto) { List hotTagList = null; - if (StringUtils.isNotBlank(courseTagRelationDto.getSysType1())){ + if (StringUtils.isNotBlank(courseTagRelationDto.getSysType1()) || + StringUtils.isNotBlank(courseTagRelationDto.getSysType2()) || + StringUtils.isNotBlank(courseTagRelationDto.getSysType3())){ String sysType1 = courseTagRelationDto.getSysType1(); String sysType2 = courseTagRelationDto.getSysType2(); String sysType3 = courseTagRelationDto.getSysType3(); From e7036e04b0589f497e5213a374434308e40175f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Fri, 12 Sep 2025 11:13:31 +0800 Subject: [PATCH 12/29] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=B8=89=E7=BA=A7=E5=88=86=E7=B1=BB=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E4=B8=8D=E5=88=B0=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/module/course/dao/CourseTagDao.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index aa95c17b..c8516994 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -78,7 +78,13 @@ public class CourseTagDao extends BaseDao { javax.persistence.Query query = entityManager.createNativeQuery(sql, CourseTag.class); // 绑定参数(注意参数索引从1开始) - query.setParameter(1, sysType1); + if (StringUtils.isNotBlank(sysType1)){ + query.setParameter(1, sysType1); + } else if (StringUtils.isNotBlank(sysType2)) { + query.setParameter(1, sysType2); + }else { + query.setParameter(1, sysType3); + } // 分页:取前10条 query.setFirstResult(0); query.setMaxResults(10); From 8c02b777248619c34deddc9228b66ccf804c526b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=8D=93=E7=85=9C?= <2210102150@qq.com> Date: Tue, 16 Sep 2025 13:51:52 +0800 Subject: [PATCH 13/29] =?UTF-8?q?=E6=A0=87=E7=AD=BE=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E8=A7=A3=E7=BB=91=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/CourseToCourseFullText.java | 1 + .../service/impl/CourseTagServiceImpl.java | 27 ++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/CourseToCourseFullText.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/CourseToCourseFullText.java index 09bb6716..5d4ac75c 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/CourseToCourseFullText.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/CourseToCourseFullText.java @@ -52,6 +52,7 @@ public class CourseToCourseFullText { cft.setTeacher(""); cft.setTeacherCode(""); cft.setType(c.getType()); + cft.setTags(c.getTags()); if(c.getOpenCourse()==null) { cft.setOpenCourse(0); }else { diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index cb5b4d5b..fc70f239 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -5,13 +5,16 @@ import com.xboe.common.PageList; import com.xboe.core.orm.FieldFilters; import com.xboe.core.orm.IFieldFilter; import com.xboe.core.orm.QueryBuilder; +import com.xboe.module.course.dao.CourseDao; import com.xboe.module.course.dao.CourseTagDao; import com.xboe.module.course.dao.CourseTagRelationDao; import com.xboe.module.course.dao.CourseTypeTagRelationDao; import com.xboe.module.course.dto.CourseTagRelationDto; +import com.xboe.module.course.entity.Course; import com.xboe.module.course.entity.CourseTag; import com.xboe.module.course.entity.CourseTagRelation; import com.xboe.module.course.entity.CourseTypeTagRelation; +import com.xboe.module.course.service.ICourseService; import com.xboe.module.course.service.ICourseTagService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -33,12 +36,15 @@ public class CourseTagServiceImpl implements ICourseTagService { @Resource private CourseTagDao courseTagDao; - + @Resource + PublishCourseUtil publishUtil; @Resource private CourseTagRelationDao courseTagRelationDao; @Resource private CourseTypeTagRelationDao courseTypeTagRelationDao; + @Resource + private CourseDao courseDao; /** * 课程标签分页查询 @@ -131,6 +137,25 @@ public class CourseTagServiceImpl implements ICourseTagService { } //解绑(删除关联关系) courseTagRelationDao.setDeleted(id); + Course course = courseDao.get(courseTagRelation.getCourseId().toString()); + String tags = course.getTags(); + if (StringUtils.isNotBlank(tags)){ + String[] tagIds = tags.split(","); + List tagIdList = new ArrayList<>(); + for (String tagId : tagIds){ + if (!tagId.equals(courseTagRelation.getTagId().toString())){ + tagIdList.add(tagId); + } + } + // 数据格式:1,2,3 + String s = StringUtils.join(tagIdList, ","); + if (!"".equals(s)){ + s+=","; + } + course.setTags(s); + } + // 同步ES + publishUtil.fullTextPublish(course); } } From 0819502afaf98b16dbcb08dfba0a6dc31c69631a Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Wed, 29 Oct 2025 15:40:58 +0800 Subject: [PATCH 14/29] =?UTF-8?q?searchTags=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/api/CourseTagApi.java | 22 +++++-- .../xboe/module/course/dao/CourseTagDao.java | 62 +++++++++++++++++++ .../course/service/ICourseTagService.java | 2 +- .../service/impl/CourseTagServiceImpl.java | 7 ++- 4 files changed, 85 insertions(+), 8 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java index b57826e0..e8263cc1 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java @@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; @@ -45,7 +46,7 @@ public class CourseTagApi extends ApiBaseController { * @param courseTagQueryDto * @return */ - @RequestMapping(value="/page",method= {RequestMethod.GET,RequestMethod.POST}) + /* @RequestMapping(value="/page",method= {RequestMethod.GET,RequestMethod.POST}) public JsonResponse> find(Pagination pager, CourseTagQueryDto courseTagQueryDto){ List filters=new ArrayList(); OrderCondition order = null; @@ -79,18 +80,20 @@ public class CourseTagApi extends ApiBaseController { PageList list=courseTagService.query(pager.getPageIndex(),pager.getPageSize(),filters,order); return success(list); } - +*/ /** * 修改指定id的课程标签的公共属性 * @param id * @param isPublic * @return */ +/* @RequestMapping(value="/changePublicStatus",method= RequestMethod.POST) public JsonResponse changePublicStatus(Long id,Boolean isPublic){ courseTagService.changePublicStatus(id,isPublic); return success(null); } +*/ /** * 修改指定id的课程标签的热点属性 @@ -98,17 +101,18 @@ public class CourseTagApi extends ApiBaseController { * @param isHot * @return */ - @RequestMapping(value="/changeHotStatus",method= RequestMethod.POST) +/* @RequestMapping(value="/changeHotStatus",method= RequestMethod.POST) public JsonResponse changeHotStatus(Long id,Boolean isHot){ courseTagService.changeHotStatus(id,isHot); return success(null); - } + }*/ /** * 分页查询:指定id的标签关联的所有课程 * @param courseTagQueryDto * @return */ +/* @RequestMapping(value="/showCourseByTag",method= RequestMethod.POST) public JsonResponse> showCourseByTag(Pagination pager, CourseTagQueryDto courseTagQueryDto){ PageList list=null; @@ -119,11 +123,13 @@ public class CourseTagApi extends ApiBaseController { } return success(list); } +*/ /** * 解除指定id的课程和某个标签之间的关联关系 * @return */ +/* @RequestMapping(value="/unbind",method= RequestMethod.POST) public JsonResponse unbindCourseTagRelation(CourseTagRelationDto courseTagRelationDto){ if (courseTagRelationDto!=null){ @@ -132,15 +138,19 @@ public class CourseTagApi extends ApiBaseController { } return error("解绑失败!"); } +*/ /** * 模糊检索标签 * @return 符合检索条件的所有公共标签 */ @RequestMapping(value="/searchTags",method= RequestMethod.POST) - public JsonResponse> searchTags(String tagName){ + public JsonResponse> searchTags(String tagName,String typeId ,HttpServletRequest request){ + + CurrentUser cuser = getCurrent(); + String aid = cuser.getAccountId(); if (StringUtils.isNotBlank(tagName)){ - List courseTagList = courseTagService.searchTags(tagName); + List courseTagList = courseTagService.searchTags(tagName,aid,typeId); return success(courseTagList); } return error("服务器端异常!"); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index c8516994..306690ea 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -104,4 +104,66 @@ public class CourseTagDao extends BaseDao { CourseTag courseTag = this.findOne((FieldFilters.eq("tag_name", tagName))); return courseTag; } + + public List searchTags(String tagName, String userId, String typeId) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT id, tag_name, sys_create_time "); + sql.append("FROM ( "); + sql.append(" -- 第一个查询:非公开标签 "); + sql.append(" SELECT id, tag_name, sys_create_time "); + sql.append(" FROM boe_course_tag "); + sql.append(" WHERE deleted = 0 AND is_public = 0 "); + + if (StringUtils.isNotBlank(tagName)) { + sql.append(" AND tag_name LIKE '%").append(tagName).append("%' "); + } + + sql.append(" UNION ALL "); + sql.append(" -- 第二个查询:公开标签 "); + sql.append(" SELECT t.id, t.tag_name, t.sys_create_time "); + sql.append(" FROM boe_course_tag_relation r "); + sql.append(" INNER JOIN boe_course_tag t ON r.tag_id = t.id "); + sql.append(" WHERE r.deleted = 0 AND t.deleted = 0 AND t.is_public = 1 "); + sql.append(" AND r.sys_create_aid = ? "); + + if (StringUtils.isNotBlank(tagName)) { + sql.append(" AND t.tag_name LIKE '%").append(tagName).append("%' "); + } + + sql.append(" GROUP BY t.id, t.tag_name, t.sys_create_time "); + sql.append(") AS all_tags "); + sql.append("ORDER BY "); + + // 根据typeId参数决定是否执行特殊排序 + if (StringUtils.isNotBlank(typeId)) { + sql.append(" -- 第一排序:指定tag_id在前列 "); + sql.append(" CASE WHEN id IN ( "); + sql.append(" SELECT tag_id "); + sql.append(" FROM boe_course_type_tag_relation "); + sql.append(" WHERE deleted = 0 "); + sql.append(" AND (sys_type1 = ? "); + sql.append(" OR sys_type2 = ? "); + sql.append(" OR sys_type3 = ?) "); + sql.append(" GROUP BY tag_id "); + sql.append(" ) THEN 0 ELSE 1 END, "); + } + + sql.append(" -- 第二排序:按创建时间倒序 "); + sql.append(" sys_create_time DESC"); + + javax.persistence.Query query = entityManager.createNativeQuery(sql.toString(), CourseTag.class); + query.setParameter(1, Long.valueOf(userId)); + + // 如果typeId不为空,设置额外的参数 + if (StringUtils.isNotBlank(typeId)) { + query.setParameter(2, Long.valueOf(typeId)); + query.setParameter(3, Long.valueOf(typeId)); + query.setParameter(4, Long.valueOf(typeId)); + } + + return query.getResultList(); + } + + + } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java index b63679db..41e0abbd 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java @@ -65,7 +65,7 @@ public interface ICourseTagService { * @param tagName * @return 符合检索条件的所有公共标签 */ - List searchTags(String tagName); + List searchTags(String tagName,String userId,String typeId); /** * 创建新标签,并与当前课程绑定 diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index fc70f239..543e54ca 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -164,7 +164,6 @@ public class CourseTagServiceImpl implements ICourseTagService { * @param tagName * @return 符合检索条件的所有公共标签 */ - @Override public List searchTags(String tagName){ QueryBuilder query=QueryBuilder.from(CourseTag.class); List filters = new ArrayList<>(); @@ -176,6 +175,12 @@ public class CourseTagServiceImpl implements ICourseTagService { return courseTagList; } + @Override + public List searchTags(String tagName,String userId,String typeId){ + List tagList = courseTagDao.searchTags(tagName,userId,typeId); + return tagList; + } + /** * 创建新标签,并与指定课程绑定 * @param courseTagRelationDto From c7c92a31733477533670fd570316ebf83451a448 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Wed, 29 Oct 2025 15:58:01 +0800 Subject: [PATCH 15/29] =?UTF-8?q?searchTags=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/api/CourseTagApi.java | 1 + .../xboe/module/course/dao/CourseTagDao.java | 139 +++++++++++------- 2 files changed, 84 insertions(+), 56 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java index e8263cc1..a34e9f5c 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java @@ -149,6 +149,7 @@ public class CourseTagApi extends ApiBaseController { CurrentUser cuser = getCurrent(); String aid = cuser.getAccountId(); + log.info(" searchTags aid = " + aid); if (StringUtils.isNotBlank(tagName)){ List courseTagList = courseTagService.searchTags(tagName,aid,typeId); return success(courseTagList); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index 306690ea..1ca058d6 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -10,6 +10,7 @@ import com.xboe.core.orm.IQuery; import com.xboe.module.course.entity.Course; import com.xboe.module.course.entity.CourseFile; import com.xboe.module.course.entity.CourseTag; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.stereotype.Repository; @@ -17,6 +18,7 @@ import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; +import java.util.ArrayList; import java.util.List; /** @@ -24,6 +26,8 @@ import java.util.List; * @author:zhengge@oracle.com * @since:2025/7/2516:50 */ + +@Slf4j @Repository public class CourseTagDao extends BaseDao { @PersistenceContext @@ -105,65 +109,88 @@ public class CourseTagDao extends BaseDao { return courseTag; } - public List searchTags(String tagName, String userId, String typeId) { - StringBuilder sql = new StringBuilder(); - sql.append("SELECT id, tag_name, sys_create_time "); - sql.append("FROM ( "); - sql.append(" -- 第一个查询:非公开标签 "); - sql.append(" SELECT id, tag_name, sys_create_time "); - sql.append(" FROM boe_course_tag "); - sql.append(" WHERE deleted = 0 AND is_public = 0 "); + public PageList getList() { + log.info("------- getList ----------- "); + String sql = "select * from boe_course_tag order by sys_create_time desc limit 10"; + javax.persistence.Query query = entityManager.createNativeQuery(sql, CourseTag.class); + log.info("------- getList -----------getResultList = " + query.getResultList() ); + PageList pageList = new PageList<>(); + pageList.setCount(query.getResultList().size()); + pageList.setPageSize(1); + pageList.setList(query.getResultList()); - if (StringUtils.isNotBlank(tagName)) { - sql.append(" AND tag_name LIKE '%").append(tagName).append("%' "); - } - - sql.append(" UNION ALL "); - sql.append(" -- 第二个查询:公开标签 "); - sql.append(" SELECT t.id, t.tag_name, t.sys_create_time "); - sql.append(" FROM boe_course_tag_relation r "); - sql.append(" INNER JOIN boe_course_tag t ON r.tag_id = t.id "); - sql.append(" WHERE r.deleted = 0 AND t.deleted = 0 AND t.is_public = 1 "); - sql.append(" AND r.sys_create_aid = ? "); - - if (StringUtils.isNotBlank(tagName)) { - sql.append(" AND t.tag_name LIKE '%").append(tagName).append("%' "); - } - - sql.append(" GROUP BY t.id, t.tag_name, t.sys_create_time "); - sql.append(") AS all_tags "); - sql.append("ORDER BY "); - - // 根据typeId参数决定是否执行特殊排序 - if (StringUtils.isNotBlank(typeId)) { - sql.append(" -- 第一排序:指定tag_id在前列 "); - sql.append(" CASE WHEN id IN ( "); - sql.append(" SELECT tag_id "); - sql.append(" FROM boe_course_type_tag_relation "); - sql.append(" WHERE deleted = 0 "); - sql.append(" AND (sys_type1 = ? "); - sql.append(" OR sys_type2 = ? "); - sql.append(" OR sys_type3 = ?) "); - sql.append(" GROUP BY tag_id "); - sql.append(" ) THEN 0 ELSE 1 END, "); - } - - sql.append(" -- 第二排序:按创建时间倒序 "); - sql.append(" sys_create_time DESC"); - - javax.persistence.Query query = entityManager.createNativeQuery(sql.toString(), CourseTag.class); - query.setParameter(1, Long.valueOf(userId)); - - // 如果typeId不为空,设置额外的参数 - if (StringUtils.isNotBlank(typeId)) { - query.setParameter(2, Long.valueOf(typeId)); - query.setParameter(3, Long.valueOf(typeId)); - query.setParameter(4, Long.valueOf(typeId)); - } - - return query.getResultList(); + return pageList; } + public List searchTags(String tagName, String userId, String typeId) { + StringBuilder sql = new StringBuilder(); + List parameters = new ArrayList<>(); + + sql.append("SELECT id, tag_name, sys_create_time "); + sql.append("FROM ( "); + // 第一个查询:非公开标签 + sql.append(" SELECT id, tag_name, sys_create_time "); + sql.append(" FROM boe_course_tag "); + sql.append(" WHERE deleted = 0 AND is_public = 0 "); + + if (StringUtils.isNotBlank(tagName)) { + sql.append(" AND tag_name LIKE ? "); + parameters.add("%" + tagName + "%"); + } + + sql.append(" UNION ALL "); + // 第二个查询:公开标签 + sql.append(" SELECT t.id, t.tag_name, t.sys_create_time "); + sql.append(" FROM boe_course_tag_relation r "); + sql.append(" INNER JOIN boe_course_tag t ON r.tag_id = t.id "); + sql.append(" WHERE r.deleted = 0 AND t.deleted = 0 AND t.is_public = 1 "); + + if (StringUtils.isNotBlank(userId)) { + sql.append(" AND r.sys_create_aid = ? "); + parameters.add(Long.valueOf(userId)); + } + + if (StringUtils.isNotBlank(tagName)) { + sql.append(" AND t.tag_name LIKE ? "); + parameters.add("%" + tagName + "%"); + } + + sql.append(" GROUP BY t.id, t.tag_name, t.sys_create_time "); + sql.append(") AS all_tags "); + sql.append("ORDER BY "); + + // 根据typeId参数决定是否执行特殊排序 + if (StringUtils.isNotBlank(typeId)) { + // 第一排序:指定tag_id在前列 + sql.append(" CASE WHEN id IN ( "); + sql.append(" SELECT tag_id "); + sql.append(" FROM boe_course_type_tag_relation "); + sql.append(" WHERE deleted = 0 "); + sql.append(" AND (sys_type1 = ? "); + sql.append(" OR sys_type2 = ? "); + sql.append(" OR sys_type3 = ?) "); + sql.append(" GROUP BY tag_id "); + sql.append(" ) THEN 0 ELSE 1 END, "); + + parameters.add(Long.valueOf(typeId)); + parameters.add(Long.valueOf(typeId)); + parameters.add(Long.valueOf(typeId)); + } + + // 第二排序:按创建时间倒序 + sql.append(" sys_create_time DESC"); + + javax.persistence.Query query = entityManager.createNativeQuery(sql.toString(), CourseTag.class); + + // 设置所有参数 + for (int i = 0; i < parameters.size(); i++) { + query.setParameter(i + 1, parameters.get(i)); + } + + return query.getResultList(); +} + + } From 5d3745680afd139f4faa7db7b1a17a5cd34b91fe Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Wed, 29 Oct 2025 16:17:58 +0800 Subject: [PATCH 16/29] =?UTF-8?q?searchTags=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/xboe/module/course/dao/CourseTagDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index 1ca058d6..aa8d6b3b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -126,7 +126,7 @@ public class CourseTagDao extends BaseDao { StringBuilder sql = new StringBuilder(); List parameters = new ArrayList<>(); - sql.append("SELECT id, tag_name, sys_create_time "); + sql.append("SELECT id, tag_name "); sql.append("FROM ( "); // 第一个查询:非公开标签 sql.append(" SELECT id, tag_name, sys_create_time "); From 448bc0f1e4ba4df083cfb830ee98b68e23740ce5 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Wed, 29 Oct 2025 16:29:15 +0800 Subject: [PATCH 17/29] =?UTF-8?q?searchTags=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/dao/CourseTagDao.java | 122 +++++++++--------- 1 file changed, 59 insertions(+), 63 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index aa8d6b3b..2a5249f5 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -122,73 +122,69 @@ public class CourseTagDao extends BaseDao { return pageList; } - public List searchTags(String tagName, String userId, String typeId) { - StringBuilder sql = new StringBuilder(); - List parameters = new ArrayList<>(); + public List searchTags(String tagName, String userId, String typeId) { + StringBuilder sql = new StringBuilder(); + List parameters = new ArrayList<>(); - sql.append("SELECT id, tag_name "); - sql.append("FROM ( "); - // 第一个查询:非公开标签 - sql.append(" SELECT id, tag_name, sys_create_time "); - sql.append(" FROM boe_course_tag "); - sql.append(" WHERE deleted = 0 AND is_public = 0 "); + // 查询所有必要字段,保持两个UNION查询字段一致 + sql.append("SELECT id, tag_name, sys_create_time, is_public, is_hot, last_set_hot_time, deleted, sys_create_aid, sys_update_aid, sys_update_time "); + sql.append("FROM ( "); + sql.append(" SELECT id, tag_name, sys_create_time, is_public, is_hot, last_set_hot_time, deleted, sys_create_aid, sys_update_aid, sys_update_time "); + sql.append(" FROM boe_course_tag "); + sql.append(" WHERE deleted = 0 AND is_public = 0 "); - if (StringUtils.isNotBlank(tagName)) { - sql.append(" AND tag_name LIKE ? "); - parameters.add("%" + tagName + "%"); + if (StringUtils.isNotBlank(tagName)) { + sql.append(" AND tag_name LIKE ? "); + parameters.add("%" + tagName + "%"); + } + + sql.append(" UNION ALL "); + sql.append(" SELECT t.id, t.tag_name, t.sys_create_time, t.is_public, t.is_hot, t.last_set_hot_time, t.deleted, t.sys_create_aid, t.sys_update_aid, t.sys_update_time "); + sql.append(" FROM boe_course_tag_relation r "); + sql.append(" INNER JOIN boe_course_tag t ON r.tag_id = t.id "); + sql.append(" WHERE r.deleted = 0 AND t.deleted = 0 AND t.is_public = 1 "); + + if (StringUtils.isNotBlank(userId)) { + sql.append(" AND r.sys_create_aid = ? "); + parameters.add(Long.valueOf(userId)); + } + + if (StringUtils.isNotBlank(tagName)) { + sql.append(" AND t.tag_name LIKE ? "); + parameters.add("%" + tagName + "%"); + } + + // 保留GROUP BY以避免重复数据,但确保SELECT字段与GROUP BY字段一致 + sql.append(" GROUP BY t.id, t.tag_name, t.sys_create_time, t.is_public, t.is_hot, t.last_set_hot_time, t.deleted, t.sys_create_aid, t.sys_update_aid, t.sys_update_time "); + sql.append(") AS all_tags "); + sql.append("ORDER BY "); + + if (StringUtils.isNotBlank(typeId)) { + sql.append(" CASE WHEN id IN ( "); + sql.append(" SELECT tag_id "); + sql.append(" FROM boe_course_type_tag_relation "); + sql.append(" WHERE deleted = 0 "); + sql.append(" AND (sys_type1 = ? "); + sql.append(" OR sys_type2 = ? "); + sql.append(" OR sys_type3 = ?) "); + sql.append(" GROUP BY tag_id "); // 内部查询仍需要GROUP BY + sql.append(" ) THEN 0 ELSE 1 END, "); + parameters.add(Long.valueOf(typeId)); + parameters.add(Long.valueOf(typeId)); + parameters.add(Long.valueOf(typeId)); + } + + sql.append(" sys_create_time DESC"); + + javax.persistence.Query query = entityManager.createNativeQuery(sql.toString(), CourseTag.class); + + for (int i = 0; i < parameters.size(); i++) { + query.setParameter(i + 1, parameters.get(i)); + } + + return query.getResultList(); } - sql.append(" UNION ALL "); - // 第二个查询:公开标签 - sql.append(" SELECT t.id, t.tag_name, t.sys_create_time "); - sql.append(" FROM boe_course_tag_relation r "); - sql.append(" INNER JOIN boe_course_tag t ON r.tag_id = t.id "); - sql.append(" WHERE r.deleted = 0 AND t.deleted = 0 AND t.is_public = 1 "); - - if (StringUtils.isNotBlank(userId)) { - sql.append(" AND r.sys_create_aid = ? "); - parameters.add(Long.valueOf(userId)); - } - - if (StringUtils.isNotBlank(tagName)) { - sql.append(" AND t.tag_name LIKE ? "); - parameters.add("%" + tagName + "%"); - } - - sql.append(" GROUP BY t.id, t.tag_name, t.sys_create_time "); - sql.append(") AS all_tags "); - sql.append("ORDER BY "); - - // 根据typeId参数决定是否执行特殊排序 - if (StringUtils.isNotBlank(typeId)) { - // 第一排序:指定tag_id在前列 - sql.append(" CASE WHEN id IN ( "); - sql.append(" SELECT tag_id "); - sql.append(" FROM boe_course_type_tag_relation "); - sql.append(" WHERE deleted = 0 "); - sql.append(" AND (sys_type1 = ? "); - sql.append(" OR sys_type2 = ? "); - sql.append(" OR sys_type3 = ?) "); - sql.append(" GROUP BY tag_id "); - sql.append(" ) THEN 0 ELSE 1 END, "); - - parameters.add(Long.valueOf(typeId)); - parameters.add(Long.valueOf(typeId)); - parameters.add(Long.valueOf(typeId)); - } - - // 第二排序:按创建时间倒序 - sql.append(" sys_create_time DESC"); - - javax.persistence.Query query = entityManager.createNativeQuery(sql.toString(), CourseTag.class); - - // 设置所有参数 - for (int i = 0; i < parameters.size(); i++) { - query.setParameter(i + 1, parameters.get(i)); - } - - return query.getResultList(); -} From 46fefd3fe05ebe8028b3cf2e28f506008568d552 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Wed, 29 Oct 2025 17:20:18 +0800 Subject: [PATCH 18/29] =?UTF-8?q?searchTags=E8=B0=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/dao/CourseTagDao.java | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index 2a5249f5..0f262a3d 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -126,10 +126,10 @@ public class CourseTagDao extends BaseDao { StringBuilder sql = new StringBuilder(); List parameters = new ArrayList<>(); - // 查询所有必要字段,保持两个UNION查询字段一致 - sql.append("SELECT id, tag_name, sys_create_time, is_public, is_hot, last_set_hot_time, deleted, sys_create_aid, sys_update_aid, sys_update_time "); + // 只查询实际存在的字段 + sql.append("SELECT id, tag_name, is_public, is_hot, use_count, last_set_public_time, last_set_hot_time, deleted, sys_create_time "); sql.append("FROM ( "); - sql.append(" SELECT id, tag_name, sys_create_time, is_public, is_hot, last_set_hot_time, deleted, sys_create_aid, sys_update_aid, sys_update_time "); + sql.append(" SELECT id, tag_name, is_public, is_hot, use_count, last_set_public_time, last_set_hot_time, deleted, sys_create_time "); sql.append(" FROM boe_course_tag "); sql.append(" WHERE deleted = 0 AND is_public = 0 "); @@ -139,7 +139,7 @@ public class CourseTagDao extends BaseDao { } sql.append(" UNION ALL "); - sql.append(" SELECT t.id, t.tag_name, t.sys_create_time, t.is_public, t.is_hot, t.last_set_hot_time, t.deleted, t.sys_create_aid, t.sys_update_aid, t.sys_update_time "); + sql.append(" SELECT t.id, t.tag_name, t.is_public, t.is_hot, t.use_count, t.last_set_public_time, t.last_set_hot_time, t.deleted, t.sys_create_time "); sql.append(" FROM boe_course_tag_relation r "); sql.append(" INNER JOIN boe_course_tag t ON r.tag_id = t.id "); sql.append(" WHERE r.deleted = 0 AND t.deleted = 0 AND t.is_public = 1 "); @@ -154,8 +154,7 @@ public class CourseTagDao extends BaseDao { parameters.add("%" + tagName + "%"); } - // 保留GROUP BY以避免重复数据,但确保SELECT字段与GROUP BY字段一致 - sql.append(" GROUP BY t.id, t.tag_name, t.sys_create_time, t.is_public, t.is_hot, t.last_set_hot_time, t.deleted, t.sys_create_aid, t.sys_update_aid, t.sys_update_time "); + sql.append(" GROUP BY t.id, t.tag_name, t.is_public, t.is_hot, t.use_count, t.last_set_public_time, t.last_set_hot_time, t.deleted, t.sys_create_time "); sql.append(") AS all_tags "); sql.append("ORDER BY "); @@ -167,7 +166,7 @@ public class CourseTagDao extends BaseDao { sql.append(" AND (sys_type1 = ? "); sql.append(" OR sys_type2 = ? "); sql.append(" OR sys_type3 = ?) "); - sql.append(" GROUP BY tag_id "); // 内部查询仍需要GROUP BY + sql.append(" GROUP BY tag_id "); sql.append(" ) THEN 0 ELSE 1 END, "); parameters.add(Long.valueOf(typeId)); parameters.add(Long.valueOf(typeId)); @@ -176,13 +175,34 @@ public class CourseTagDao extends BaseDao { sql.append(" sys_create_time DESC"); - javax.persistence.Query query = entityManager.createNativeQuery(sql.toString(), CourseTag.class); + // 不使用实体类映射,手动处理结果集 + Query query = entityManager.createNativeQuery(sql.toString()); for (int i = 0; i < parameters.size(); i++) { query.setParameter(i + 1, parameters.get(i)); } - return query.getResultList(); + @SuppressWarnings("unchecked") + List results = query.getResultList(); + List courseTags = new ArrayList<>(); + + for (Object[] result : results) { + CourseTag tag = new CourseTag(); + // 设置基本字段 + if (result[0] != null) tag.setId(String.valueOf(result[0])); + if (result[1] != null) tag.setTagName(String.valueOf(result[1])); + if (result[2] != null) tag.setIsPublic(Boolean.valueOf(String.valueOf(result[2]))); + if (result[3] != null) tag.setIsHot(Boolean.valueOf(String.valueOf(result[3]))); + if (result[4] != null) tag.setUseCount(Integer.valueOf(String.valueOf(result[4]))); +// if (result[5] != null) tag.setLastSetPublicTime((LocalDateTime) result[5]); +// if (result[6] != null) tag.setLastSetHotTime((LocalDateTime) result[6]); +// if (result[7] != null) tag.setDeleted(Boolean.valueOf(String.valueOf(result[7]))); +// if (result[8] != null) tag.setSysCreateTime((LocalDateTime) result[8]); + + courseTags.add(tag); + } + + return courseTags; } From 15e0cedf74415c64d5e8979591934bb78c7c4665 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Thu, 30 Oct 2025 13:23:51 +0800 Subject: [PATCH 19/29] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../course/service/ICourseTagService.java | 3 + .../service/impl/CourseTagServiceImpl.java | 438 +++++++++++++++++- 2 files changed, 431 insertions(+), 10 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java index 41e0abbd..adbe7b3b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/ICourseTagService.java @@ -8,6 +8,7 @@ import com.xboe.core.orm.IFieldFilter; import com.xboe.module.article.entity.Article; import com.xboe.module.course.dto.CourseTagQueryDto; import com.xboe.module.course.dto.CourseTagRelationDto; +import com.xboe.module.course.entity.Course; import com.xboe.module.course.entity.CourseTag; import com.xboe.module.course.entity.CourseTagRelation; import org.springframework.web.bind.annotation.RequestMapping; @@ -89,4 +90,6 @@ public interface ICourseTagService { List getTagsByIds(String id); CourseTag getTagByName(String tagName); + + void updateTags(Course oldCourse,Course newCourse,CurrentUser userInfo); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index 543e54ca..d5877ee9 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -2,6 +2,8 @@ package com.xboe.module.course.service.impl; import com.xboe.common.OrderCondition; import com.xboe.common.PageList; +import com.xboe.core.CurrentUser; +import com.xboe.core.orm.BaseEntity; import com.xboe.core.orm.FieldFilters; import com.xboe.core.orm.IFieldFilter; import com.xboe.core.orm.QueryBuilder; @@ -23,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; /** * @ClassName:CourseTagServiceImpl @@ -56,17 +59,38 @@ public class CourseTagServiceImpl implements ICourseTagService { */ @Override public PageList query(Integer pageIndex, Integer pageSize, List filters, OrderCondition order) { - QueryBuilder query=QueryBuilder.from(CourseTag.class); - query.setPageIndex(pageIndex); - query.setPageSize(pageSize); - filters.add(FieldFilters.eq("deleted",false)); - query.addFilters(filters); - if(order!=null) { - query.addOrder(order); - }else { - query.addOrder(OrderCondition.desc("sysCreateTime")); + try { + /* QueryBuilder query=QueryBuilder.from(CourseTag.class); + query.setPageIndex(pageIndex); + query.setPageSize(pageSize); + filters.add(FieldFilters.eq("deleted",false)); + query.addFilters(filters); + if(order!=null) { + query.addOrder(order); + }else { + query.addOrder(OrderCondition.desc("sysCreateTime")); + } + log.info("标签列表:分页查询 调用接口IMPL query = " + query.builder().toString()); + return courseTagDao.findPage(query.builder());*/ + + if(pageSize==100){ + log.info("--- 11 ----------------------"); + return courseTagDao.getList(); + }else{ + log.info("--- 22 ----------------------"); + QueryBuilder query = QueryBuilder.from(CourseTag.class); + query.setPageIndex(pageIndex); + query.setPageSize(pageSize); + filters.add(FieldFilters.eq("deleted", false)); +// query.addFilters(filters); + query.addOrder(OrderCondition.desc("sysCreateTime")); + return courseTagDao.findPage(query.builder()); + } + + } catch (Exception e) { + log.error("课程标签分页查询异常 = " + e.getMessage()); + throw new RuntimeException(e); } - return courseTagDao.findPage(query.builder()); } /** @@ -345,4 +369,398 @@ public class CourseTagServiceImpl implements ICourseTagService { } return isExist; } + + + + + @Override + public void updateTags(Course oldCourse, Course newCourse, CurrentUser userInfo) { + log.info(" --- 标签修改 --- 在线课参数 oldCourse = " + oldCourse); + log.info(" --- 标签修改 --- 在线课参数 newCourse = " + newCourse); + log.info(" --- 标签修改 --- 用户信息 userInfo = " + userInfo); + + // 获取新旧课程的标签ID列表 + List oldTagIds = getTagIdsFromCourse(oldCourse); + List newTagIds = getTagIdsFromCourse(newCourse); + + if (oldCourse == null) { + // 新增课程 - 处理所有新标签 + handleNewCourseTags(newCourse, newTagIds, userInfo); + } else { + // 编辑课程 - 比较差异并处理 + handleEditCourseTags(oldCourse, newCourse, oldTagIds, newTagIds, userInfo); + } + } + + /** + * 从课程对象中提取标签ID列表 + */ + private List getTagIdsFromCourse(Course course) { + if (course == null || StringUtils.isBlank(course.getTags())) { + return new ArrayList<>(); + } + + String tags = course.getTags(); + // 去除结尾的逗号并分割 + if (tags.endsWith(",")) { + tags = tags.substring(0, tags.length() - 1); + } + + if (StringUtils.isBlank(tags)) { + return new ArrayList<>(); + } + + return Arrays.asList(tags.split(",")); + } + + /** + * 处理新增课程的标签逻辑 + */ + private void handleNewCourseTags(Course newCourse, List newTagIds, CurrentUser userInfo) { + String courseId = newCourse.getId(); + + for (String tagId : newTagIds) { + if (StringUtils.isBlank(tagId)) { + continue; + } + + // 获取标签信息 + CourseTag tag = courseTagDao.findOne(FieldFilters.eq("id", tagId.trim())); + if (tag == null) { + log.warn("标签不存在: {}", tagId); + continue; + } + + // 创建课程-标签关联关系 + createCourseTagRelation(courseId, tag, userInfo); + + // 创建分类-标签关联关系 + createCourseTypeTagRelations(newCourse, tag, userInfo); + + // 更新标签使用计数并检查是否设置为公共标签 + updateTagUseCountAndPublicStatus(tag, userInfo); + } + } + + /** + * 处理编辑课程的标签逻辑 + */ + private void handleEditCourseTags(Course oldCourse, Course newCourse, + List oldTagIds, List newTagIds, CurrentUser userInfo) { + String courseId = newCourse.getId(); + + // 找出需要删除的标签(存在于旧课程但不在新课程中) + List tagsToRemove = oldTagIds.stream() + .filter(tagId -> !newTagIds.contains(tagId)) + .collect(Collectors.toList()); + + // 找出需要新增的标签(存在于新课程但不在旧课程中) + List tagsToAdd = newTagIds.stream() + .filter(tagId -> !oldTagIds.contains(tagId)) + .collect(Collectors.toList()); + + // 处理标签删除 + for (String tagId : tagsToRemove) { + removeCourseTagRelation(courseId, tagId, userInfo); + } + + // 处理标签新增 + for (String tagId : tagsToAdd) { + CourseTag tag = courseTagDao.findOne(FieldFilters.eq("id", tagId.trim())); + if (tag == null) { + log.warn("标签不存在: {}", tagId); + continue; + } + + // 创建课程-标签关联关系 + createCourseTagRelation(courseId, tag, userInfo); + + // 创建分类-标签关联关系 + createCourseTypeTagRelations(newCourse, tag, userInfo); + + // 更新标签使用计数并检查是否设置为公共标签 + updateTagUseCountAndPublicStatus(tag, userInfo); + } + + // 处理分类变化导致的标签关联关系更新 + if (hasCourseTypeChanged(oldCourse, newCourse)) { + updateCourseTypeTagRelations(oldCourse, newCourse, newTagIds, userInfo); + } + } + + /** + * 创建课程-标签关联关系 + */ + private void createCourseTagRelation(String courseId, CourseTag tag, CurrentUser userInfo) { + // 检查是否已存在关联关系 + QueryBuilder query = QueryBuilder.from(CourseTagRelation.class); + List filters = new ArrayList<>(); + filters.add(FieldFilters.eq("courseId", Long.valueOf(courseId))); + filters.add(FieldFilters.eq("tagId", Long.valueOf(tag.getId()))); + query.addFilters(filters); + + List existingRelations = courseTagRelationDao.findList(query.builder()); + + LocalDateTime now = LocalDateTime.now(); + + if (existingRelations.isEmpty()) { + // 新建关联关系 + CourseTagRelation relation = new CourseTagRelation(); + relation.setCourseId(Long.valueOf(courseId)); + relation.setTagId(Long.valueOf(tag.getId())); + + // 设置创建信息 + relation.setSysCreateAid(userInfo.getAccountId()); + relation.setSysCreateBy(userInfo.getNickName()); + relation.setSysCreateTime(now); + + // 设置更新信息 + relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateTime(now); + + courseTagRelationDao.save(relation); + } else { + // 恢复已删除的关联关系 + CourseTagRelation relation = existingRelations.get(0); + if (relation.getDeleted()) { + relation.setDeleted(false); + + // 设置更新信息 + relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateTime(now); + + courseTagRelationDao.saveOrUpdate(relation); + } + } + } + + /** + * 创建分类-标签关联关系 + */ + private void createCourseTypeTagRelations(Course course, CourseTag tag, CurrentUser userInfo) { + String sysType1 = course.getSysType1(); + String sysType2 = course.getSysType2(); + String sysType3 = course.getSysType3(); + + // 根据分类级别创建相应的关联关系 + if (StringUtils.isNotBlank(sysType1)) { + createSingleCourseTypeTagRelation(sysType1, "0", "0", tag.getId(), userInfo); + } + + if (StringUtils.isNotBlank(sysType2)) { + createSingleCourseTypeTagRelation(sysType1, sysType2, "0", tag.getId(), userInfo); + } + + if (StringUtils.isNotBlank(sysType3)) { + createSingleCourseTypeTagRelation(sysType1, sysType2, sysType3, tag.getId(), userInfo); + } + } + + /** + * 创建单个分类-标签关联关系 + */ + private void createSingleCourseTypeTagRelation(String sysType1, String sysType2, String sysType3, + String tagId, CurrentUser userInfo) { + // 检查是否已存在关联关系 + QueryBuilder query = QueryBuilder.from(CourseTypeTagRelation.class); + List filters = new ArrayList<>(); + filters.add(FieldFilters.eq("sysType1", sysType1)); + filters.add(FieldFilters.eq("sysType2", sysType2)); + filters.add(FieldFilters.eq("sysType3", sysType3)); + filters.add(FieldFilters.eq("tagId", tagId)); + query.addFilters(filters); + + List existingRelations = courseTypeTagRelationDao.findList(query.builder()); + + LocalDateTime now = LocalDateTime.now(); + + if (existingRelations.isEmpty()) { + // 新建关联关系 + CourseTypeTagRelation relation = new CourseTypeTagRelation(); + relation.setSysType1(sysType1); + relation.setSysType2(sysType2); + relation.setSysType3(sysType3); + relation.setTagId(tagId); + + // 设置创建信息 + relation.setSysCreateAid(userInfo.getAccountId()); + relation.setSysCreateBy(userInfo.getNickName()); + relation.setSysCreateTime(now); + + // 设置更新信息 + relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateTime(now); + + courseTypeTagRelationDao.save(relation); + } else { + // 恢复已删除的关联关系 + CourseTypeTagRelation relation = existingRelations.get(0); + if (relation.getDeleted()) { + relation.setDeleted(false); + + // 设置更新信息 + relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateTime(now); + + courseTypeTagRelationDao.saveOrUpdate(relation); + } + } + } + + /** + * 移除课程-标签关联关系 + */ + private void removeCourseTagRelation(String courseId, String tagId, CurrentUser userInfo) { + // 查找关联关系 + QueryBuilder query = QueryBuilder.from(CourseTagRelation.class); + List filters = new ArrayList<>(); + filters.add(FieldFilters.eq("courseId", Long.valueOf(courseId))); + filters.add(FieldFilters.eq("tagId", Long.valueOf(tagId))); + query.addFilters(filters); + + List relations = courseTagRelationDao.findList(query.builder()); + + if (!relations.isEmpty()) { + CourseTagRelation relation = relations.get(0); + + // 设置更新信息 + relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateTime(LocalDateTime.now()); + + // 逻辑删除关联关系 + courseTagRelationDao.setDeleted(relation.getId()); + + // 更新标签使用计数 + CourseTag tag = courseTagDao.findOne(FieldFilters.eq("id", tagId)); + if (tag != null) { + tag.setUseCount(Math.max(0, tag.getUseCount() - 1)); + + // 设置更新信息 + tag.setSysUpdateBy(userInfo.getNickName()); + tag.setSysUpdateTime(LocalDateTime.now()); + + courseTagDao.update(tag); + } + + // 检查是否需要删除分类-标签关联关系 + checkAndRemoveCourseTypeTagRelation(tagId, userInfo); + } + } + + /** + * 检查并删除分类-标签关联关系(如果没有其他课程使用) + */ + private void checkAndRemoveCourseTypeTagRelation(String tagId, CurrentUser userInfo) { + // 检查是否还有其他课程使用这个标签 + QueryBuilder query = QueryBuilder.from(CourseTagRelation.class); + List filters = new ArrayList<>(); + filters.add(FieldFilters.eq("tagId", Long.valueOf(tagId))); + filters.add(FieldFilters.eq("deleted", false)); + query.addFilters(filters); + + List activeRelations = courseTagRelationDao.findList(query.builder()); + + // 如果没有其他活跃的关联关系,删除分类-标签关联 + if (activeRelations.isEmpty()) { + QueryBuilder typeQuery = QueryBuilder.from(CourseTypeTagRelation.class); + List typeFilters = new ArrayList<>(); + typeFilters.add(FieldFilters.eq("tagId", tagId)); + typeQuery.addFilters(typeFilters); + + List typeRelations = courseTypeTagRelationDao.findList(typeQuery.builder()); + + LocalDateTime now = LocalDateTime.now(); + + for (CourseTypeTagRelation relation : typeRelations) { + // 设置更新信息 + relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateTime(now); + + courseTypeTagRelationDao.setDeleted(relation.getId()); + } + } + } + + /** + * 更新标签使用计数并检查公共标签状态 + */ + private void updateTagUseCountAndPublicStatus(CourseTag tag, CurrentUser userInfo) { + // 统计当前活跃的关联关系数量 + QueryBuilder query = QueryBuilder.from(CourseTagRelation.class); + List filters = new ArrayList<>(); + filters.add(FieldFilters.eq("tagId", Long.valueOf(tag.getId()))); + filters.add(FieldFilters.eq("deleted", false)); + query.addFilters(filters); + + List activeRelations = courseTagRelationDao.findList(query.builder()); + int activeCount = activeRelations.size(); + + tag.setUseCount(activeCount); + + LocalDateTime now = LocalDateTime.now(); + + // 检查是否满足设置为公共标签的条件 + if (activeCount >= 3 && tag.getLastSetPublicTime() == null) { + // 只有从未手动关闭过公共标签的才自动开启 + tag.setIsPublic(true); + tag.setLastSetPublicTime(now); + } + + // 设置更新信息 + tag.setSysUpdateBy(userInfo.getNickName()); + tag.setSysUpdateTime(now); + + courseTagDao.update(tag); + } + + /** + * 检查课程分类是否发生变化 + */ + private boolean hasCourseTypeChanged(Course oldCourse, Course newCourse) { + return !Objects.equals(oldCourse.getSysType1(), newCourse.getSysType1()) || + !Objects.equals(oldCourse.getSysType2(), newCourse.getSysType2()) || + !Objects.equals(oldCourse.getSysType3(), newCourse.getSysType3()); + } + + /** + * 更新分类-标签关联关系(当分类变化时) + */ + private void updateCourseTypeTagRelations(Course oldCourse, Course newCourse, + List tagIds, CurrentUser userInfo) { + // 移除旧的分类-标签关联关系 + for (String tagId : tagIds) { + checkAndRemoveCourseTypeTagRelation(tagId, userInfo); + } + + // 创建新的分类-标签关联关系 + for (String tagId : tagIds) { + CourseTag tag = courseTagDao.findOne(FieldFilters.eq("id", tagId.trim())); + if (tag != null) { + createCourseTypeTagRelations(newCourse, tag, userInfo); + } + } + } + + /** + * 设置实体的创建信息(新增时使用) + */ + private void setCreateInfo(BaseEntity entity, CurrentUser userInfo) { + LocalDateTime now = LocalDateTime.now(); + entity.setSysCreateAid(userInfo.getAccountId()); + entity.setSysCreateBy(userInfo.getNickName()); + entity.setSysCreateTime(now); + entity.setSysUpdateBy(userInfo.getNickName()); + entity.setSysUpdateTime(now); + } + + /** + * 设置实体的更新信息(编辑时使用) + */ + private void setUpdateInfo(BaseEntity entity, CurrentUser userInfo) { + entity.setSysUpdateBy(userInfo.getNickName()); + entity.setSysUpdateTime(LocalDateTime.now()); + } + + + } From 9c529a061e500abe38a2718e127e5d9ed6f76c86 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Thu, 30 Oct 2025 14:01:37 +0800 Subject: [PATCH 20/29] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/course/api/CourseManageApi.java | 6 +++ .../service/impl/CourseTagServiceImpl.java | 38 +++++++++---------- 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java index a7143440..feec1e50 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java @@ -283,6 +283,12 @@ public class CourseManageApi extends ApiBaseController{ //填充必要的信息 try { + log.info("-------- 标签相关开始 -------"); + CurrentUser userInfo = getCurrent(); + Course oldCourse = StringUtils.isBlank(dto.getCourse().getId()) ? courseService.get(dto.getCourse().getId()) : null; + tagService.updateTags(oldCourse,dto.getCourse(),userInfo); + log.info("-------- 标签相关结束 -------"); + if(StringUtils.isBlank(dto.getCourse().getId())) { //只有在第一次添加保存时才会这样 fillCourseData(dto.getCourse()); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index d5877ee9..bb38a374 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -511,11 +511,11 @@ public class CourseTagServiceImpl implements ICourseTagService { // 设置创建信息 relation.setSysCreateAid(userInfo.getAccountId()); - relation.setSysCreateBy(userInfo.getNickName()); + relation.setSysCreateBy(userInfo.getName()); relation.setSysCreateTime(now); // 设置更新信息 - relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateBy(userInfo.getName()); relation.setSysUpdateTime(now); courseTagRelationDao.save(relation); @@ -526,7 +526,7 @@ public class CourseTagServiceImpl implements ICourseTagService { relation.setDeleted(false); // 设置更新信息 - relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateBy(userInfo.getName()); relation.setSysUpdateTime(now); courseTagRelationDao.saveOrUpdate(relation); @@ -543,16 +543,12 @@ public class CourseTagServiceImpl implements ICourseTagService { String sysType3 = course.getSysType3(); // 根据分类级别创建相应的关联关系 - if (StringUtils.isNotBlank(sysType1)) { - createSingleCourseTypeTagRelation(sysType1, "0", "0", tag.getId(), userInfo); - } - - if (StringUtils.isNotBlank(sysType2)) { - createSingleCourseTypeTagRelation(sysType1, sysType2, "0", tag.getId(), userInfo); - } - if (StringUtils.isNotBlank(sysType3)) { createSingleCourseTypeTagRelation(sysType1, sysType2, sysType3, tag.getId(), userInfo); + }else if (StringUtils.isNotBlank(sysType2)) { + createSingleCourseTypeTagRelation(sysType1, sysType2, "0", tag.getId(), userInfo); + }else if (StringUtils.isNotBlank(sysType1)) { + createSingleCourseTypeTagRelation(sysType1, "0", "0", tag.getId(), userInfo); } } @@ -584,11 +580,11 @@ public class CourseTagServiceImpl implements ICourseTagService { // 设置创建信息 relation.setSysCreateAid(userInfo.getAccountId()); - relation.setSysCreateBy(userInfo.getNickName()); + relation.setSysCreateBy(userInfo.getName()); relation.setSysCreateTime(now); // 设置更新信息 - relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateBy(userInfo.getName()); relation.setSysUpdateTime(now); courseTypeTagRelationDao.save(relation); @@ -599,7 +595,7 @@ public class CourseTagServiceImpl implements ICourseTagService { relation.setDeleted(false); // 设置更新信息 - relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateBy(userInfo.getName()); relation.setSysUpdateTime(now); courseTypeTagRelationDao.saveOrUpdate(relation); @@ -624,7 +620,7 @@ public class CourseTagServiceImpl implements ICourseTagService { CourseTagRelation relation = relations.get(0); // 设置更新信息 - relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateBy(userInfo.getName()); relation.setSysUpdateTime(LocalDateTime.now()); // 逻辑删除关联关系 @@ -636,7 +632,7 @@ public class CourseTagServiceImpl implements ICourseTagService { tag.setUseCount(Math.max(0, tag.getUseCount() - 1)); // 设置更新信息 - tag.setSysUpdateBy(userInfo.getNickName()); + tag.setSysUpdateBy(userInfo.getName()); tag.setSysUpdateTime(LocalDateTime.now()); courseTagDao.update(tag); @@ -673,7 +669,7 @@ public class CourseTagServiceImpl implements ICourseTagService { for (CourseTypeTagRelation relation : typeRelations) { // 设置更新信息 - relation.setSysUpdateBy(userInfo.getNickName()); + relation.setSysUpdateBy(userInfo.getName()); relation.setSysUpdateTime(now); courseTypeTagRelationDao.setDeleted(relation.getId()); @@ -707,7 +703,7 @@ public class CourseTagServiceImpl implements ICourseTagService { } // 设置更新信息 - tag.setSysUpdateBy(userInfo.getNickName()); + tag.setSysUpdateBy(userInfo.getName()); tag.setSysUpdateTime(now); courseTagDao.update(tag); @@ -747,9 +743,9 @@ public class CourseTagServiceImpl implements ICourseTagService { private void setCreateInfo(BaseEntity entity, CurrentUser userInfo) { LocalDateTime now = LocalDateTime.now(); entity.setSysCreateAid(userInfo.getAccountId()); - entity.setSysCreateBy(userInfo.getNickName()); + entity.setSysCreateBy(userInfo.getName()); entity.setSysCreateTime(now); - entity.setSysUpdateBy(userInfo.getNickName()); + entity.setSysUpdateBy(userInfo.getName()); entity.setSysUpdateTime(now); } @@ -757,7 +753,7 @@ public class CourseTagServiceImpl implements ICourseTagService { * 设置实体的更新信息(编辑时使用) */ private void setUpdateInfo(BaseEntity entity, CurrentUser userInfo) { - entity.setSysUpdateBy(userInfo.getNickName()); + entity.setSysUpdateBy(userInfo.getName()); entity.setSysUpdateTime(LocalDateTime.now()); } From 2527e081d921782cf12549112abf7dacd52a4900 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Thu, 30 Oct 2025 14:34:41 +0800 Subject: [PATCH 21/29] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E6=A0=87=E7=AD=BE?= =?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 --- .../module/course/api/CourseManageApi.java | 4 +- .../service/impl/CourseTagServiceImpl.java | 43 +++++++++++++++++-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java index feec1e50..b5416afb 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseManageApi.java @@ -283,9 +283,9 @@ public class CourseManageApi extends ApiBaseController{ //填充必要的信息 try { - log.info("-------- 标签相关开始 -------"); + log.info("-------- 标签相关开始 ------- 课程ID = {} " , dto.getCourse().getId()); CurrentUser userInfo = getCurrent(); - Course oldCourse = StringUtils.isBlank(dto.getCourse().getId()) ? courseService.get(dto.getCourse().getId()) : null; + Course oldCourse = StringUtils.isBlank(dto.getCourse().getId()) ? null : courseService.get(dto.getCourse().getId()); tagService.updateTags(oldCourse,dto.getCourse(),userInfo); log.info("-------- 标签相关结束 -------"); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index bb38a374..4f06c33e 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -375,14 +375,15 @@ public class CourseTagServiceImpl implements ICourseTagService { @Override public void updateTags(Course oldCourse, Course newCourse, CurrentUser userInfo) { - log.info(" --- 标签修改 --- 在线课参数 oldCourse = " + oldCourse); - log.info(" --- 标签修改 --- 在线课参数 newCourse = " + newCourse); - log.info(" --- 标签修改 --- 用户信息 userInfo = " + userInfo); + log.info(" --- 标签修改 --- 在线课参数 oldCourse = {} " , oldCourse); + log.info(" --- 标签修改 --- 在线课参数 newCourse = {} " , newCourse); + log.info(" --- 标签修改 --- 用户信息 userInfo = {} " , userInfo); // 获取新旧课程的标签ID列表 List oldTagIds = getTagIdsFromCourse(oldCourse); List newTagIds = getTagIdsFromCourse(newCourse); - + log.info(" --- 旧标签 oldTagIds = {} " , oldTagIds); + log.info(" --- 新修改 newTagIds = {} " , newTagIds); if (oldCourse == null) { // 新增课程 - 处理所有新标签 handleNewCourseTags(newCourse, newTagIds, userInfo); @@ -390,6 +391,7 @@ public class CourseTagServiceImpl implements ICourseTagService { // 编辑课程 - 比较差异并处理 handleEditCourseTags(oldCourse, newCourse, oldTagIds, newTagIds, userInfo); } + log.info("完成课程标签更新: courseId={}", newCourse != null ? newCourse.getId() : "null"); } /** @@ -417,6 +419,7 @@ public class CourseTagServiceImpl implements ICourseTagService { * 处理新增课程的标签逻辑 */ private void handleNewCourseTags(Course newCourse, List newTagIds, CurrentUser userInfo) { + log.info("处理新增课程的标签逻辑: courseId={}, tagCount={}", newCourse != null ? newCourse.getId() : "null", newTagIds.size()); String courseId = newCourse.getId(); for (String tagId : newTagIds) { @@ -440,6 +443,7 @@ public class CourseTagServiceImpl implements ICourseTagService { // 更新标签使用计数并检查是否设置为公共标签 updateTagUseCountAndPublicStatus(tag, userInfo); } + log.info("完成新增课程标签处理: courseId={}", newCourse != null ? newCourse.getId() : "null"); } /** @@ -447,6 +451,12 @@ public class CourseTagServiceImpl implements ICourseTagService { */ private void handleEditCourseTags(Course oldCourse, Course newCourse, List oldTagIds, List newTagIds, CurrentUser userInfo) { + log.info("处理编辑课程的标签逻辑: courseId={}, oldTagCount={}, newTagCount={}, toRemove={}, toAdd={}", + newCourse != null ? newCourse.getId() : "null", + oldTagIds.size(), newTagIds.size(), + oldTagIds.stream().filter(tagId -> !newTagIds.contains(tagId)).count(), + newTagIds.stream().filter(tagId -> !oldTagIds.contains(tagId)).count()); + String courseId = newCourse.getId(); // 找出需要删除的标签(存在于旧课程但不在新课程中) @@ -486,12 +496,16 @@ public class CourseTagServiceImpl implements ICourseTagService { if (hasCourseTypeChanged(oldCourse, newCourse)) { updateCourseTypeTagRelations(oldCourse, newCourse, newTagIds, userInfo); } + log.info("完成编辑课程标签处理: courseId={}", newCourse != null ? newCourse.getId() : "null"); } /** * 创建课程-标签关联关系 */ private void createCourseTagRelation(String courseId, CourseTag tag, CurrentUser userInfo) { + log.debug("创建课程-标签关联关系: courseId={}, tagId={}, tagName={}", + courseId, tag != null ? tag.getId() : "null", tag != null ? tag.getTagName() : "null"); + // 检查是否已存在关联关系 QueryBuilder query = QueryBuilder.from(CourseTagRelation.class); List filters = new ArrayList<>(); @@ -532,12 +546,21 @@ public class CourseTagServiceImpl implements ICourseTagService { courseTagRelationDao.saveOrUpdate(relation); } } + log.debug("完成课程-标签关联关系创建: courseId={}, tagId={}", courseId, tag != null ? tag.getId() : "null"); + } /** * 创建分类-标签关联关系 */ private void createCourseTypeTagRelations(Course course, CourseTag tag, CurrentUser userInfo) { + log.debug("创建分类-标签关联关系: courseId={}, tagId={}, sysType1={}, sysType2={}, sysType3={}", + course != null ? course.getId() : "null", + tag != null ? tag.getId() : "null", + course != null ? course.getSysType1() : "null", + course != null ? course.getSysType2() : "null", + course != null ? course.getSysType3() : "null"); + String sysType1 = course.getSysType1(); String sysType2 = course.getSysType2(); String sysType3 = course.getSysType3(); @@ -607,6 +630,7 @@ public class CourseTagServiceImpl implements ICourseTagService { * 移除课程-标签关联关系 */ private void removeCourseTagRelation(String courseId, String tagId, CurrentUser userInfo) { + log.debug("移除课程-标签关联关系: courseId={}, tagId={}", courseId, tagId); // 查找关联关系 QueryBuilder query = QueryBuilder.from(CourseTagRelation.class); List filters = new ArrayList<>(); @@ -641,6 +665,7 @@ public class CourseTagServiceImpl implements ICourseTagService { // 检查是否需要删除分类-标签关联关系 checkAndRemoveCourseTypeTagRelation(tagId, userInfo); } + log.debug("完成课程-标签关联关系移除: courseId={}, tagId={}", courseId, tagId); } /** @@ -681,6 +706,11 @@ public class CourseTagServiceImpl implements ICourseTagService { * 更新标签使用计数并检查公共标签状态 */ private void updateTagUseCountAndPublicStatus(CourseTag tag, CurrentUser userInfo) { + log.debug("更新标签使用计数和公共状态: tagId={}, tagName={}, beforeUseCount={}", + tag != null ? tag.getId() : "null", + tag != null ? tag.getTagName() : "null", + tag != null ? tag.getUseCount() : "null"); + // 统计当前活跃的关联关系数量 QueryBuilder query = QueryBuilder.from(CourseTagRelation.class); List filters = new ArrayList<>(); @@ -707,6 +737,11 @@ public class CourseTagServiceImpl implements ICourseTagService { tag.setSysUpdateTime(now); courseTagDao.update(tag); + log.debug("完成标签使用计数和公共状态更新: tagId={}, tagName={}, afterUseCount={}, isPublic={}", + tag != null ? tag.getId() : "null", + tag != null ? tag.getTagName() : "null", + tag != null ? tag.getUseCount() : "null", + tag != null ? tag.getIsPublic() : "null"); } /** From 841aa47b4ad32bf337707e97e27563e4b8af2ea6 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Thu, 30 Oct 2025 16:08:51 +0800 Subject: [PATCH 22/29] =?UTF-8?q?=E6=A0=87=E7=AD=BE=E5=8A=A0status?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/dao/CourseTagDao.java | 9 ++--- .../xboe/module/course/entity/CourseTag.java | 6 ++++ .../service/impl/CourseTagServiceImpl.java | 33 +++++++++++++++++-- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index 0f262a3d..73531369 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -131,7 +131,7 @@ public class CourseTagDao extends BaseDao { sql.append("FROM ( "); sql.append(" SELECT id, tag_name, is_public, is_hot, use_count, last_set_public_time, last_set_hot_time, deleted, sys_create_time "); sql.append(" FROM boe_course_tag "); - sql.append(" WHERE deleted = 0 AND is_public = 0 "); + sql.append(" WHERE deleted = 0 AND is_public = 0 AND status = 0 "); if (StringUtils.isNotBlank(tagName)) { sql.append(" AND tag_name LIKE ? "); @@ -142,7 +142,7 @@ public class CourseTagDao extends BaseDao { sql.append(" SELECT t.id, t.tag_name, t.is_public, t.is_hot, t.use_count, t.last_set_public_time, t.last_set_hot_time, t.deleted, t.sys_create_time "); sql.append(" FROM boe_course_tag_relation r "); sql.append(" INNER JOIN boe_course_tag t ON r.tag_id = t.id "); - sql.append(" WHERE r.deleted = 0 AND t.deleted = 0 AND t.is_public = 1 "); + sql.append(" WHERE r.deleted = 0 AND t.deleted = 0 AND t.is_public = 1 AND t.status = 0 "); if (StringUtils.isNotBlank(userId)) { sql.append(" AND r.sys_create_aid = ? "); @@ -194,11 +194,6 @@ public class CourseTagDao extends BaseDao { if (result[2] != null) tag.setIsPublic(Boolean.valueOf(String.valueOf(result[2]))); if (result[3] != null) tag.setIsHot(Boolean.valueOf(String.valueOf(result[3]))); if (result[4] != null) tag.setUseCount(Integer.valueOf(String.valueOf(result[4]))); -// if (result[5] != null) tag.setLastSetPublicTime((LocalDateTime) result[5]); -// if (result[6] != null) tag.setLastSetHotTime((LocalDateTime) result[6]); -// if (result[7] != null) tag.setDeleted(Boolean.valueOf(String.valueOf(result[7]))); -// if (result[8] != null) tag.setSysCreateTime((LocalDateTime) result[8]); - courseTags.add(tag); } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTag.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTag.java index 77199d13..f3238dfc 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTag.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/entity/CourseTag.java @@ -49,6 +49,12 @@ public class CourseTag extends BaseEntity { @Column(name = "use_count",length = 1) private Integer useCount; + /** + * 1临时, 0正式 + */ + @Column(name = "status",length = 1) + private Integer status; + /** * 最近设置为公共标签的时间 */ diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index 4f06c33e..24989e2b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -210,7 +210,7 @@ public class CourseTagServiceImpl implements ICourseTagService { * @param courseTagRelationDto * @return */ - @Override + /*@Override public CourseTag createTag(CourseTagRelationDto courseTagRelationDto) { CourseTag courseTag = null; String tagName = courseTagRelationDto.getTagName(); @@ -271,7 +271,7 @@ public class CourseTagServiceImpl implements ICourseTagService { createCourseTypeAndTagRelation(courseTagRelationDto); return courseTag; } - +*/ @Override public CourseTag getTagByName(String tagName) { CourseTag courseTag = courseTagDao.getTagByName(tagName); @@ -372,6 +372,33 @@ public class CourseTagServiceImpl implements ICourseTagService { + /** + * 创建新标签 + * @param courseTagRelationDto + * @return + */ + @Override + public CourseTag createTag(CourseTagRelationDto courseTagRelationDto) { + CourseTag courseTag = null; + String tagName = courseTagRelationDto.getTagName(); + //1.创建标签:先判断是否已经存在该标签 + QueryBuilder query=QueryBuilder.from(CourseTag.class); + List filters = new ArrayList<>(); + filters.add(FieldFilters.eq("tagName",tagName));//精确匹配 + query.addFilters(filters); + List courseTagList = courseTagDao.findList(query.builder()); + if (courseTagList==null || courseTagList.size()==0){//1.1 如果该标签不存在,则新建标签 + courseTag = new CourseTag(); + courseTag.setTagName(tagName); + courseTag.setIsPublic(false); + courseTag.setIsHot(false); + courseTag.setStatus(1); + courseTag.setUseCount(1); + courseTagDao.save(courseTag); + } + return courseTag; + } + @Override public void updateTags(Course oldCourse, Course newCourse, CurrentUser userInfo) { @@ -711,6 +738,8 @@ public class CourseTagServiceImpl implements ICourseTagService { tag != null ? tag.getTagName() : "null", tag != null ? tag.getUseCount() : "null"); + // 将标签状态设置为正式(status=0) + tag.setStatus(0); // 正式标签 // 统计当前活跃的关联关系数量 QueryBuilder query = QueryBuilder.from(CourseTagRelation.class); List filters = new ArrayList<>(); From 61e753e6db1c7262934da4be40a96299a4babc50 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Thu, 30 Oct 2025 17:59:01 +0800 Subject: [PATCH 23/29] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/CourseTagServiceImpl.java | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index 24989e2b..fe7f6545 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -385,6 +385,8 @@ public class CourseTagServiceImpl implements ICourseTagService { QueryBuilder query=QueryBuilder.from(CourseTag.class); List filters = new ArrayList<>(); filters.add(FieldFilters.eq("tagName",tagName));//精确匹配 + filters.add(FieldFilters.eq("status",0));//正式 + filters.add(FieldFilters.eq("deleted",0));//未删除的 query.addFilters(filters); List courseTagList = courseTagDao.findList(query.builder()); if (courseTagList==null || courseTagList.size()==0){//1.1 如果该标签不存在,则新建标签 @@ -461,6 +463,9 @@ public class CourseTagServiceImpl implements ICourseTagService { continue; } + //合并临时标签 + tag = mergeTag(tag); + // 创建课程-标签关联关系 createCourseTagRelation(courseId, tag, userInfo); @@ -508,6 +513,9 @@ public class CourseTagServiceImpl implements ICourseTagService { log.warn("标签不存在: {}", tagId); continue; } + //如果已有同名的正式标签 则需要合并 + //合并临时标签 + tag = mergeTag(tag); // 创建课程-标签关联关系 createCourseTagRelation(courseId, tag, userInfo); @@ -526,6 +534,35 @@ public class CourseTagServiceImpl implements ICourseTagService { log.info("完成编辑课程标签处理: courseId={}", newCourse != null ? newCourse.getId() : "null"); } + + /** + * 合并标签 + */ + private CourseTag mergeTag(CourseTag tag){ + //只处理临时标签 正式的忽略 + if (tag.getStatus()==1){ + QueryBuilder query=QueryBuilder.from(CourseTag.class); + List filters = new ArrayList<>(); + filters.add(FieldFilters.eq("tagName",tag));//精确匹配 + filters.add(FieldFilters.eq("status",0));//正式 + filters.add(FieldFilters.eq("deleted",0));//未删除的 + query.addFilters(filters); + List courseTagList = courseTagDao.findList(query.builder()); + log.info("标签合并 createTag courseTagList = {} " , courseTagList); + //如果无同名正式标签 则转正 + //有同名正式标签 则合并 + if (courseTagList != null && !courseTagList.isEmpty()) { + //删除临时标签 + tag.setSysUpdateBy("系统合并删除"); + tag.setSysUpdateTime(LocalDateTime.now()); + courseTagDao.setDeleted(tag.getId()); + //返回同名正式标签 + tag = courseTagList.get(0); + } + } + return tag; + } + /** * 创建课程-标签关联关系 */ @@ -739,7 +776,9 @@ public class CourseTagServiceImpl implements ICourseTagService { tag != null ? tag.getUseCount() : "null"); // 将标签状态设置为正式(status=0) - tag.setStatus(0); // 正式标签 + if (tag != null && tag.getStatus() == 1) { + tag.setStatus(0); // 正式标签 + } // 统计当前活跃的关联关系数量 QueryBuilder query = QueryBuilder.from(CourseTagRelation.class); List filters = new ArrayList<>(); From f799b6065e77d8005aacbdff078d6358c7505d69 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Thu, 30 Oct 2025 18:06:14 +0800 Subject: [PATCH 24/29] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/service/impl/CourseTagServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index fe7f6545..1ffa9aad 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -386,7 +386,7 @@ public class CourseTagServiceImpl implements ICourseTagService { List filters = new ArrayList<>(); filters.add(FieldFilters.eq("tagName",tagName));//精确匹配 filters.add(FieldFilters.eq("status",0));//正式 - filters.add(FieldFilters.eq("deleted",0));//未删除的 + filters.add(FieldFilters.eq("deleted",false));//未删除的 query.addFilters(filters); List courseTagList = courseTagDao.findList(query.builder()); if (courseTagList==null || courseTagList.size()==0){//1.1 如果该标签不存在,则新建标签 From 11628b35e233b6cf6e303fef8ad21ab6444083b7 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Thu, 30 Oct 2025 18:18:54 +0800 Subject: [PATCH 25/29] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/service/impl/CourseTagServiceImpl.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/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index 1ffa9aad..d8c64d52 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -389,7 +389,7 @@ public class CourseTagServiceImpl implements ICourseTagService { filters.add(FieldFilters.eq("deleted",false));//未删除的 query.addFilters(filters); List courseTagList = courseTagDao.findList(query.builder()); - if (courseTagList==null || courseTagList.size()==0){//1.1 如果该标签不存在,则新建标签 + if (courseTagList==null || courseTagList.isEmpty()){//1.1 如果该标签不存在,则新建标签 courseTag = new CourseTag(); courseTag.setTagName(tagName); courseTag.setIsPublic(false); @@ -545,7 +545,7 @@ public class CourseTagServiceImpl implements ICourseTagService { List filters = new ArrayList<>(); filters.add(FieldFilters.eq("tagName",tag));//精确匹配 filters.add(FieldFilters.eq("status",0));//正式 - filters.add(FieldFilters.eq("deleted",0));//未删除的 + filters.add(FieldFilters.eq("deleted",false));//未删除的 query.addFilters(filters); List courseTagList = courseTagDao.findList(query.builder()); log.info("标签合并 createTag courseTagList = {} " , courseTagList); From 612410e863f75ea3625a0bf15b55e55d42e61bd7 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Thu, 30 Oct 2025 18:37:50 +0800 Subject: [PATCH 26/29] =?UTF-8?q?=E5=90=88=E5=B9=B6=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xboe/module/course/service/impl/CourseTagServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index d8c64d52..ba95edf6 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -543,7 +543,7 @@ public class CourseTagServiceImpl implements ICourseTagService { if (tag.getStatus()==1){ QueryBuilder query=QueryBuilder.from(CourseTag.class); List filters = new ArrayList<>(); - filters.add(FieldFilters.eq("tagName",tag));//精确匹配 + filters.add(FieldFilters.eq("tagName",tag.getTagName()));//精确匹配 filters.add(FieldFilters.eq("status",0));//正式 filters.add(FieldFilters.eq("deleted",false));//未删除的 query.addFilters(filters); From d5a1d657699d2ae916ef49d4d5949917187fa227 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Thu, 30 Oct 2025 19:55:40 +0800 Subject: [PATCH 27/29] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xboe/module/course/api/CourseTagApi.java | 6 ++++++ .../main/java/com/xboe/module/course/dao/CourseTagDao.java | 2 +- .../module/course/service/impl/CourseTagServiceImpl.java | 1 - 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java index a34e9f5c..9cca5f06 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java @@ -48,6 +48,8 @@ public class CourseTagApi extends ApiBaseController { */ /* @RequestMapping(value="/page",method= {RequestMethod.GET,RequestMethod.POST}) public JsonResponse> find(Pagination pager, CourseTagQueryDto courseTagQueryDto){ + log.info("标签列表:分页查询 pager = " + pager); + log.info("标签列表:分页查询 courseTagQueryDto = " + courseTagQueryDto); List filters=new ArrayList(); OrderCondition order = null; if (courseTagQueryDto != null){ @@ -77,6 +79,8 @@ public class CourseTagApi extends ApiBaseController { } } } + log.info("标签列表:分页查询 调用接口 filters = " + filters); + log.info("标签列表:分页查询 调用接口 order = " + order); PageList list=courseTagService.query(pager.getPageIndex(),pager.getPageSize(),filters,order); return success(list); } @@ -148,6 +152,8 @@ public class CourseTagApi extends ApiBaseController { public JsonResponse> searchTags(String tagName,String typeId ,HttpServletRequest request){ CurrentUser cuser = getCurrent(); + log.info(" searchTags cuser name = " + cuser.getName() + " , NickName = " + cuser.getNickName() + " , LoginName = " + cuser.getLoginName()); + log.info(" 参数 tagName = " + tagName + " , typeId = " + typeId); String aid = cuser.getAccountId(); log.info(" searchTags aid = " + aid); if (StringUtils.isNotBlank(tagName)){ diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index 73531369..9fa1bd27 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -174,7 +174,7 @@ public class CourseTagDao extends BaseDao { } sql.append(" sys_create_time DESC"); - + log.info("查询标签 searchTags sql = {} ", sql); // 不使用实体类映射,手动处理结果集 Query query = entityManager.createNativeQuery(sql.toString()); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java index ba95edf6..3f0683dc 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseTagServiceImpl.java @@ -207,7 +207,6 @@ public class CourseTagServiceImpl implements ICourseTagService { /** * 创建新标签,并与指定课程绑定 - * @param courseTagRelationDto * @return */ /*@Override From ddd8875b112b87b5b1bd3ae873382d407630d0a3 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Thu, 30 Oct 2025 20:20:10 +0800 Subject: [PATCH 28/29] =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xboe/module/course/api/CourseTagApi.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java index 9cca5f06..7e29b739 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseTagApi.java @@ -152,15 +152,12 @@ public class CourseTagApi extends ApiBaseController { public JsonResponse> searchTags(String tagName,String typeId ,HttpServletRequest request){ CurrentUser cuser = getCurrent(); - log.info(" searchTags cuser name = " + cuser.getName() + " , NickName = " + cuser.getNickName() + " , LoginName = " + cuser.getLoginName()); - log.info(" 参数 tagName = " + tagName + " , typeId = " + typeId); String aid = cuser.getAccountId(); + log.info(" searchTags cuser name = " + cuser.getName() + " , NickName = " + cuser.getNickName() + " , LoginName = " + cuser.getLoginName()); + log.info(" 参数 tagName = " + tagName + " , typeId = " + typeId + " , aid = " + aid); log.info(" searchTags aid = " + aid); - if (StringUtils.isNotBlank(tagName)){ - List courseTagList = courseTagService.searchTags(tagName,aid,typeId); - return success(courseTagList); - } - return error("服务器端异常!"); + List courseTagList = courseTagService.searchTags(tagName,aid,typeId); + return success(courseTagList); } /** From 0979d26160b7f44ee5944f8e63dd6904f21b4120 Mon Sep 17 00:00:00 2001 From: 670788339 <670788339@qq.com> Date: Fri, 31 Oct 2025 09:37:25 +0800 Subject: [PATCH 29/29] =?UTF-8?q?=E6=8F=90=E5=AE=A1=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xboe/module/course/api/CourseAuditApi.java | 12 +++++++----- .../xboe/module/course/api/CourseFullTextApi.java | 8 ++++++++ .../com/xboe/module/course/dao/CourseTagDao.java | 4 ++-- .../course/service/impl/CourseServiceImpl.java | 7 ++++--- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseAuditApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseAuditApi.java index 8d68b26a..cd505b13 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseAuditApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseAuditApi.java @@ -9,6 +9,7 @@ import javax.servlet.http.HttpServletRequest; import com.xboe.api.ThirdApi; import com.xboe.module.course.dto.CourseParam; +import com.xboe.module.course.service.*; import org.apache.commons.lang3.StringUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -28,10 +29,6 @@ import com.xboe.module.course.entity.Course; import com.xboe.module.course.entity.CourseAudit; import com.xboe.module.course.entity.CourseContent; import com.xboe.module.course.entity.CourseHRBPAudit; -import com.xboe.module.course.service.ICourseAuditService; -import com.xboe.module.course.service.ICourseContentService; -import com.xboe.module.course.service.ICourseHRBPAuditService; -import com.xboe.module.course.service.ICourseService; import com.xboe.standard.enums.BoedxContentType; import com.xboe.standard.enums.BoedxCourseType; @@ -60,7 +57,8 @@ public class CourseAuditApi extends ApiBaseController{ private ICourseContentService ccontentService; @Resource private ThirdApi thirdApi; - + @Resource + private ICourseTagService tagService; /** * 教师需要审核的课程 @@ -424,6 +422,10 @@ public class CourseAuditApi extends ApiBaseController{ dto.getCourse().setEnabled(true);//设置启用状态问题 dto.getCourse().setPublished(false);//重新提交审核设置为未发布状态 try { +// log.info("-------- 标签相关开始 ------- 课程ID = {} " , dto.getCourse().getId()); +// Course oldCourse = StringUtils.isBlank(dto.getCourse().getId()) ? null : courseService.get(dto.getCourse().getId()); +// tagService.updateTags(oldCourse,dto.getCourse(),cuser); +// log.info("-------- 标签相关结束 -------"); courseService.submitAndPublish(dto,cuser.getAccountId(),cuser.getName()); log.info("---------------在线课开始同步到讲师管理 ------- token = " + token); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java index 14a7a0b0..f686b950 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/api/CourseFullTextApi.java @@ -74,6 +74,8 @@ public class CourseFullTextApi extends ApiBaseController{ @Autowired StringRedisTemplate redisTemplate; + + /** * 课程的初始化 * @return @@ -411,6 +413,12 @@ public class CourseFullTextApi extends ApiBaseController{ c.setKeywordsList(keywordsList); } } + if (StringUtils.isNotBlank(c.getTags()) ){ + List tagList = courseTagService.getTagsByIds(c.getTags()); + List tags = tagList.stream().map(CourseTag::getTagName).collect(Collectors.toList()); + c.setTagsList(tags); + } + } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java index 9fa1bd27..1c004f28 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/dao/CourseTagDao.java @@ -43,7 +43,7 @@ public class CourseTagDao extends BaseDao { "from boe_course_tag t\n" + "left join boe_course_tag_relation r\n" + "on t.id = r.tag_id\n" + - "where t.is_hot = true\n" + + "where t.deleted =0 and t.is_hot = true and t.status =0 \n" + "GROUP BY t.id\n" + "order by t.last_set_hot_time desc,relation_count desc"; // 数据库字段为last_set_hot_time @@ -69,7 +69,7 @@ public class CourseTagDao extends BaseDao { // 原生SQL:注意表名和列名需与数据库实际一致(此处假设表名为course_tag、course_type_tag_relation) String sql = "SELECT DISTINCT c.* FROM boe_course_tag c " + "JOIN boe_course_type_tag_relation r ON c.id = r.tag_id " + - "WHERE r.deleted = 0 " + + "WHERE r.deleted = 0 and c.status =0 " + "AND c.is_hot = true "; // 假设数据库字段为is_hot(与实体属性isHot对应) if (StringUtils.isNotBlank(sysType1)){ sql += "AND r.sys_type1 = ?1 ORDER BY c.last_set_hot_time DESC"; diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java index 2d81cf41..f8f639ce 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/course/service/impl/CourseServiceImpl.java @@ -1100,12 +1100,13 @@ public class CourseServiceImpl implements ICourseService { @Override public void submitAndPublish(CourseFullDto full, String aid, String aname) throws Exception { - Course c = full.getCourse();//当前的课程信息 + log.info(" 课程 c = " + c.getId()); + log.info(" 课程 c = " + c); c.setPublished(true); c.setPublishTime(LocalDateTime.now()); courseDao.update(c); - + log.info(" 课程 c = " + c.getId()); //先清空教师信息, 教师信息如果不一样了,也要加入到日志中 courseTeacherDao.deleteByField("courseId", c.getId()); if (full.getTeachers() != null && !full.getTeachers().isEmpty()) { @@ -1171,7 +1172,7 @@ public class CourseServiceImpl implements ICourseService { /*** * 发布全文索引 - * @param c + * @param */ // private void fullTextPublish(Course c) { // if(fullTextSearch==null) {