文章、课程标签的默认封面
This commit is contained in:
@@ -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='学习任务标签关联表';
|
||||
|
||||
|
||||
|
||||
@@ -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` (
|
||||
|
||||
@@ -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<TbTagDefaultCover> getDefaultCovers(String tagID);
|
||||
|
||||
/**
|
||||
* 根据标签ID获取所有默认封面列表(包括禁用的)
|
||||
* @param tagID 标签ID
|
||||
* @return 默认封面列表
|
||||
*/
|
||||
ResultDomain<TbTagDefaultCover> getAllDefaultCovers(String tagID);
|
||||
|
||||
/**
|
||||
* 添加默认封面
|
||||
* @param cover 默认封面对象
|
||||
* @return 操作结果
|
||||
*/
|
||||
ResultDomain<String> addDefaultCover(TbTagDefaultCover cover);
|
||||
|
||||
/**
|
||||
* 更新默认封面
|
||||
* @param cover 默认封面对象
|
||||
* @return 操作结果
|
||||
*/
|
||||
ResultDomain<String> updateDefaultCover(TbTagDefaultCover cover);
|
||||
|
||||
/**
|
||||
* 删除默认封面
|
||||
* @param id 主键ID
|
||||
* @return 操作结果
|
||||
*/
|
||||
ResultDomain<String> deleteDefaultCover(String id);
|
||||
|
||||
/**
|
||||
* 批量添加默认封面
|
||||
* @param covers 默认封面列表
|
||||
* @return 操作结果
|
||||
*/
|
||||
ResultDomain<String> batchAddDefaultCovers(List<TbTagDefaultCover> covers);
|
||||
|
||||
/**
|
||||
* @description 根据标签ID删除所有默认封面
|
||||
* @param tagID 标签ID
|
||||
* @return ResultDomain<String> 操作结果
|
||||
* @author system
|
||||
* @since 2025-12-24
|
||||
*/
|
||||
ResultDomain<String> deleteDefaultCoversByTagId(String tagID);
|
||||
}
|
||||
@@ -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() +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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<String> getResourcesByTag(@PathVariable("tagID") String tagID) {
|
||||
return tagService.getResourcesByTag(tagID);
|
||||
}
|
||||
|
||||
// ----------------标签默认封面相关--------------------------------
|
||||
|
||||
/**
|
||||
* 获取标签的启用默认封面列表
|
||||
*/
|
||||
@GetMapping("/tag/{tagID}/default-covers")
|
||||
public ResultDomain<TbTagDefaultCover> getDefaultCovers(@PathVariable("tagID") String tagID) {
|
||||
return tagDefaultCoverService.getDefaultCovers(tagID);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取标签的所有默认封面列表(管理端使用)
|
||||
*/
|
||||
@GetMapping("/tag/{tagID}/all-default-covers")
|
||||
public ResultDomain<TbTagDefaultCover> getAllDefaultCovers(@PathVariable("tagID") String tagID) {
|
||||
return tagDefaultCoverService.getAllDefaultCovers(tagID);
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加默认封面
|
||||
*/
|
||||
@PostMapping("/default-cover")
|
||||
public ResultDomain<String> addDefaultCover(@RequestBody TbTagDefaultCover cover) {
|
||||
return tagDefaultCoverService.addDefaultCover(cover);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新默认封面
|
||||
*/
|
||||
@PutMapping("/default-cover")
|
||||
public ResultDomain<String> updateDefaultCover(@RequestBody TbTagDefaultCover cover) {
|
||||
return tagDefaultCoverService.updateDefaultCover(cover);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除默认封面
|
||||
*/
|
||||
@DeleteMapping("/default-cover/{id}")
|
||||
public ResultDomain<String> deleteDefaultCover(@PathVariable("id") String id) {
|
||||
return tagDefaultCoverService.deleteDefaultCover(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量添加默认封面
|
||||
*/
|
||||
@PostMapping("/default-covers/batch")
|
||||
public ResultDomain<String> batchAddDefaultCovers(@RequestBody List<TbTagDefaultCover> covers) {
|
||||
return tagDefaultCoverService.batchAddDefaultCovers(covers);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据标签ID删除所有默认封面
|
||||
*/
|
||||
@DeleteMapping("/tag/{tagID}/default-covers")
|
||||
public ResultDomain<String> deleteDefaultCoversByTagId(@PathVariable("tagID") String tagID) {
|
||||
return tagDefaultCoverService.deleteDefaultCoversByTagId(tagID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<TbTagDefaultCover> 默认封面列表
|
||||
* @author system
|
||||
* @since 2025-12-24
|
||||
*/
|
||||
List<TbTagDefaultCover> selectDefaultCoversByTagId(@Param("tagId") String tagId);
|
||||
|
||||
/**
|
||||
* @description 根据标签ID查询启用的默认封面列表
|
||||
* @param tagId 标签ID
|
||||
* @return List<TbTagDefaultCover> 启用的默认封面列表
|
||||
* @author system
|
||||
* @since 2025-12-24
|
||||
*/
|
||||
List<TbTagDefaultCover> 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);
|
||||
}
|
||||
@@ -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<TbTagDefaultCover> getDefaultCovers(String tagID) {
|
||||
ResultDomain<TbTagDefaultCover> result = new ResultDomain<>();
|
||||
try {
|
||||
if (tagID == null || tagID.trim().isEmpty()) {
|
||||
result.fail("标签ID不能为空");
|
||||
return result;
|
||||
}
|
||||
|
||||
List<TbTagDefaultCover> 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<TbTagDefaultCover> getAllDefaultCovers(String tagID) {
|
||||
ResultDomain<TbTagDefaultCover> result = new ResultDomain<>();
|
||||
try {
|
||||
if (tagID == null || tagID.trim().isEmpty()) {
|
||||
result.fail("标签ID不能为空");
|
||||
return result;
|
||||
}
|
||||
|
||||
List<TbTagDefaultCover> 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<String> addDefaultCover(TbTagDefaultCover cover) {
|
||||
ResultDomain<String> 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<String> updateDefaultCover(TbTagDefaultCover cover) {
|
||||
ResultDomain<String> 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<String> deleteDefaultCover(String id) {
|
||||
ResultDomain<String> 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<String> batchAddDefaultCovers(List<TbTagDefaultCover> covers) {
|
||||
ResultDomain<String> 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<String> deleteDefaultCoversByTagId(String tagID) {
|
||||
ResultDomain<String> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||
<mapper namespace="org.xyzh.news.mapper.TagDefaultCoverMapper">
|
||||
|
||||
<!-- 基础结果映射 -->
|
||||
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.resource.TbTagDefaultCover">
|
||||
<id column="id" property="id" jdbcType="VARCHAR"/>
|
||||
<result column="tag_id" property="tagID" jdbcType="VARCHAR"/>
|
||||
<result column="cover_image" property="coverImage" jdbcType="VARCHAR"/>
|
||||
<result column="order_num" property="orderNum" jdbcType="INTEGER"/>
|
||||
<result column="is_active" property="isActive" jdbcType="TINYINT"/>
|
||||
<result column="creator" property="creator" jdbcType="VARCHAR"/>
|
||||
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="updater" property="updater" jdbcType="VARCHAR"/>
|
||||
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- 基础字段 -->
|
||||
<sql id="Base_Column_List">
|
||||
id, tag_id, cover_image, order_num, is_active, creator, create_time, updater, update_time
|
||||
</sql>
|
||||
|
||||
<!-- 根据标签ID查询默认封面列表 -->
|
||||
<select id="selectDefaultCoversByTagId" resultMap="BaseResultMap">
|
||||
SELECT <include refid="Base_Column_List"/>
|
||||
FROM tb_tag_default_cover
|
||||
WHERE tag_id = #{tagId}
|
||||
ORDER BY order_num ASC, create_time DESC
|
||||
</select>
|
||||
|
||||
<!-- 根据标签ID查询启用的默认封面列表 -->
|
||||
<select id="selectActiveDefaultCoversByTagId" resultMap="BaseResultMap">
|
||||
SELECT <include refid="Base_Column_List"/>
|
||||
FROM tb_tag_default_cover
|
||||
WHERE tag_id = #{tagId} AND is_active = 1
|
||||
ORDER BY order_num ASC, create_time DESC
|
||||
</select>
|
||||
|
||||
<!-- 根据ID查询默认封面 -->
|
||||
<select id="selectDefaultCoverById" resultMap="BaseResultMap">
|
||||
SELECT <include refid="Base_Column_List"/>
|
||||
FROM tb_tag_default_cover
|
||||
WHERE id = #{id}
|
||||
</select>
|
||||
|
||||
<!-- 插入默认封面 -->
|
||||
<insert id="insertDefaultCover">
|
||||
INSERT INTO tb_tag_default_cover
|
||||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||
<if test="id != null">id,</if>
|
||||
<if test="tagID != null">tag_id,</if>
|
||||
<if test="coverImage != null">cover_image,</if>
|
||||
<if test="orderNum != null">order_num,</if>
|
||||
<if test="isActive != null">is_active,</if>
|
||||
<if test="creator != null">creator,</if>
|
||||
create_time,
|
||||
</trim>
|
||||
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
|
||||
<if test="id != null">#{id},</if>
|
||||
<if test="tagID != null">#{tagID},</if>
|
||||
<if test="coverImage != null">#{coverImage},</if>
|
||||
<if test="orderNum != null">#{orderNum},</if>
|
||||
<if test="isActive != null">#{isActive},</if>
|
||||
<if test="creator != null">#{creator},</if>
|
||||
NOW(),
|
||||
</trim>
|
||||
</insert>
|
||||
|
||||
<!-- 更新默认封面 -->
|
||||
<update id="updateDefaultCover">
|
||||
UPDATE tb_tag_default_cover
|
||||
<set>
|
||||
<if test="coverImage != null">cover_image = #{coverImage},</if>
|
||||
<if test="orderNum != null">order_num = #{orderNum},</if>
|
||||
<if test="isActive != null">is_active = #{isActive},</if>
|
||||
<if test="updater != null">updater = #{updater},</if>
|
||||
update_time = NOW()
|
||||
</set>
|
||||
WHERE id = #{id}
|
||||
</update>
|
||||
|
||||
<!-- 删除默认封面 -->
|
||||
<delete id="deleteDefaultCover">
|
||||
DELETE FROM tb_tag_default_cover WHERE id = #{id}
|
||||
</delete>
|
||||
|
||||
<!-- 根据标签ID删除所有默认封面 -->
|
||||
<delete id="deleteDefaultCoversByTagId">
|
||||
DELETE FROM tb_tag_default_cover WHERE tag_id = #{tagId}
|
||||
</delete>
|
||||
|
||||
</mapper>
|
||||
@@ -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<CourseItemVO> newChapterVOs = courseItemVO.getChapters();
|
||||
if (newChapterVOs == null) {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
<result column="view_count" property="viewCount" jdbcType="INTEGER"/>
|
||||
<result column="learn_count" property="learnCount" jdbcType="INTEGER"/>
|
||||
<result column="order_num" property="orderNum" jdbcType="INTEGER"/>
|
||||
<result column="tag_id" property="tagID" jdbcType="VARCHAR"/>
|
||||
<result column="creator" property="creator" jdbcType="VARCHAR"/>
|
||||
<result column="updater" property="updater" jdbcType="VARCHAR"/>
|
||||
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
|
||||
@@ -26,9 +27,9 @@
|
||||
|
||||
<!-- 基础字段 -->
|
||||
<sql id="Base_Column_List">
|
||||
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
|
||||
</sql>
|
||||
|
||||
<!-- 通用条件 -->
|
||||
@@ -111,8 +112,9 @@
|
||||
|
||||
<!-- selectCourses - 添加权限过滤 -->
|
||||
<select id="selectCourses" resultMap="BaseResultMap">
|
||||
SELECT DISTINCT c.*
|
||||
SELECT DISTINCT <include refid="Base_Column_List" />
|
||||
FROM tb_course c
|
||||
LEFT JOIN tb_course_tag ct ON c.course_id = ct.course_id
|
||||
<include refid="Permission_Filter"/>
|
||||
WHERE c.deleted = 0
|
||||
<if test="filter.courseID != null and filter.courseID != ''">
|
||||
@@ -134,8 +136,9 @@
|
||||
<select id="selectByCourseId" resultMap="BaseResultMap">
|
||||
SELECT
|
||||
<include refid="Base_Column_List" />
|
||||
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
|
||||
</select>
|
||||
|
||||
<!-- 根据课程名称查询课程 -->
|
||||
@@ -316,8 +319,9 @@
|
||||
<!-- 分页查询课程 -->
|
||||
<!-- selectCoursesPage - 添加权限过滤 -->
|
||||
<select id="selectCoursesPage" resultMap="BaseResultMap">
|
||||
SELECT DISTINCT c.*
|
||||
SELECT DISTINCT <include refid="Base_Column_List" />
|
||||
FROM tb_course c
|
||||
LEFT JOIN tb_course_tag ct ON c.course_id = ct.course_id
|
||||
<include refid="Permission_Filter"/>
|
||||
WHERE c.deleted = 0
|
||||
<if test="filter != null">
|
||||
|
||||
Reference in New Issue
Block a user