From 878133fb40647330146bdfca03e4b87f726eb543 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Wed, 24 Dec 2025 15:44:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E7=AB=A0=E3=80=81=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E7=9A=84=E9=BB=98=E8=AE=A4=E5=B0=81=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.bin/mysql/sql/createTableLearning.sql | 4 +- .../.bin/mysql/sql/createTableResource.sql | 16 ++ .../api/news/tag/TagDefaultCoverService.java | 65 ++++++ .../dto/resource/TbTagDefaultCover.java | 106 +++++++++ .../org/xyzh/common/dto/study/TbCourse.java | 13 ++ .../java/org/xyzh/common/vo/CourseItemVO.java | 15 ++ .../xyzh/news/controller/TagController.java | 63 +++++ .../news/mapper/TagDefaultCoverMapper.java | 79 +++++++ .../impl/NCTagDefaultCoverServiceImpl.java | 217 ++++++++++++++++++ .../mapper/TagDefaultCoverMapper.xml | 92 ++++++++ .../service/impl/SCCourseServiceImpl.java | 51 +++- .../main/resources/mapper/CourseMapper.xml | 18 +- .../src/apis/resource/resourceTag.ts | 72 ++++++ schoolNewsWeb/src/types/study/index.ts | 6 + schoolNewsWeb/src/utils/defaultCover.ts | 82 +++++++ .../manage/content/TagManagementView.vue | 183 ++++++++++++++- .../public/article/card/HotArticleCard.vue | 27 ++- .../article/card/IdeologicalArticleCard.vue | 24 +- .../public/course/components/CourseAdd.vue | 49 +++- .../views/user/resource-center/SearchView.vue | 46 +++- .../components/ResourceList.vue | 36 ++- .../user/study-plan/CourseCenterView.vue | 39 +++- 22 files changed, 1278 insertions(+), 25 deletions(-) create mode 100644 schoolNewsServ/api/api-news/src/main/java/org/xyzh/api/news/tag/TagDefaultCoverService.java create mode 100644 schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/resource/TbTagDefaultCover.java create mode 100644 schoolNewsServ/news/src/main/java/org/xyzh/news/mapper/TagDefaultCoverMapper.java create mode 100644 schoolNewsServ/news/src/main/java/org/xyzh/news/service/impl/NCTagDefaultCoverServiceImpl.java create mode 100644 schoolNewsServ/news/src/main/resources/mapper/TagDefaultCoverMapper.xml create mode 100644 schoolNewsWeb/src/utils/defaultCover.ts diff --git a/schoolNewsServ/.bin/mysql/sql/createTableLearning.sql b/schoolNewsServ/.bin/mysql/sql/createTableLearning.sql index 590e8d8..b016c87 100644 --- a/schoolNewsServ/.bin/mysql/sql/createTableLearning.sql +++ b/schoolNewsServ/.bin/mysql/sql/createTableLearning.sql @@ -31,9 +31,7 @@ CREATE TABLE `tb_learning_task_tag` ( PRIMARY KEY (`id`), UNIQUE KEY `uk_task_tag` (`task_id`, `tag_id`), KEY `idx_task_id` (`task_id`), - KEY `idx_tag_id` (`tag_id`), - CONSTRAINT `fk_task_tag_task` FOREIGN KEY (`task_id`) REFERENCES `tb_learning_task` (`task_id`) ON DELETE CASCADE, - CONSTRAINT `fk_task_tag_tag` FOREIGN KEY (`tag_id`) REFERENCES `tb_tag` (`tag_id`) ON DELETE CASCADE + KEY `idx_tag_id` (`tag_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学习任务标签关联表'; diff --git a/schoolNewsServ/.bin/mysql/sql/createTableResource.sql b/schoolNewsServ/.bin/mysql/sql/createTableResource.sql index cbc9fac..9800e81 100644 --- a/schoolNewsServ/.bin/mysql/sql/createTableResource.sql +++ b/schoolNewsServ/.bin/mysql/sql/createTableResource.sql @@ -99,6 +99,22 @@ CREATE TABLE `tb_tag` ( KEY `idx_tag_type` (`tag_type`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='标签表'; +DROP TABLE IF EXISTS `tb_tag_default_cover`; +CREATE TABLE IF NOT EXISTS `tb_tag_default_cover` ( + `id` VARCHAR(32) NOT NULL COMMENT '主键ID', + `tag_id` VARCHAR(32) NOT NULL COMMENT '标签ID', + `cover_image` VARCHAR(255) NOT NULL COMMENT '封面图片fileID', + `order_num` INT DEFAULT 0 COMMENT '排序号', + `is_active` TINYINT(1) DEFAULT 1 COMMENT '是否启用:0-禁用,1-启用', + `creator` VARCHAR(32) DEFAULT NULL COMMENT '创建人', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updater` VARCHAR(32) DEFAULT NULL COMMENT '更新人', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + PRIMARY KEY (`id`), + INDEX `idx_tag_id` (`tag_id`), + INDEX `idx_active` (`is_active`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='标签默认封面配置表'; + -- 资源标签关联表 DROP TABLE IF EXISTS `tb_resource_tag`; CREATE TABLE `tb_resource_tag` ( diff --git a/schoolNewsServ/api/api-news/src/main/java/org/xyzh/api/news/tag/TagDefaultCoverService.java b/schoolNewsServ/api/api-news/src/main/java/org/xyzh/api/news/tag/TagDefaultCoverService.java new file mode 100644 index 0000000..66c9520 --- /dev/null +++ b/schoolNewsServ/api/api-news/src/main/java/org/xyzh/api/news/tag/TagDefaultCoverService.java @@ -0,0 +1,65 @@ +package org.xyzh.api.news.tag; + +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.dto.resource.TbTagDefaultCover; + +import java.util.List; + +/** + * @description 标签默认封面服务接口 + * @author system + * @since 2025-12-24 + */ +public interface TagDefaultCoverService { + + /** + * 根据标签ID获取启用的默认封面列表 + * @param tagID 标签ID + * @return 默认封面列表 + */ + ResultDomain getDefaultCovers(String tagID); + + /** + * 根据标签ID获取所有默认封面列表(包括禁用的) + * @param tagID 标签ID + * @return 默认封面列表 + */ + ResultDomain getAllDefaultCovers(String tagID); + + /** + * 添加默认封面 + * @param cover 默认封面对象 + * @return 操作结果 + */ + ResultDomain addDefaultCover(TbTagDefaultCover cover); + + /** + * 更新默认封面 + * @param cover 默认封面对象 + * @return 操作结果 + */ + ResultDomain updateDefaultCover(TbTagDefaultCover cover); + + /** + * 删除默认封面 + * @param id 主键ID + * @return 操作结果 + */ + ResultDomain deleteDefaultCover(String id); + + /** + * 批量添加默认封面 + * @param covers 默认封面列表 + * @return 操作结果 + */ + ResultDomain batchAddDefaultCovers(List covers); + + /** + * @description 根据标签ID删除所有默认封面 + * @param tagID 标签ID + * @return ResultDomain 操作结果 + * @author system + * @since 2025-12-24 + */ + ResultDomain deleteDefaultCoversByTagId(String tagID); +} diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/resource/TbTagDefaultCover.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/resource/TbTagDefaultCover.java new file mode 100644 index 0000000..68068f8 --- /dev/null +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/resource/TbTagDefaultCover.java @@ -0,0 +1,106 @@ +package org.xyzh.common.dto.resource; + +import org.xyzh.common.dto.BaseDTO; + +/** + * @description 标签默认封面配置表 + * @filename TbTagDefaultCover.java + * @author system + * @copyright xyzh + * @since 2025-12-24 + */ +public class TbTagDefaultCover extends BaseDTO { + + private static final long serialVersionUID = 1L; + + /** + * 标签ID + */ + private String tagID; + + /** + * 封面图片fileID + */ + private String coverImage; + + /** + * 排序号 + */ + private Integer orderNum; + + /** + * 是否启用:0-禁用,1-启用 + */ + private Integer isActive; + + /** + * 创建人 + */ + private String creator; + + /** + * 更新人 + */ + private String updater; + + public String getTagID() { + return tagID; + } + + public void setTagID(String tagID) { + this.tagID = tagID; + } + + public String getCoverImage() { + return coverImage; + } + + public void setCoverImage(String coverImage) { + this.coverImage = coverImage; + } + + public Integer getOrderNum() { + return orderNum; + } + + public void setOrderNum(Integer orderNum) { + this.orderNum = orderNum; + } + + public Integer getIsActive() { + return isActive; + } + + public void setIsActive(Integer isActive) { + this.isActive = isActive; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getUpdater() { + return updater; + } + + public void setUpdater(String updater) { + this.updater = updater; + } + + @Override + public String toString() { + return "TbTagDefaultCover{" + + "id='" + getId() + '\'' + + ", tagID='" + tagID + '\'' + + ", coverImage='" + coverImage + '\'' + + ", orderNum=" + orderNum + + ", isActive=" + isActive + + ", creator='" + creator + '\'' + + ", createTime=" + getCreateTime() + + '}'; + } +} diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbCourse.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbCourse.java index 4349fdd..3e1d26f 100644 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbCourse.java +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/dto/study/TbCourse.java @@ -69,6 +69,11 @@ public class TbCourse extends BaseDTO { */ private Integer orderNum; + /** + * @description 标签ID(用于获取默认封面) + */ + private String tagID; + /** * @description 创建者 */ @@ -182,6 +187,14 @@ public class TbCourse extends BaseDTO { this.orderNum = orderNum; } + public String getTagID() { + return tagID; + } + + public void setTagID(String tagID) { + this.tagID = tagID; + } + public String getCreator() { return creator; } diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/CourseItemVO.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/CourseItemVO.java index f0c12bd..7ac6041 100644 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/CourseItemVO.java +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/CourseItemVO.java @@ -68,6 +68,11 @@ public class CourseItemVO extends BaseDTO { */ private Integer learnCount; + /** + * @description 标签ID(用于获取默认封面和分类) + */ + private String tagID; + /** * @description 课程创建时间 */ @@ -235,6 +240,14 @@ public class CourseItemVO extends BaseDTO { this.learnCount = learnCount; } + public String getTagID() { + return tagID; + } + + public void setTagID(String tagID) { + this.tagID = tagID; + } + public Date getCreateTime() { return createTime; } @@ -390,6 +403,7 @@ public class CourseItemVO extends BaseDTO { course.setId(this.getId()); course.setCourseID(this.courseID); course.setName(this.name); + course.setTagID(this.tagID); course.setCoverImage(this.coverImage); course.setDescription(this.description); course.setDuration(this.duration); @@ -423,6 +437,7 @@ public class CourseItemVO extends BaseDTO { vo.setViewCount(course.getViewCount()); vo.setLearnCount(course.getLearnCount()); vo.setCreateTime(course.getCreateTime()); + vo.setTagID(course.getTagID()); return vo; } diff --git a/schoolNewsServ/news/src/main/java/org/xyzh/news/controller/TagController.java b/schoolNewsServ/news/src/main/java/org/xyzh/news/controller/TagController.java index 3bffdc6..dab913c 100644 --- a/schoolNewsServ/news/src/main/java/org/xyzh/news/controller/TagController.java +++ b/schoolNewsServ/news/src/main/java/org/xyzh/news/controller/TagController.java @@ -5,9 +5,11 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.xyzh.api.news.tag.TagService; +import org.xyzh.api.news.tag.TagDefaultCoverService; import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.dto.resource.TbTag; import org.xyzh.common.dto.resource.TbResourceTag; +import org.xyzh.common.dto.resource.TbTagDefaultCover; import java.util.List; @@ -25,6 +27,9 @@ public class TagController { @Autowired private TagService tagService; + + @Autowired + private TagDefaultCoverService tagDefaultCoverService; /** * 获取标签列表 @@ -138,4 +143,62 @@ public class TagController { public ResultDomain getResourcesByTag(@PathVariable("tagID") String tagID) { return tagService.getResourcesByTag(tagID); } + + // ----------------标签默认封面相关-------------------------------- + + /** + * 获取标签的启用默认封面列表 + */ + @GetMapping("/tag/{tagID}/default-covers") + public ResultDomain getDefaultCovers(@PathVariable("tagID") String tagID) { + return tagDefaultCoverService.getDefaultCovers(tagID); + } + + /** + * 获取标签的所有默认封面列表(管理端使用) + */ + @GetMapping("/tag/{tagID}/all-default-covers") + public ResultDomain getAllDefaultCovers(@PathVariable("tagID") String tagID) { + return tagDefaultCoverService.getAllDefaultCovers(tagID); + } + + /** + * 添加默认封面 + */ + @PostMapping("/default-cover") + public ResultDomain addDefaultCover(@RequestBody TbTagDefaultCover cover) { + return tagDefaultCoverService.addDefaultCover(cover); + } + + /** + * 更新默认封面 + */ + @PutMapping("/default-cover") + public ResultDomain updateDefaultCover(@RequestBody TbTagDefaultCover cover) { + return tagDefaultCoverService.updateDefaultCover(cover); + } + + /** + * 删除默认封面 + */ + @DeleteMapping("/default-cover/{id}") + public ResultDomain deleteDefaultCover(@PathVariable("id") String id) { + return tagDefaultCoverService.deleteDefaultCover(id); + } + + /** + * 批量添加默认封面 + */ + @PostMapping("/default-covers/batch") + public ResultDomain batchAddDefaultCovers(@RequestBody List covers) { + return tagDefaultCoverService.batchAddDefaultCovers(covers); + } + + /** + * 根据标签ID删除所有默认封面 + */ + @DeleteMapping("/tag/{tagID}/default-covers") + public ResultDomain deleteDefaultCoversByTagId(@PathVariable("tagID") String tagID) { + return tagDefaultCoverService.deleteDefaultCoversByTagId(tagID); + } } diff --git a/schoolNewsServ/news/src/main/java/org/xyzh/news/mapper/TagDefaultCoverMapper.java b/schoolNewsServ/news/src/main/java/org/xyzh/news/mapper/TagDefaultCoverMapper.java new file mode 100644 index 0000000..0eff6a9 --- /dev/null +++ b/schoolNewsServ/news/src/main/java/org/xyzh/news/mapper/TagDefaultCoverMapper.java @@ -0,0 +1,79 @@ +package org.xyzh.news.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.xyzh.common.dto.resource.TbTagDefaultCover; + +import java.util.List; + +/** + * @description 标签默认封面Mapper接口 + * @author system + * @since 2025-12-24 + */ +@Mapper +public interface TagDefaultCoverMapper { + + /** + * @description 根据标签ID查询默认封面列表 + * @param tagId 标签ID + * @return List 默认封面列表 + * @author system + * @since 2025-12-24 + */ + List selectDefaultCoversByTagId(@Param("tagId") String tagId); + + /** + * @description 根据标签ID查询启用的默认封面列表 + * @param tagId 标签ID + * @return List 启用的默认封面列表 + * @author system + * @since 2025-12-24 + */ + List selectActiveDefaultCoversByTagId(@Param("tagId") String tagId); + + /** + * @description 插入默认封面 + * @param cover 默认封面对象 + * @return int 影响行数 + * @author system + * @since 2025-12-24 + */ + int insertDefaultCover(TbTagDefaultCover cover); + + /** + * @description 更新默认封面 + * @param cover 默认封面对象 + * @return int 影响行数 + * @author system + * @since 2025-12-24 + */ + int updateDefaultCover(TbTagDefaultCover cover); + + /** + * @description 删除默认封面 + * @param id 主键ID + * @return int 影响行数 + * @author system + * @since 2025-12-24 + */ + int deleteDefaultCover(@Param("id") String id); + + /** + * @description 根据标签ID删除所有默认封面 + * @param tagId 标签ID + * @return int 影响行数 + * @author system + * @since 2025-12-24 + */ + int deleteDefaultCoversByTagId(@Param("tagId") String tagId); + + /** + * @description 根据ID查询默认封面 + * @param id 主键ID + * @return TbTagDefaultCover 默认封面对象 + * @author system + * @since 2025-12-24 + */ + TbTagDefaultCover selectDefaultCoverById(@Param("id") String id); +} diff --git a/schoolNewsServ/news/src/main/java/org/xyzh/news/service/impl/NCTagDefaultCoverServiceImpl.java b/schoolNewsServ/news/src/main/java/org/xyzh/news/service/impl/NCTagDefaultCoverServiceImpl.java new file mode 100644 index 0000000..2ced0ae --- /dev/null +++ b/schoolNewsServ/news/src/main/java/org/xyzh/news/service/impl/NCTagDefaultCoverServiceImpl.java @@ -0,0 +1,217 @@ +package org.xyzh.news.service.impl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.xyzh.api.news.tag.TagDefaultCoverService; +import org.xyzh.common.core.domain.ResultDomain; +import org.xyzh.common.dto.resource.TbTagDefaultCover; +import org.xyzh.news.mapper.TagDefaultCoverMapper; + +import java.util.List; +import java.util.UUID; + +/** + * @description 标签默认封面服务实现 + * @author system + * @since 2025-12-24 + */ +@Service +public class NCTagDefaultCoverServiceImpl implements TagDefaultCoverService { + + private static final Logger logger = LoggerFactory.getLogger(NCTagDefaultCoverServiceImpl.class); + + @Autowired + private TagDefaultCoverMapper tagDefaultCoverMapper; + + @Override + public ResultDomain getDefaultCovers(String tagID) { + ResultDomain result = new ResultDomain<>(); + try { + if (tagID == null || tagID.trim().isEmpty()) { + result.fail("标签ID不能为空"); + return result; + } + + List covers = tagDefaultCoverMapper.selectActiveDefaultCoversByTagId(tagID); + logger.info("获取标签[{}]的默认封面列表,数量:{}", tagID, covers.size()); + + result.success("获取成功", covers); + return result; + } catch (Exception e) { + logger.error("获取标签默认封面列表失败", e); + result.fail("获取默认封面列表失败:" + e.getMessage()); + return result; + } + } + + @Override + public ResultDomain getAllDefaultCovers(String tagID) { + ResultDomain result = new ResultDomain<>(); + try { + if (tagID == null || tagID.trim().isEmpty()) { + result.fail("标签ID不能为空"); + return result; + } + + List covers = tagDefaultCoverMapper.selectDefaultCoversByTagId(tagID); + logger.info("获取标签[{}]的所有默认封面列表,数量:{}", tagID, covers.size()); + + result.success("获取成功", covers); + return result; + } catch (Exception e) { + logger.error("获取标签所有默认封面列表失败", e); + result.fail("获取默认封面列表失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain addDefaultCover(TbTagDefaultCover cover) { + ResultDomain result = new ResultDomain<>(); + try { + if (cover.getTagID() == null || cover.getTagID().trim().isEmpty()) { + result.fail("标签ID不能为空"); + return result; + } + if (cover.getCoverImage() == null || cover.getCoverImage().trim().isEmpty()) { + result.fail("封面图片不能为空"); + return result; + } + + cover.setId(UUID.randomUUID().toString().replace("-", "")); + if (cover.getIsActive() == null) { + cover.setIsActive(1); + } + if (cover.getOrderNum() == null) { + cover.setOrderNum(0); + } + + int rows = tagDefaultCoverMapper.insertDefaultCover(cover); + if (rows > 0) { + logger.info("添加标签默认封面成功,ID:{}", cover.getId()); + result.success("添加成功", cover.getId()); + return result; + } else { + result.fail("添加失败"); + return result; + } + } catch (Exception e) { + logger.error("添加标签默认封面失败", e); + result.fail("添加失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain updateDefaultCover(TbTagDefaultCover cover) { + ResultDomain result = new ResultDomain<>(); + try { + if (cover.getId() == null || cover.getId().trim().isEmpty()) { + result.fail("ID不能为空"); + return result; + } + + int rows = tagDefaultCoverMapper.updateDefaultCover(cover); + if (rows > 0) { + logger.info("更新标签默认封面成功,ID:{}", cover.getId()); + result.success("更新成功", cover.getId()); + return result; + } else { + result.fail("更新失败,记录不存在"); + return result; + } + } catch (Exception e) { + logger.error("更新标签默认封面失败", e); + result.fail("更新失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain deleteDefaultCover(String id) { + ResultDomain result = new ResultDomain<>(); + try { + if (id == null || id.trim().isEmpty()) { + result.fail("ID不能为空"); + return result; + } + + int rows = tagDefaultCoverMapper.deleteDefaultCover(id); + if (rows > 0) { + logger.info("删除标签默认封面成功,ID:{}", id); + result.success("删除成功", id); + return result; + } else { + result.fail("删除失败,记录不存在"); + return result; + } + } catch (Exception e) { + logger.error("删除标签默认封面失败", e); + result.fail("删除失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain batchAddDefaultCovers(List covers) { + ResultDomain result = new ResultDomain<>(); + try { + if (covers == null || covers.isEmpty()) { + result.fail("封面列表不能为空"); + return result; + } + + int successCount = 0; + for (TbTagDefaultCover cover : covers) { + cover.setId(UUID.randomUUID().toString().replace("-", "")); + if (cover.getIsActive() == null) { + cover.setIsActive(1); + } + if (cover.getOrderNum() == null) { + cover.setOrderNum(0); + } + + int rows = tagDefaultCoverMapper.insertDefaultCover(cover); + if (rows > 0) { + successCount++; + } + } + + logger.info("批量添加标签默认封面完成,成功:{}/总数:{}", successCount, covers.size()); + result.success("批量添加成功,成功数量:" + successCount, String.valueOf(successCount)); + return result; + } catch (Exception e) { + logger.error("批量添加标签默认封面失败", e); + result.fail("批量添加失败:" + e.getMessage()); + return result; + } + } + + @Override + @Transactional + public ResultDomain deleteDefaultCoversByTagId(String tagID) { + ResultDomain result = new ResultDomain<>(); + try { + if (tagID == null || tagID.trim().isEmpty()) { + result.fail("标签ID不能为空"); + return result; + } + + int rows = tagDefaultCoverMapper.deleteDefaultCoversByTagId(tagID); + logger.info("删除标签[{}]的所有默认封面成功,删除数量:{}", tagID, rows); + result.success("删除成功", String.valueOf(rows)); + return result; + } catch (Exception e) { + logger.error("删除标签默认封面失败", e); + result.fail("删除失败:" + e.getMessage()); + return result; + } + } +} diff --git a/schoolNewsServ/news/src/main/resources/mapper/TagDefaultCoverMapper.xml b/schoolNewsServ/news/src/main/resources/mapper/TagDefaultCoverMapper.xml new file mode 100644 index 0000000..b6140b4 --- /dev/null +++ b/schoolNewsServ/news/src/main/resources/mapper/TagDefaultCoverMapper.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + id, tag_id, cover_image, order_num, is_active, creator, create_time, updater, update_time + + + + + + + + + + + + + + INSERT INTO tb_tag_default_cover + + id, + tag_id, + cover_image, + order_num, + is_active, + creator, + create_time, + + + #{id}, + #{tagID}, + #{coverImage}, + #{orderNum}, + #{isActive}, + #{creator}, + NOW(), + + + + + + UPDATE tb_tag_default_cover + + cover_image = #{coverImage}, + order_num = #{orderNum}, + is_active = #{isActive}, + updater = #{updater}, + update_time = NOW() + + WHERE id = #{id} + + + + + DELETE FROM tb_tag_default_cover WHERE id = #{id} + + + + + DELETE FROM tb_tag_default_cover WHERE tag_id = #{tagId} + + + diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCCourseServiceImpl.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCCourseServiceImpl.java index d3a90b9..542825a 100644 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCCourseServiceImpl.java +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCCourseServiceImpl.java @@ -22,13 +22,15 @@ import org.xyzh.common.dto.resource.TbResource; import org.xyzh.common.dto.study.TbCourse; import org.xyzh.common.dto.study.TbCourseChapter; import org.xyzh.common.dto.study.TbCourseNode; +import org.xyzh.common.dto.study.TbCourseTag; import org.xyzh.common.dto.user.TbSysUser; import org.xyzh.common.utils.IDUtils; import org.xyzh.common.vo.CourseItemVO; import org.xyzh.common.vo.ResourceVO; -import org.xyzh.study.mapper.CourseMapper; import org.xyzh.study.mapper.CourseChapterMapper; +import org.xyzh.study.mapper.CourseMapper; import org.xyzh.study.mapper.CourseNodeMapper; +import org.xyzh.study.mapper.CourseTagMapper; import org.xyzh.study.service.SCCourseService; import org.xyzh.system.utils.LoginUtil; import org.xyzh.api.news.resource.ResourceAuditService; @@ -58,6 +60,9 @@ public class SCCourseServiceImpl implements SCCourseService { @Autowired private CourseNodeMapper courseNodeMapper; + @Autowired + private CourseTagMapper courseTagMapper; + @Autowired private ResourceAuditService auditService; @@ -231,6 +236,22 @@ public class SCCourseServiceImpl implements SCCourseService { logger.error("创建课程权限异常,但不影响课程创建: {}", e.getMessage(), e); } + // 处理课程标签关联 + if (courseItemVO.getTagID() != null && !courseItemVO.getTagID().isEmpty()) { + try { + TbCourseTag courseTag = new TbCourseTag(); + courseTag.setId(IDUtils.generateID()); + courseTag.setCourseID(courseID); + courseTag.setTagID(courseItemVO.getTagID()); + courseTag.setCreator(user.getId()); + courseTag.setCreateTime(now); + courseTagMapper.insertCourseTag(courseTag); + logger.info("创建课程标签关联成功: courseID={}, tagID={}", courseID, courseItemVO.getTagID()); + } catch (Exception e) { + logger.error("创建课程标签关联失败: {}", e.getMessage(), e); + } + } + resultDomain.success("创建课程成功", courseItemVO); return resultDomain; } @@ -259,6 +280,34 @@ public class SCCourseServiceImpl implements SCCourseService { course.setUpdateTime(now); courseMapper.updateCourse(course); + // 1.5. 处理课程标签关联 + if (courseItemVO.getTagID() != null && !courseItemVO.getTagID().isEmpty()) { + try { + // 先删除旧的标签关联 + courseTagMapper.deleteByCourseId(courseID); + + // 创建新的标签关联 + TbCourseTag courseTag = new TbCourseTag(); + courseTag.setId(IDUtils.generateID()); + courseTag.setCourseID(courseID); + courseTag.setTagID(courseItemVO.getTagID()); + courseTag.setCreator(user.getId()); + courseTag.setCreateTime(now); + courseTagMapper.insertCourseTag(courseTag); + logger.info("更新课程标签关联成功: courseID={}, tagID={}", courseID, courseItemVO.getTagID()); + } catch (Exception e) { + logger.error("更新课程标签关联失败: {}", e.getMessage(), e); + } + } else { + // 如果没有tagID,删除所有标签关联 + try { + courseTagMapper.deleteByCourseId(courseID); + logger.info("清空课程标签关联: courseID={}", courseID); + } catch (Exception e) { + logger.error("清空课程标签关联失败: {}", e.getMessage(), e); + } + } + // 2. 处理章节和节点 List newChapterVOs = courseItemVO.getChapters(); if (newChapterVOs == null) { diff --git a/schoolNewsServ/study/src/main/resources/mapper/CourseMapper.xml b/schoolNewsServ/study/src/main/resources/mapper/CourseMapper.xml index 6132d8f..ad0e1a3 100644 --- a/schoolNewsServ/study/src/main/resources/mapper/CourseMapper.xml +++ b/schoolNewsServ/study/src/main/resources/mapper/CourseMapper.xml @@ -16,6 +16,7 @@ + @@ -26,9 +27,9 @@ - id, course_id, name, cover_image, description, content, duration, - teacher, status, view_count, learn_count, order_num, creator, updater, - create_time, update_time, delete_time, deleted + c.id, c.course_id, c.name, c.cover_image, c.description, c.content, c.duration, + c.teacher, c.status, c.view_count, c.learn_count, c.order_num, ct.tag_id, c.creator, c.updater, + c.create_time, c.update_time, c.delete_time, c.deleted @@ -111,8 +112,9 @@ SELECT - FROM tb_course - WHERE course_id = #{courseId} AND deleted = 0 + FROM tb_course c + LEFT JOIN tb_course_tag ct ON c.course_id = ct.course_id + WHERE c.course_id = #{courseId} AND c.deleted = 0 @@ -316,8 +319,9 @@