成就等界面接口调整
This commit is contained in:
@@ -21,6 +21,23 @@ CREATE TABLE `tb_learning_task` (
|
||||
KEY `idx_time` (`start_time`, `end_time`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学习任务表';
|
||||
|
||||
DROP TABLE IF EXISTS `tb_learning_task_tag`;
|
||||
CREATE TABLE `tb_learning_task_tag` (
|
||||
`id` VARCHAR(50) NOT NULL COMMENT '关联ID',
|
||||
`task_id` VARCHAR(50) NOT NULL COMMENT '任务ID',
|
||||
`tag_id` VARCHAR(50) NOT NULL COMMENT '标签ID',
|
||||
`creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者',
|
||||
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||||
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
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='学习任务标签关联表';
|
||||
|
||||
|
||||
|
||||
-- 任务项关联表(统一管理资源和课程)
|
||||
DROP TABLE IF EXISTS `tb_task_item`;
|
||||
CREATE TABLE `tb_task_item` (
|
||||
|
||||
@@ -63,6 +63,7 @@ DROP TABLE IF EXISTS `tb_resource_recommend`;
|
||||
CREATE TABLE `tb_resource_recommend` (
|
||||
`id` VARCHAR(50) NOT NULL COMMENT '推荐ID',
|
||||
`resource_id` VARCHAR(50) NOT NULL COMMENT '资源ID',
|
||||
`recommend_type` INT(4) DEFAULT 1 COMMENT '推荐类型(1-热门资源,2-思政资源)',
|
||||
`order_num` INT(4) DEFAULT 0 COMMENT '排序号',
|
||||
`reason` VARCHAR(255) DEFAULT NULL COMMENT '推荐理由',
|
||||
`creator` VARCHAR(50) DEFAULT NULL COMMENT '创建者',
|
||||
@@ -72,8 +73,9 @@ CREATE TABLE `tb_resource_recommend` (
|
||||
`delete_time` TIMESTAMP NULL DEFAULT NULL COMMENT '删除时间',
|
||||
`deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `uk_resource` (`resource_id`),
|
||||
KEY `idx_order` (`order_num`)
|
||||
KEY `idx_resource_id` (`resource_id`),
|
||||
KEY `idx_recommend_type` (`recommend_type`),
|
||||
CONSTRAINT `fk_resource_recommend_resource` FOREIGN KEY (`resource_id`) REFERENCES `tb_resource` (`resource_id`) ON DELETE CASCADE
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='资源推荐表';
|
||||
|
||||
-- 标签表
|
||||
|
||||
@@ -89,6 +89,7 @@ INSERT INTO `tb_sys_role_permission` (id, role_id, permission_id, creator, creat
|
||||
INSERT INTO `tb_sys_menu` VALUES
|
||||
-- 用户前端菜单 (100-699)
|
||||
('100', 'menu_home', '首页', NULL, '/home', 'user/home/HomeView', NULL, 1, 1, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0),
|
||||
('101', 'menu_resource_hot', '热门资源', NULL, '/resource-hot', 'user/resource-center/HotResourceView', NULL, 2, 3, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0),
|
||||
('200', 'menu_resource_center', '资源中心', NULL, '/resource-center', 'user/resource-center/ResourceCenterView', NULL, 2, 1, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:49:56', NULL, 0),
|
||||
('300', 'menu_study_plan', '学习计划', NULL, '/study-plan', 'user/study-plan/StudyPlanView', NULL, 3, 1, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
|
||||
('301', 'menu_study_tasks', '学习任务', 'menu_study_plan', '/study-plan/tasks', 'user/study-plan/StudyTasksView', NULL, 1, 1, 'NavigationLayout', '1', NULL, '2025-10-27 17:26:06', '2025-10-29 11:48:39', NULL, 0),
|
||||
@@ -146,6 +147,7 @@ INSERT INTO `tb_sys_menu` VALUES
|
||||
INSERT INTO `tb_sys_menu_permission` (id, permission_id, menu_id, creator, create_time) VALUES
|
||||
-- 前端菜单权限关联
|
||||
('100', 'perm_default', 'menu_home', '1', now()),
|
||||
('102', 'perm_default', 'menu_resource_hot', '1', now()),
|
||||
('101', 'perm_default', 'menu_resource_center', '1', now()),
|
||||
('108', 'perm_default', 'menu_study_plan', '1', now()),
|
||||
('109', 'perm_default', 'menu_study_tasks', '1', now()),
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package org.xyzh.api.news.recommend;
|
||||
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.core.page.PageParam;
|
||||
import org.xyzh.common.dto.resource.TbResourceRecommend;
|
||||
import org.xyzh.common.vo.ResourceRecommendVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -15,12 +17,12 @@ import java.util.List;
|
||||
public interface ResourceRecommendService {
|
||||
|
||||
/**
|
||||
* @description 获取推荐资源列表
|
||||
* @return ResultDomain<TbResourceRecommend> 推荐资源列表
|
||||
* @description 获取推荐资源列表(包含资源详情和权限信息)
|
||||
* @return ResultDomain<ResourceRecommendVO> 推荐资源列表
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
ResultDomain<TbResourceRecommend> getRecommendList();
|
||||
ResultDomain<ResourceRecommendVO> getRecommendList();
|
||||
|
||||
/**
|
||||
* @description 添加推荐资源
|
||||
@@ -89,12 +91,13 @@ public interface ResourceRecommendService {
|
||||
/**
|
||||
* @description 批量添加推荐资源
|
||||
* @param resourceIDs 资源ID列表
|
||||
* @param recommendType 推荐类型
|
||||
* @param reason 推荐理由
|
||||
* @return ResultDomain<TbResourceRecommend> 添加结果
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
ResultDomain<TbResourceRecommend> batchAddRecommends(List<String> resourceIDs, String reason);
|
||||
ResultDomain<TbResourceRecommend> batchAddRecommends(List<String> resourceIDs, Integer recommendType, String reason);
|
||||
|
||||
/**
|
||||
* @description 批量移除推荐资源
|
||||
@@ -113,4 +116,43 @@ public interface ResourceRecommendService {
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
ResultDomain<TbResourceRecommend> getRecommendDetail(String recommendID);
|
||||
|
||||
/**
|
||||
* @description 分页查询推荐资源列表(包含资源详情)
|
||||
* @param filter 过滤条件
|
||||
* @param pageParam 分页参数
|
||||
* @return ResultDomain<ResourceRecommendVO> 推荐资源分页列表
|
||||
* @author yslg
|
||||
* @since 2025-01-XX
|
||||
*/
|
||||
ResultDomain<ResourceRecommendVO> getRecommendPage(TbResourceRecommend filter, PageParam pageParam);
|
||||
|
||||
/**
|
||||
* @description 统计推荐资源总数
|
||||
* @param filter 过滤条件
|
||||
* @return ResultDomain<Long> 总数
|
||||
* @author yslg
|
||||
* @since 2025-01-XX
|
||||
*/
|
||||
ResultDomain<Long> countRecommends(TbResourceRecommend filter);
|
||||
|
||||
/**
|
||||
* @description 根据推荐类型获取推荐资源列表(包含资源详情)
|
||||
* @param recommendType 推荐类型(1-热门资源,2-思政资源)
|
||||
* @param limit 限制数量
|
||||
* @return ResultDomain<ResourceRecommendVO> 推荐资源列表
|
||||
* @author yslg
|
||||
* @since 2025-01-XX
|
||||
*/
|
||||
ResultDomain<ResourceRecommendVO> getRecommendsByType(Integer recommendType, Integer limit);
|
||||
|
||||
/**
|
||||
* @description 根据推荐类型和资源ID检查是否已推荐
|
||||
* @param resourceID 资源ID
|
||||
* @param recommendType 推荐类型
|
||||
* @return ResultDomain<Boolean> 是否已推荐
|
||||
* @author yslg
|
||||
* @since 2025-01-XX
|
||||
*/
|
||||
ResultDomain<Boolean> isResourceRecommendedByType(String resourceID, Integer recommendType);
|
||||
}
|
||||
|
||||
@@ -35,6 +35,15 @@ public interface ResourceService {
|
||||
*/
|
||||
ResultDomain<TbResource> getResourcePage(TbResource filter, PageParam pageParam);
|
||||
|
||||
/**
|
||||
* @description 获取资源分页(按浏览次数排序)
|
||||
* @param filter 过滤条件
|
||||
* @param pageParam 分页参数
|
||||
* @return ResultDomain<TbResource> 资源分页
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
ResultDomain<TbResource> getResourcePageOrderByViewCount(TbResource filter, PageParam pageParam);
|
||||
/**
|
||||
* @description 根据ID获取资源详情
|
||||
* @param resourceID 资源ID
|
||||
|
||||
@@ -21,7 +21,7 @@ public interface TagService {
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
ResultDomain<TbTag> getAllTags();
|
||||
ResultDomain<TbTag> getTagList(TbTag filter);
|
||||
|
||||
/**
|
||||
* @description 根据ID获取标签详情
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.xyzh.api.usercenter.collection;
|
||||
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.dto.usercenter.TbUserCollection;
|
||||
import org.xyzh.common.vo.UserCollectionVO;
|
||||
|
||||
/**
|
||||
* @description 用户收藏服务接口
|
||||
@@ -42,14 +43,14 @@ public interface UserCollectionService {
|
||||
ResultDomain<Boolean> isCollected(String userID, Integer collectionType, String collectionID);
|
||||
|
||||
/**
|
||||
* @description 获取用户收藏列表
|
||||
* @description 获取用户收藏列表(扁平化VO,包含详情)
|
||||
* @param userID 用户ID
|
||||
* @param collectionType 收藏类型(可选)
|
||||
* @return ResultDomain<TbUserCollection> 收藏列表
|
||||
* @return ResultDomain<UserCollectionVO> 收藏列表(包含资源/课程详情)
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
* @since 2025-10-31
|
||||
*/
|
||||
ResultDomain<TbUserCollection> getUserCollections(String userID, Integer collectionType);
|
||||
ResultDomain<UserCollectionVO> getUserCollections(String userID, Integer collectionType);
|
||||
|
||||
/**
|
||||
* @description 获取收藏详情
|
||||
|
||||
@@ -23,6 +23,11 @@ public class TbResourceRecommend extends BaseDTO {
|
||||
*/
|
||||
private Integer orderNum;
|
||||
|
||||
/**
|
||||
* @description 推荐类型(1-热门资源,2-思政资源)
|
||||
*/
|
||||
private Integer recommendType;
|
||||
|
||||
/**
|
||||
* @description 推荐理由
|
||||
*/
|
||||
@@ -54,6 +59,14 @@ public class TbResourceRecommend extends BaseDTO {
|
||||
this.orderNum = orderNum;
|
||||
}
|
||||
|
||||
public Integer getRecommendType() {
|
||||
return recommendType;
|
||||
}
|
||||
|
||||
public void setRecommendType(Integer recommendType) {
|
||||
this.recommendType = recommendType;
|
||||
}
|
||||
|
||||
public String getReason() {
|
||||
return reason;
|
||||
}
|
||||
@@ -83,6 +96,7 @@ public class TbResourceRecommend extends BaseDTO {
|
||||
return "TbResourceRecommend{" +
|
||||
"id=" + getID() +
|
||||
", resourceID='" + resourceID + '\'' +
|
||||
", recommendType=" + recommendType +
|
||||
", orderNum=" + orderNum +
|
||||
", reason='" + reason + '\'' +
|
||||
", createTime=" + getCreateTime() +
|
||||
|
||||
@@ -0,0 +1,65 @@
|
||||
package org.xyzh.common.dto.study;
|
||||
|
||||
import org.xyzh.common.dto.BaseDTO;
|
||||
|
||||
/**
|
||||
* @description 学习任务标签关联实体
|
||||
* @filename TbLearningTaskTag.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-10-31
|
||||
*/
|
||||
public class TbLearningTaskTag extends BaseDTO {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* 任务ID
|
||||
*/
|
||||
private String taskID;
|
||||
|
||||
/**
|
||||
* 标签ID
|
||||
*/
|
||||
private String tagID;
|
||||
|
||||
/**
|
||||
* 创建者
|
||||
*/
|
||||
private String creator;
|
||||
|
||||
public String getTaskID() {
|
||||
return taskID;
|
||||
}
|
||||
|
||||
public void setTaskID(String taskID) {
|
||||
this.taskID = taskID;
|
||||
}
|
||||
|
||||
public String getTagID() {
|
||||
return tagID;
|
||||
}
|
||||
|
||||
public void setTagID(String tagID) {
|
||||
this.tagID = tagID;
|
||||
}
|
||||
|
||||
public String getCreator() {
|
||||
return creator;
|
||||
}
|
||||
|
||||
public void setCreator(String creator) {
|
||||
this.creator = creator;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TbLearningTaskTag{" +
|
||||
"id='" + getID() + '\'' +
|
||||
", taskID='" + taskID + '\'' +
|
||||
", tagID='" + tagID + '\'' +
|
||||
", creator='" + creator + '\'' +
|
||||
", createTime=" + getCreateTime() +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,422 @@
|
||||
package org.xyzh.common.vo;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @description 资源推荐VO(用于管理端,平铺结构)
|
||||
* @filename ResourceRecommendVO.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-01-XX
|
||||
*/
|
||||
public class ResourceRecommendVO implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
// ==================== 推荐表字段 ====================
|
||||
/**
|
||||
* 推荐ID
|
||||
*/
|
||||
private String id;
|
||||
|
||||
/**
|
||||
* 资源ID
|
||||
*/
|
||||
private String resourceID;
|
||||
|
||||
/**
|
||||
* 推荐类型(1-热门资源,2-思政资源)
|
||||
*/
|
||||
private Integer recommendType;
|
||||
|
||||
/**
|
||||
* 排序号
|
||||
*/
|
||||
private Integer orderNum;
|
||||
|
||||
/**
|
||||
* 推荐理由
|
||||
*/
|
||||
private String reason;
|
||||
|
||||
/**
|
||||
* 推荐创建者
|
||||
*/
|
||||
private String creator;
|
||||
|
||||
/**
|
||||
* 推荐更新者
|
||||
*/
|
||||
private String updater;
|
||||
|
||||
/**
|
||||
* 推荐创建时间
|
||||
*/
|
||||
private Date createTime;
|
||||
|
||||
/**
|
||||
* 推荐更新时间
|
||||
*/
|
||||
private Date updateTime;
|
||||
|
||||
/**
|
||||
* 推荐删除时间
|
||||
*/
|
||||
private Date deleteTime;
|
||||
|
||||
/**
|
||||
* 推荐是否删除
|
||||
*/
|
||||
private Boolean deleted;
|
||||
|
||||
// ==================== 资源表字段 ====================
|
||||
/**
|
||||
* 资源标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* 资源简介
|
||||
*/
|
||||
private String summary;
|
||||
|
||||
/**
|
||||
* 封面图片
|
||||
*/
|
||||
private String coverImage;
|
||||
|
||||
/**
|
||||
* 标签ID(文章分类标签,tagType=1)
|
||||
*/
|
||||
private String tagID;
|
||||
|
||||
/**
|
||||
* 作者
|
||||
*/
|
||||
private String author;
|
||||
|
||||
/**
|
||||
* 来源
|
||||
*/
|
||||
private String source;
|
||||
|
||||
/**
|
||||
* 来源URL
|
||||
*/
|
||||
private String sourceUrl;
|
||||
|
||||
/**
|
||||
* 浏览次数
|
||||
*/
|
||||
private Integer viewCount;
|
||||
|
||||
/**
|
||||
* 点赞次数
|
||||
*/
|
||||
private Integer likeCount;
|
||||
|
||||
/**
|
||||
* 收藏次数
|
||||
*/
|
||||
private Integer collectCount;
|
||||
|
||||
/**
|
||||
* 状态(0草稿 1已发布 2下架)
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
/**
|
||||
* 是否推荐
|
||||
*/
|
||||
private Boolean isRecommend;
|
||||
|
||||
/**
|
||||
* 是否轮播
|
||||
*/
|
||||
private Boolean isBanner;
|
||||
|
||||
/**
|
||||
* 发布时间
|
||||
*/
|
||||
private Date publishTime;
|
||||
|
||||
/**
|
||||
* 资源创建者
|
||||
*/
|
||||
private String resourceCreator;
|
||||
|
||||
/**
|
||||
* 资源更新者
|
||||
*/
|
||||
private String resourceUpdater;
|
||||
|
||||
/**
|
||||
* 资源创建时间
|
||||
*/
|
||||
private Date resourceCreateTime;
|
||||
|
||||
/**
|
||||
* 资源更新时间
|
||||
*/
|
||||
private Date resourceUpdateTime;
|
||||
|
||||
/**
|
||||
* 当前用户是否有读权限
|
||||
*/
|
||||
private Boolean canRead;
|
||||
|
||||
/**
|
||||
* 当前用户是否有写权限
|
||||
*/
|
||||
private Boolean canWrite;
|
||||
|
||||
// ==================== Getter and Setter ====================
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getResourceID() {
|
||||
return resourceID;
|
||||
}
|
||||
|
||||
public void setResourceID(String resourceID) {
|
||||
this.resourceID = resourceID;
|
||||
}
|
||||
|
||||
public Integer getRecommendType() {
|
||||
return recommendType;
|
||||
}
|
||||
|
||||
public void setRecommendType(Integer recommendType) {
|
||||
this.recommendType = recommendType;
|
||||
}
|
||||
|
||||
public Integer getOrderNum() {
|
||||
return orderNum;
|
||||
}
|
||||
|
||||
public void setOrderNum(Integer orderNum) {
|
||||
this.orderNum = orderNum;
|
||||
}
|
||||
|
||||
public String getReason() {
|
||||
return reason;
|
||||
}
|
||||
|
||||
public void setReason(String reason) {
|
||||
this.reason = reason;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
public Date getCreateTime() {
|
||||
return createTime;
|
||||
}
|
||||
|
||||
public void setCreateTime(Date createTime) {
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
public Date getUpdateTime() {
|
||||
return updateTime;
|
||||
}
|
||||
|
||||
public void setUpdateTime(Date updateTime) {
|
||||
this.updateTime = updateTime;
|
||||
}
|
||||
|
||||
public Date getDeleteTime() {
|
||||
return deleteTime;
|
||||
}
|
||||
|
||||
public void setDeleteTime(Date deleteTime) {
|
||||
this.deleteTime = deleteTime;
|
||||
}
|
||||
|
||||
public Boolean getDeleted() {
|
||||
return deleted;
|
||||
}
|
||||
|
||||
public void setDeleted(Boolean deleted) {
|
||||
this.deleted = deleted;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getSummary() {
|
||||
return summary;
|
||||
}
|
||||
|
||||
public void setSummary(String summary) {
|
||||
this.summary = summary;
|
||||
}
|
||||
|
||||
public String getCoverImage() {
|
||||
return coverImage;
|
||||
}
|
||||
|
||||
public void setCoverImage(String coverImage) {
|
||||
this.coverImage = coverImage;
|
||||
}
|
||||
|
||||
public String getTagID() {
|
||||
return tagID;
|
||||
}
|
||||
|
||||
public void setTagID(String tagID) {
|
||||
this.tagID = tagID;
|
||||
}
|
||||
|
||||
public String getAuthor() {
|
||||
return author;
|
||||
}
|
||||
|
||||
public void setAuthor(String author) {
|
||||
this.author = author;
|
||||
}
|
||||
|
||||
public String getSource() {
|
||||
return source;
|
||||
}
|
||||
|
||||
public void setSource(String source) {
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
public String getSourceUrl() {
|
||||
return sourceUrl;
|
||||
}
|
||||
|
||||
public void setSourceUrl(String sourceUrl) {
|
||||
this.sourceUrl = sourceUrl;
|
||||
}
|
||||
|
||||
public Integer getViewCount() {
|
||||
return viewCount;
|
||||
}
|
||||
|
||||
public void setViewCount(Integer viewCount) {
|
||||
this.viewCount = viewCount;
|
||||
}
|
||||
|
||||
public Integer getLikeCount() {
|
||||
return likeCount;
|
||||
}
|
||||
|
||||
public void setLikeCount(Integer likeCount) {
|
||||
this.likeCount = likeCount;
|
||||
}
|
||||
|
||||
public Integer getCollectCount() {
|
||||
return collectCount;
|
||||
}
|
||||
|
||||
public void setCollectCount(Integer collectCount) {
|
||||
this.collectCount = collectCount;
|
||||
}
|
||||
|
||||
public Integer getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(Integer status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public Boolean getIsRecommend() {
|
||||
return isRecommend;
|
||||
}
|
||||
|
||||
public void setIsRecommend(Boolean isRecommend) {
|
||||
this.isRecommend = isRecommend;
|
||||
}
|
||||
|
||||
public Boolean getIsBanner() {
|
||||
return isBanner;
|
||||
}
|
||||
|
||||
public void setIsBanner(Boolean isBanner) {
|
||||
this.isBanner = isBanner;
|
||||
}
|
||||
|
||||
public Date getPublishTime() {
|
||||
return publishTime;
|
||||
}
|
||||
|
||||
public void setPublishTime(Date publishTime) {
|
||||
this.publishTime = publishTime;
|
||||
}
|
||||
|
||||
public String getResourceCreator() {
|
||||
return resourceCreator;
|
||||
}
|
||||
|
||||
public void setResourceCreator(String resourceCreator) {
|
||||
this.resourceCreator = resourceCreator;
|
||||
}
|
||||
|
||||
public String getResourceUpdater() {
|
||||
return resourceUpdater;
|
||||
}
|
||||
|
||||
public void setResourceUpdater(String resourceUpdater) {
|
||||
this.resourceUpdater = resourceUpdater;
|
||||
}
|
||||
|
||||
public Date getResourceCreateTime() {
|
||||
return resourceCreateTime;
|
||||
}
|
||||
|
||||
public void setResourceCreateTime(Date resourceCreateTime) {
|
||||
this.resourceCreateTime = resourceCreateTime;
|
||||
}
|
||||
|
||||
public Date getResourceUpdateTime() {
|
||||
return resourceUpdateTime;
|
||||
}
|
||||
|
||||
public void setResourceUpdateTime(Date resourceUpdateTime) {
|
||||
this.resourceUpdateTime = resourceUpdateTime;
|
||||
}
|
||||
|
||||
public Boolean getCanRead() {
|
||||
return canRead;
|
||||
}
|
||||
|
||||
public void setCanRead(Boolean canRead) {
|
||||
this.canRead = canRead;
|
||||
}
|
||||
|
||||
public Boolean getCanWrite() {
|
||||
return canWrite;
|
||||
}
|
||||
|
||||
public void setCanWrite(Boolean canWrite) {
|
||||
this.canWrite = canWrite;
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,16 @@ public class ResourceVO implements Serializable{
|
||||
* 资源标签列表(包含文章分类标签 tag_type=1)
|
||||
*/
|
||||
private List<TbTag> tags;
|
||||
|
||||
/**
|
||||
* 是否推荐(用于首页展示)
|
||||
*/
|
||||
private Boolean isRecommended;
|
||||
|
||||
/**
|
||||
* 推荐类型(1-热门资源,2-思政资源)
|
||||
*/
|
||||
private Integer recommendType;
|
||||
|
||||
public TbResource getResource() {
|
||||
return resource;
|
||||
@@ -39,4 +49,20 @@ public class ResourceVO implements Serializable{
|
||||
public void setTags(List<TbTag> tags) {
|
||||
this.tags = tags;
|
||||
}
|
||||
|
||||
public Boolean getIsRecommended() {
|
||||
return isRecommended;
|
||||
}
|
||||
|
||||
public void setIsRecommended(Boolean isRecommended) {
|
||||
this.isRecommended = isRecommended;
|
||||
}
|
||||
|
||||
public Integer getRecommendType() {
|
||||
return recommendType;
|
||||
}
|
||||
|
||||
public void setRecommendType(Integer recommendType) {
|
||||
this.recommendType = recommendType;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import org.xyzh.common.dto.BaseDTO;
|
||||
import org.xyzh.common.dto.study.TbLearningTask;
|
||||
import org.xyzh.common.dto.study.TbTaskItem;
|
||||
import org.xyzh.common.dto.study.TbTaskUser;
|
||||
import org.xyzh.common.dto.resource.TbTag;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -15,6 +16,7 @@ public class TaskVO extends BaseDTO{
|
||||
private List<TaskItemVO> taskCourses;
|
||||
private List<TaskItemVO> taskResources;
|
||||
private List<TaskItemVO> taskUsers;
|
||||
private List<TagVO> taskTags;
|
||||
private Integer totalTaskNum;
|
||||
private Integer completedTaskNum;
|
||||
private Integer learningTaskNum;
|
||||
@@ -85,6 +87,14 @@ public class TaskVO extends BaseDTO{
|
||||
public List<TbTaskUser> toTaskUsers() {
|
||||
return getTaskUsers().stream().map(TaskItemVO::toTaskUser).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public List<TagVO> getTaskTags() {
|
||||
return taskTags;
|
||||
}
|
||||
|
||||
public void setTaskTags(List<TagVO> taskTags) {
|
||||
this.taskTags = taskTags;
|
||||
}
|
||||
|
||||
public void setTaskItemList(List<TbTaskItem> taskItems) {
|
||||
if (taskItems == null) {
|
||||
|
||||
@@ -0,0 +1,359 @@
|
||||
package org.xyzh.common.vo;
|
||||
|
||||
import org.xyzh.common.dto.BaseDTO;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* @description 用户收藏VO - 扁平化收藏信息和关联资源/课程详情
|
||||
* @filename UserCollectionVO.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-10-31
|
||||
*/
|
||||
public class UserCollectionVO extends BaseDTO {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
// ========== 收藏基本信息 ==========
|
||||
/**
|
||||
* @description 用户ID
|
||||
*/
|
||||
private String userID;
|
||||
|
||||
/**
|
||||
* @description 收藏类型(1资源 2课程)
|
||||
*/
|
||||
private Integer collectionType;
|
||||
|
||||
/**
|
||||
* @description 收藏对象ID
|
||||
*/
|
||||
private String collectionID;
|
||||
|
||||
private Integer collectionValue;
|
||||
|
||||
/**
|
||||
* @description 收藏时间
|
||||
*/
|
||||
private Date collectionTime;
|
||||
|
||||
// ========== 资源详情(collectionType=1时有效) ==========
|
||||
/**
|
||||
* @description 资源ID
|
||||
*/
|
||||
private String resourceID;
|
||||
|
||||
/**
|
||||
* @description 资源标题
|
||||
*/
|
||||
private String title;
|
||||
|
||||
/**
|
||||
* @description 资源内容
|
||||
*/
|
||||
private String content;
|
||||
|
||||
/**
|
||||
* @description 资源简介
|
||||
*/
|
||||
private String summary;
|
||||
|
||||
/**
|
||||
* @description 封面图片
|
||||
*/
|
||||
private String coverImage;
|
||||
|
||||
/**
|
||||
* @description 标签ID
|
||||
*/
|
||||
private String tagID;
|
||||
|
||||
/**
|
||||
* @description 作者
|
||||
*/
|
||||
private String author;
|
||||
|
||||
/**
|
||||
* @description 来源
|
||||
*/
|
||||
private String source;
|
||||
|
||||
/**
|
||||
* @description 浏览次数
|
||||
*/
|
||||
private Integer viewCount;
|
||||
|
||||
/**
|
||||
* @description 点赞次数
|
||||
*/
|
||||
private Integer likeCount;
|
||||
|
||||
/**
|
||||
* @description 收藏次数
|
||||
*/
|
||||
private Integer collectCount;
|
||||
|
||||
/**
|
||||
* @description 资源状态
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
/**
|
||||
* @description 发布时间
|
||||
*/
|
||||
private Date publishTime;
|
||||
|
||||
// ========== 课程详情(collectionType=2时有效) ==========
|
||||
/**
|
||||
* @description 课程ID
|
||||
*/
|
||||
private String courseID;
|
||||
|
||||
/**
|
||||
* @description 课程名称
|
||||
*/
|
||||
private String courseName;
|
||||
|
||||
/**
|
||||
* @description 课程描述
|
||||
*/
|
||||
private String description;
|
||||
|
||||
/**
|
||||
* @description 课程时长(分钟)
|
||||
*/
|
||||
private Integer duration;
|
||||
|
||||
/**
|
||||
* @description 授课老师
|
||||
*/
|
||||
private String teacher;
|
||||
|
||||
/**
|
||||
* @description 课程状态
|
||||
*/
|
||||
private Integer courseStatus;
|
||||
|
||||
/**
|
||||
* @description 学习人数
|
||||
*/
|
||||
private Integer learnCount;
|
||||
|
||||
// ========== Getters and Setters ==========
|
||||
|
||||
public String getUserID() {
|
||||
return userID;
|
||||
}
|
||||
|
||||
public void setUserID(String userID) {
|
||||
this.userID = userID;
|
||||
}
|
||||
|
||||
public Integer getCollectionType() {
|
||||
return collectionType;
|
||||
}
|
||||
|
||||
public void setCollectionType(Integer collectionType) {
|
||||
this.collectionType = collectionType;
|
||||
}
|
||||
|
||||
public String getCollectionID() {
|
||||
return collectionID;
|
||||
}
|
||||
|
||||
public void setCollectionID(String collectionID) {
|
||||
this.collectionID = collectionID;
|
||||
}
|
||||
|
||||
public Integer getCollectionValue() {
|
||||
return collectionValue;
|
||||
}
|
||||
|
||||
public void setCollectionValue(Integer collectionValue) {
|
||||
this.collectionValue = collectionValue;
|
||||
}
|
||||
|
||||
public Date getCollectionTime() {
|
||||
return collectionTime;
|
||||
}
|
||||
|
||||
public void setCollectionTime(Date collectionTime) {
|
||||
this.collectionTime = collectionTime;
|
||||
}
|
||||
|
||||
public String getResourceID() {
|
||||
return resourceID;
|
||||
}
|
||||
|
||||
public void setResourceID(String resourceID) {
|
||||
this.resourceID = resourceID;
|
||||
}
|
||||
|
||||
public String getTitle() {
|
||||
return title;
|
||||
}
|
||||
|
||||
public void setTitle(String title) {
|
||||
this.title = title;
|
||||
}
|
||||
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
public void setContent(String content) {
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public String getSummary() {
|
||||
return summary;
|
||||
}
|
||||
|
||||
public void setSummary(String summary) {
|
||||
this.summary = summary;
|
||||
}
|
||||
|
||||
public String getCoverImage() {
|
||||
return coverImage;
|
||||
}
|
||||
|
||||
public void setCoverImage(String coverImage) {
|
||||
this.coverImage = coverImage;
|
||||
}
|
||||
|
||||
public String getTagID() {
|
||||
return tagID;
|
||||
}
|
||||
|
||||
public void setTagID(String tagID) {
|
||||
this.tagID = tagID;
|
||||
}
|
||||
|
||||
public String getAuthor() {
|
||||
return author;
|
||||
}
|
||||
|
||||
public void setAuthor(String author) {
|
||||
this.author = author;
|
||||
}
|
||||
|
||||
public String getSource() {
|
||||
return source;
|
||||
}
|
||||
|
||||
public void setSource(String source) {
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
public Integer getViewCount() {
|
||||
return viewCount;
|
||||
}
|
||||
|
||||
public void setViewCount(Integer viewCount) {
|
||||
this.viewCount = viewCount;
|
||||
}
|
||||
|
||||
public Integer getLikeCount() {
|
||||
return likeCount;
|
||||
}
|
||||
|
||||
public void setLikeCount(Integer likeCount) {
|
||||
this.likeCount = likeCount;
|
||||
}
|
||||
|
||||
public Integer getCollectCount() {
|
||||
return collectCount;
|
||||
}
|
||||
|
||||
public void setCollectCount(Integer collectCount) {
|
||||
this.collectCount = collectCount;
|
||||
}
|
||||
|
||||
public Integer getStatus() {
|
||||
return status;
|
||||
}
|
||||
|
||||
public void setStatus(Integer status) {
|
||||
this.status = status;
|
||||
}
|
||||
|
||||
public Date getPublishTime() {
|
||||
return publishTime;
|
||||
}
|
||||
|
||||
public void setPublishTime(Date publishTime) {
|
||||
this.publishTime = publishTime;
|
||||
}
|
||||
|
||||
public String getCourseID() {
|
||||
return courseID;
|
||||
}
|
||||
|
||||
public void setCourseID(String courseID) {
|
||||
this.courseID = courseID;
|
||||
}
|
||||
|
||||
public String getCourseName() {
|
||||
return courseName;
|
||||
}
|
||||
|
||||
public void setCourseName(String courseName) {
|
||||
this.courseName = courseName;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public void setDescription(String description) {
|
||||
this.description = description;
|
||||
}
|
||||
|
||||
public Integer getDuration() {
|
||||
return duration;
|
||||
}
|
||||
|
||||
public void setDuration(Integer duration) {
|
||||
this.duration = duration;
|
||||
}
|
||||
|
||||
public String getTeacher() {
|
||||
return teacher;
|
||||
}
|
||||
|
||||
public void setTeacher(String teacher) {
|
||||
this.teacher = teacher;
|
||||
}
|
||||
|
||||
public Integer getCourseStatus() {
|
||||
return courseStatus;
|
||||
}
|
||||
|
||||
public void setCourseStatus(Integer courseStatus) {
|
||||
this.courseStatus = courseStatus;
|
||||
}
|
||||
|
||||
public Integer getLearnCount() {
|
||||
return learnCount;
|
||||
}
|
||||
|
||||
public void setLearnCount(Integer learnCount) {
|
||||
this.learnCount = learnCount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "UserCollectionVO{" +
|
||||
"id=" + getID() +
|
||||
", userID='" + userID + '\'' +
|
||||
", collectionType=" + collectionType +
|
||||
", collectionID='" + collectionID + '\'' +
|
||||
", collectionTime=" + collectionTime +
|
||||
", resourceID='" + resourceID + '\'' +
|
||||
", title='" + title + '\'' +
|
||||
", courseID='" + courseID + '\'' +
|
||||
", courseName='" + courseName + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,10 +2,13 @@ package org.xyzh.news.controller;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.xyzh.api.news.recommend.ResourceRecommendService;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.dto.resource.TbResource;
|
||||
import org.xyzh.common.dto.resource.TbBanner;
|
||||
import org.xyzh.common.vo.ResourceRecommendVO;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@@ -21,197 +24,23 @@ import java.util.Map;
|
||||
public class HomePageController {
|
||||
private static final Logger logger = LoggerFactory.getLogger(HomePageController.class);
|
||||
|
||||
// ==================== 轮播组件管理 ====================
|
||||
@Autowired
|
||||
private ResourceRecommendService resourceRecommendService;
|
||||
|
||||
/**
|
||||
* 获取轮播组件数据
|
||||
* 获取热门资源列表
|
||||
*/
|
||||
@GetMapping("/banner/list")
|
||||
public ResultDomain<TbBanner> getBannerList() {
|
||||
// TODO: 实现获取轮播组件数据(自动轮播核心新闻,支持手动切换)
|
||||
return null;
|
||||
@GetMapping("/recommend/hot")
|
||||
public ResultDomain<ResourceRecommendVO> getHotResources(@RequestParam(required = false, name = "limit") Integer limit) {
|
||||
return resourceRecommendService.getRecommendsByType(1, limit); // 1-热门资源
|
||||
}
|
||||
|
||||
/**
|
||||
* 点击轮播跳转新闻详情
|
||||
*/
|
||||
@GetMapping("/banner/click/{bannerID}")
|
||||
public ResultDomain<TbResource> getBannerNewsDetail(@PathVariable String bannerID) {
|
||||
// TODO: 实现点击跳转新闻详情
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取活跃轮播列表
|
||||
* 获取思政资源列表
|
||||
*/
|
||||
@GetMapping("/banner/active")
|
||||
public ResultDomain<TbBanner> getActiveBanners() {
|
||||
// TODO: 实现获取活跃轮播列表
|
||||
return null;
|
||||
}
|
||||
|
||||
// ==================== TOP资源推荐 ====================
|
||||
|
||||
/**
|
||||
* 获取TOP资源推荐列表
|
||||
*/
|
||||
@GetMapping("/recommend/top-list")
|
||||
public ResultDomain<TbResource> getTopRecommendList() {
|
||||
// TODO: 实现获取TOP资源推荐列表(按浏览数据展示高热度新闻)
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 后台调控展示顺序
|
||||
*/
|
||||
@PutMapping("/recommend/order")
|
||||
public ResultDomain<Boolean> updateRecommendOrder(@RequestBody Map<String, Object> orderData) {
|
||||
// TODO: 实现后台调控展示顺序与内容
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取高热度新闻
|
||||
*/
|
||||
@GetMapping("/recommend/hot-news")
|
||||
public ResultDomain<TbResource> getHotNews(@RequestParam(required = false) Integer limit) {
|
||||
// TODO: 实现获取高热度新闻
|
||||
return null;
|
||||
}
|
||||
|
||||
// ==================== 思政新闻概览 ====================
|
||||
|
||||
/**
|
||||
* 获取思政新闻概览
|
||||
*/
|
||||
@GetMapping("/news/overview")
|
||||
public ResultDomain<TbResource> getNewsOverview(
|
||||
@RequestParam(required = false) Integer pageNum,
|
||||
@RequestParam(required = false) Integer pageSize) {
|
||||
// TODO: 实现获取思政新闻概览(以卡片形式展示新闻标题、发布时间、简介)
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 点击跳转二级详情页
|
||||
*/
|
||||
@GetMapping("/news/detail/{newsID}")
|
||||
public ResultDomain<TbResource> getNewsDetail(@PathVariable String newsID) {
|
||||
// TODO: 实现点击跳转二级详情页
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取最新思政新闻
|
||||
*/
|
||||
@GetMapping("/news/latest")
|
||||
public ResultDomain<TbResource> getLatestNews(@RequestParam(required = false) Integer limit) {
|
||||
// TODO: 实现获取最新思政新闻
|
||||
return null;
|
||||
}
|
||||
|
||||
// ==================== 顶部菜单栏 ====================
|
||||
|
||||
/**
|
||||
* 获取顶部菜单栏配置
|
||||
*/
|
||||
@GetMapping("/menu/top-menu")
|
||||
public ResultDomain<Map<String, Object>> getTopMenuConfig() {
|
||||
// TODO: 实现获取顶部菜单栏(包含首页、资源中心、学习计划、专题活动、红色常信)
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 后台修改菜单名称
|
||||
*/
|
||||
@PutMapping("/menu/update-name")
|
||||
public ResultDomain<Boolean> updateMenuName(@RequestBody Map<String, Object> menuData) {
|
||||
// TODO: 实现支持后台修改菜单名称
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取菜单项列表
|
||||
*/
|
||||
@GetMapping("/menu/list")
|
||||
public ResultDomain<Map<String, Object>> getMenuList() {
|
||||
// TODO: 实现获取菜单项列表
|
||||
return null;
|
||||
}
|
||||
|
||||
// ==================== 模糊检索 ====================
|
||||
|
||||
/**
|
||||
* 模糊检索资源
|
||||
*/
|
||||
@GetMapping("/search")
|
||||
public ResultDomain<TbResource> searchResources(@RequestParam String keyword) {
|
||||
// TODO: 实现模糊检索(输入关键词实时匹配资源(新闻、课程))
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 实时搜索建议
|
||||
*/
|
||||
@GetMapping("/search/suggestions")
|
||||
public ResultDomain<Map<String, Object>> getSearchSuggestions(@RequestParam String keyword) {
|
||||
// TODO: 实现实时搜索建议
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取热门搜索词
|
||||
*/
|
||||
@GetMapping("/search/hot-keywords")
|
||||
public ResultDomain<Map<String, Object>> getHotKeywords() {
|
||||
// TODO: 实现获取热门搜索词
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索新闻
|
||||
*/
|
||||
@GetMapping("/search/news")
|
||||
public ResultDomain<TbResource> searchNews(@RequestParam String keyword) {
|
||||
// TODO: 实现搜索新闻
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 搜索课程
|
||||
*/
|
||||
@GetMapping("/search/courses")
|
||||
public ResultDomain<Map<String, Object>> searchCourses(@RequestParam String keyword) {
|
||||
// TODO: 实现搜索课程
|
||||
return null;
|
||||
}
|
||||
|
||||
// ==================== 首页统计数据 ====================
|
||||
|
||||
/**
|
||||
* 获取首页统计数据
|
||||
*/
|
||||
@GetMapping("/statistics")
|
||||
public ResultDomain<Map<String, Object>> getHomePageStatistics() {
|
||||
// TODO: 实现获取首页统计数据
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取今日访问量
|
||||
*/
|
||||
@GetMapping("/statistics/today-visits")
|
||||
public ResultDomain<Map<String, Object>> getTodayVisits() {
|
||||
// TODO: 实现获取今日访问量
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取资源总数
|
||||
*/
|
||||
@GetMapping("/statistics/total-resources")
|
||||
public ResultDomain<Map<String, Object>> getTotalResources() {
|
||||
// TODO: 实现获取资源总数
|
||||
return null;
|
||||
@GetMapping("/recommend/ideological")
|
||||
public ResultDomain<ResourceRecommendVO> getIdeologicalResources(@RequestParam(required = false, name = "limit") Integer limit) {
|
||||
return resourceRecommendService.getRecommendsByType(2, limit); // 2-思政资源
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,6 +51,16 @@ public class ResourceController {
|
||||
return resourceService.getResourcePage(filter, pageParam);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取资源分页(按浏览次数排序)
|
||||
*/
|
||||
@PostMapping("/page/view-count")
|
||||
public ResultDomain<TbResource> getResourcePageOrderByViewCount(@RequestBody PageRequest<TbResource> request) {
|
||||
TbResource filter = request.getFilter();
|
||||
PageParam pageParam = request.getPageParam();
|
||||
return resourceService.getResourcePageOrderByViewCount(filter, pageParam);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获取资源详情
|
||||
*/
|
||||
@@ -136,14 +146,6 @@ public class ResourceController {
|
||||
return resourceService.incrementLikeCount(resourceID);
|
||||
}
|
||||
|
||||
/**
|
||||
* 增加收藏次数
|
||||
*/
|
||||
@PostMapping("/resource/collect")
|
||||
public ResultDomain<TbResource> resourceCollect(@RequestBody TbUserCollection collection) {
|
||||
return resourceService.resourceCollect(collection);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置资源推荐
|
||||
*/
|
||||
|
||||
@@ -6,7 +6,15 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.xyzh.api.news.recommend.ResourceRecommendService;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.core.page.PageParam;
|
||||
import org.xyzh.common.core.page.PageRequest;
|
||||
import org.xyzh.common.dto.resource.TbResourceRecommend;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.vo.ResourceRecommendVO;
|
||||
import org.xyzh.system.utils.LoginUtil;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @description 资源推荐控制器
|
||||
@@ -24,19 +32,36 @@ public class ResourceRecommendController {
|
||||
private ResourceRecommendService resourceRecommendService;
|
||||
|
||||
/**
|
||||
* 获取推荐列表
|
||||
* 获取推荐列表(返回VO,包含权限信息)
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
public ResultDomain<TbResourceRecommend> getRecommendList() {
|
||||
return resourceRecommendService.getRecommendList();
|
||||
public ResultDomain<ResourceRecommendVO> getRecommendList() {
|
||||
ResultDomain<ResourceRecommendVO> result = resourceRecommendService.getRecommendList();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据ID获取推荐详情
|
||||
* 根据ID获取推荐详情(返回VO,包含权限信息)
|
||||
*/
|
||||
@GetMapping("/recommend/{recommendID}")
|
||||
public ResultDomain<TbResourceRecommend> getRecommendById(@PathVariable String recommendID) {
|
||||
return resourceRecommendService.getRecommendDetail(recommendID);
|
||||
public ResultDomain<ResourceRecommendVO> getRecommendById(@PathVariable("recommendID") String recommendID) {
|
||||
TbResourceRecommend filter = new TbResourceRecommend();
|
||||
filter.setID(recommendID);
|
||||
PageParam pageParam = new PageParam();
|
||||
pageParam.setPageNumber(1);
|
||||
pageParam.setPageSize(1);
|
||||
ResultDomain<ResourceRecommendVO> result = resourceRecommendService.getRecommendPage(filter, pageParam);
|
||||
// 从PageDomain中提取dataList的第一个元素
|
||||
if (result.getCode() == 200 && result.getPageDomain() != null
|
||||
&& result.getPageDomain().getDataList() != null && !result.getPageDomain().getDataList().isEmpty()) {
|
||||
ResultDomain<ResourceRecommendVO> singleResult = new ResultDomain<>();
|
||||
singleResult.setCode(200);
|
||||
singleResult.setMessage(result.getMessage());
|
||||
singleResult.setData(result.getPageDomain().getDataList().get(0));
|
||||
return singleResult;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -44,6 +69,12 @@ public class ResourceRecommendController {
|
||||
*/
|
||||
@PostMapping("/recommend")
|
||||
public ResultDomain<TbResourceRecommend> createRecommend(@RequestBody TbResourceRecommend recommend) {
|
||||
TbSysUser user = LoginUtil.getCurrentUser();
|
||||
if (user != null) {
|
||||
if (recommend.getCreator() == null) {
|
||||
recommend.setCreator(user.getID());
|
||||
}
|
||||
}
|
||||
return resourceRecommendService.addRecommend(recommend);
|
||||
}
|
||||
|
||||
@@ -59,15 +90,26 @@ public class ResourceRecommendController {
|
||||
* 删除推荐
|
||||
*/
|
||||
@DeleteMapping("/recommend/{recommendID}")
|
||||
public ResultDomain<Boolean> deleteRecommend(@PathVariable String recommendID) {
|
||||
public ResultDomain<Boolean> deleteRecommend(@PathVariable("recommendID") String recommendID) {
|
||||
return resourceRecommendService.deleteRecommend(recommendID);
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量添加推荐资源
|
||||
*/
|
||||
@PostMapping("/recommend/batch")
|
||||
public ResultDomain<TbResourceRecommend> batchAddRecommends(@RequestBody Map<String, Object> params) {
|
||||
List<String> resourceIDs = (List<String>) params.get("resourceIDs");
|
||||
Integer recommendType = (Integer) params.get("recommendType");
|
||||
String reason = (String) params.get("reason");
|
||||
return resourceRecommendService.batchAddRecommends(resourceIDs, recommendType, reason);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新推荐状态
|
||||
*/
|
||||
@PutMapping("/recommend/{recommendID}/status")
|
||||
public ResultDomain<TbResourceRecommend> updateRecommendStatus(@PathVariable String recommendID, @RequestParam Integer status) {
|
||||
public ResultDomain<TbResourceRecommend> updateRecommendStatus(@PathVariable("recommendID") String recommendID, @RequestParam("status") Integer status) {
|
||||
return null;
|
||||
// return resourceRecommendService.updateRecommendStatus(recommendID, status);
|
||||
}
|
||||
@@ -76,7 +118,7 @@ public class ResourceRecommendController {
|
||||
* 更新推荐排序
|
||||
*/
|
||||
@PutMapping("/recommend/{recommendID}/order")
|
||||
public ResultDomain<TbResourceRecommend> updateRecommendOrder(@PathVariable String recommendID, @RequestParam Integer orderNum) {
|
||||
public ResultDomain<TbResourceRecommend> updateRecommendOrder(@PathVariable("recommendID") String recommendID, @RequestParam("orderNum") Integer orderNum) {
|
||||
return resourceRecommendService.updateRecommendOrder(recommendID, orderNum);
|
||||
}
|
||||
|
||||
@@ -84,8 +126,46 @@ public class ResourceRecommendController {
|
||||
* 获取活跃推荐
|
||||
*/
|
||||
@GetMapping("/active")
|
||||
public ResultDomain<TbResourceRecommend> getActiveRecommends(@RequestParam(required = false) Integer limit) {
|
||||
public ResultDomain<TbResourceRecommend> getActiveRecommends(@RequestParam(required = false, name = "limit") Integer limit) {
|
||||
return null;
|
||||
// return resourceRecommendService.getActiveRecommends(limit);
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询推荐资源列表
|
||||
*/
|
||||
@PostMapping("/page")
|
||||
public ResultDomain<ResourceRecommendVO> getRecommendPage(@RequestBody PageRequest<TbResourceRecommend> request) {
|
||||
TbResourceRecommend filter = request.getFilter();
|
||||
PageParam pageParam = request.getPageParam();
|
||||
return resourceRecommendService.getRecommendPage(filter, pageParam);
|
||||
}
|
||||
|
||||
/**
|
||||
* 统计推荐资源总数
|
||||
*/
|
||||
@PostMapping("/count")
|
||||
public ResultDomain<Long> countRecommends(@RequestBody TbResourceRecommend filter) {
|
||||
return resourceRecommendService.countRecommends(filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据推荐类型获取推荐资源列表
|
||||
*/
|
||||
@GetMapping("/type/{recommendType}")
|
||||
public ResultDomain<ResourceRecommendVO> getRecommendsByType(
|
||||
@PathVariable("recommendType") Integer recommendType,
|
||||
@RequestParam(required = false, name = "limit") Integer limit) {
|
||||
return resourceRecommendService.getRecommendsByType(recommendType, limit);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查资源是否已推荐(按类型)
|
||||
*/
|
||||
@GetMapping("/check/{resourceID}")
|
||||
public ResultDomain<Boolean> isResourceRecommendedByType(
|
||||
@PathVariable("resourceID") String resourceID,
|
||||
@RequestParam(required = true, name = "recommendType") Integer recommendType) {
|
||||
return resourceRecommendService.isResourceRecommendedByType(resourceID, recommendType);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,8 +30,8 @@ public class TagController {
|
||||
* 获取标签列表
|
||||
*/
|
||||
@GetMapping("/list")
|
||||
public ResultDomain<TbTag> getTagList() {
|
||||
return tagService.getAllTags();
|
||||
public ResultDomain<TbTag> getTagList(TbTag filter) {
|
||||
return tagService.getTagList(filter);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -165,6 +165,18 @@ public interface ResourceMapper extends BaseMapper<TbResource> {
|
||||
*/
|
||||
List<TbResource> selectResourcesPage(@Param("filter") TbResource filter, @Param("pageParam") PageParam pageParam, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);
|
||||
|
||||
/**
|
||||
* @description 分页查询资源
|
||||
* @param filter 过滤条件
|
||||
* @param pageParam 分页参数
|
||||
* @param userDeptRoles 用户部门角色列表
|
||||
* @return List<TbResource> 资源列表
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
List<TbResource> selectResourcesPageOrderByViewCount(@Param("filter") TbResource filter, @Param("pageParam") PageParam pageParam, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);
|
||||
|
||||
|
||||
/**
|
||||
* @description 统计资源总数
|
||||
* @param filter 过滤条件
|
||||
|
||||
@@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.xyzh.common.core.page.PageParam;
|
||||
import org.xyzh.common.dto.resource.TbResourceRecommend;
|
||||
import org.xyzh.common.vo.ResourceRecommendVO;
|
||||
import org.xyzh.common.vo.UserDeptRoleVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -21,11 +23,12 @@ public interface ResourceRecommendMapper extends BaseMapper<TbResourceRecommend>
|
||||
/**
|
||||
* @description 查询资源推荐列表
|
||||
* @param filter 过滤条件
|
||||
* @return List<TbResourceRecommend> 资源推荐列表
|
||||
* @param userDeptRoles 用户部门角色列表(用于权限过滤)
|
||||
* @return List<ResourceRecommendVO> 资源推荐列表(包含资源信息和权限)
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
List<TbResourceRecommend> selectResourceRecommends(TbResourceRecommend filter);
|
||||
List<ResourceRecommendVO> selectResourceRecommends(@Param("filter") TbResourceRecommend filter, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);
|
||||
|
||||
/**
|
||||
* @description 根据推荐ID查询推荐信息
|
||||
@@ -55,13 +58,25 @@ public interface ResourceRecommendMapper extends BaseMapper<TbResourceRecommend>
|
||||
List<TbResourceRecommend> selectByStatus(@Param("status") Integer status);
|
||||
|
||||
/**
|
||||
* @description 根据类型查询推荐列表
|
||||
* @param type 类型
|
||||
* @return List<TbResourceRecommend> 推荐列表
|
||||
* @description 根据推荐类型查询推荐列表
|
||||
* @param recommendType 推荐类型(1-热门资源,2-思政资源)
|
||||
* @param limit 限制数量
|
||||
* @param userDeptRoles 用户部门角色列表(用于权限过滤)
|
||||
* @return List<ResourceRecommendVO> 推荐列表(包含资源信息和权限)
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
List<TbResourceRecommend> selectByType(@Param("type") Integer type);
|
||||
List<ResourceRecommendVO> selectByRecommendType(@Param("recommendType") Integer recommendType, @Param("limit") Integer limit, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);
|
||||
|
||||
/**
|
||||
* @description 根据资源ID和推荐类型查询
|
||||
* @param resourceId 资源ID
|
||||
* @param recommendType 推荐类型
|
||||
* @return List<TbResourceRecommend> 推荐列表
|
||||
* @author yslg
|
||||
* @since 2025-01-XX
|
||||
*/
|
||||
List<TbResourceRecommend> selectByResourceIdAndType(@Param("resourceId") String resourceId, @Param("recommendType") Integer recommendType);
|
||||
|
||||
/**
|
||||
* @description 查询热门推荐列表
|
||||
@@ -130,18 +145,20 @@ public interface ResourceRecommendMapper extends BaseMapper<TbResourceRecommend>
|
||||
* @description 分页查询资源推荐
|
||||
* @param filter 过滤条件
|
||||
* @param pageParam 分页参数
|
||||
* @return List<TbResourceRecommend> 资源推荐列表
|
||||
* @param userDeptRoles 用户部门角色列表(用于权限过滤)
|
||||
* @return List<ResourceRecommendVO> 资源推荐列表(包含资源信息和权限)
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
List<TbResourceRecommend> selectResourceRecommendsPage(@Param("filter") TbResourceRecommend filter, @Param("pageParam") PageParam pageParam);
|
||||
List<ResourceRecommendVO> selectResourceRecommendsPage(@Param("filter") TbResourceRecommend filter, @Param("pageParam") PageParam pageParam, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);
|
||||
|
||||
/**
|
||||
* @description 统计资源推荐总数
|
||||
* @param filter 过滤条件
|
||||
* @param userDeptRoles 用户部门角色列表(用于权限过滤)
|
||||
* @return long 总数
|
||||
* @author yslg
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
long countResourceRecommends(@Param("filter") TbResourceRecommend filter);
|
||||
long countResourceRecommends(@Param("filter") TbResourceRecommend filter, @Param("userDeptRoles") List<UserDeptRoleVO> userDeptRoles);
|
||||
}
|
||||
|
||||
@@ -11,10 +11,15 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.core.page.PageDomain;
|
||||
import org.xyzh.common.core.page.PageParam;
|
||||
import org.xyzh.common.dto.resource.TbResourceRecommend;
|
||||
import org.xyzh.common.utils.IDUtils;
|
||||
import org.xyzh.common.vo.ResourceRecommendVO;
|
||||
import org.xyzh.common.vo.UserDeptRoleVO;
|
||||
import org.xyzh.news.mapper.ResourceRecommendMapper;
|
||||
import org.xyzh.api.news.recommend.ResourceRecommendService;
|
||||
import org.xyzh.system.utils.LoginUtil;
|
||||
|
||||
/**
|
||||
* @description 资源推荐服务实现类
|
||||
@@ -32,11 +37,13 @@ public class NCResourceRecommendServiceImpl implements ResourceRecommendService
|
||||
private ResourceRecommendMapper resourceRecommendMapper;
|
||||
|
||||
@Override
|
||||
public ResultDomain<TbResourceRecommend> getRecommendList() {
|
||||
ResultDomain<TbResourceRecommend> resultDomain = new ResultDomain<>();
|
||||
public ResultDomain<ResourceRecommendVO> getRecommendList() {
|
||||
ResultDomain<ResourceRecommendVO> resultDomain = new ResultDomain<>();
|
||||
try {
|
||||
List<TbResourceRecommend> list = resourceRecommendMapper.selectResourceRecommends(new TbResourceRecommend());
|
||||
resultDomain.success("获取推荐列表成功", list);
|
||||
// 获取当前用户的部门角色(用于权限过滤)
|
||||
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
|
||||
List<ResourceRecommendVO> voList = resourceRecommendMapper.selectResourceRecommends(new TbResourceRecommend(), userDeptRoles);
|
||||
resultDomain.success("获取推荐列表成功", voList);
|
||||
return resultDomain;
|
||||
} catch (Exception e) {
|
||||
logger.error("获取推荐列表异常: {}", e.getMessage(), e);
|
||||
@@ -56,11 +63,21 @@ public class NCResourceRecommendServiceImpl implements ResourceRecommendService
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
// 检查资源是否已被推荐
|
||||
List<TbResourceRecommend> existingList = resourceRecommendMapper.selectByResourceId(recommend.getResourceID());
|
||||
if (existingList != null && !existingList.isEmpty()) {
|
||||
resultDomain.fail("该资源已被推荐");
|
||||
return resultDomain;
|
||||
// 检查资源是否已在该类型下被推荐
|
||||
if (recommend.getRecommendType() != null) {
|
||||
List<TbResourceRecommend> existingList = resourceRecommendMapper.selectByResourceIdAndType(
|
||||
recommend.getResourceID(), recommend.getRecommendType());
|
||||
if (existingList != null && !existingList.isEmpty()) {
|
||||
resultDomain.fail("该资源已在此类型下被推荐");
|
||||
return resultDomain;
|
||||
}
|
||||
} else {
|
||||
// 如果没有指定类型,检查是否在任何类型下已被推荐
|
||||
List<TbResourceRecommend> existingList = resourceRecommendMapper.selectByResourceId(recommend.getResourceID());
|
||||
if (existingList != null && !existingList.isEmpty()) {
|
||||
resultDomain.fail("该资源已被推荐");
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
// 设置默认值
|
||||
@@ -178,7 +195,7 @@ public class NCResourceRecommendServiceImpl implements ResourceRecommendService
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public ResultDomain<TbResourceRecommend> batchAddRecommends(List<String> resourceIDs, String reason) {
|
||||
public ResultDomain<TbResourceRecommend> batchAddRecommends(List<String> resourceIDs, Integer recommendType, String reason) {
|
||||
ResultDomain<TbResourceRecommend> resultDomain = new ResultDomain<>();
|
||||
try {
|
||||
// 参数验证
|
||||
@@ -195,15 +212,24 @@ public class NCResourceRecommendServiceImpl implements ResourceRecommendService
|
||||
continue;
|
||||
}
|
||||
|
||||
// 检查是否已推荐
|
||||
List<TbResourceRecommend> existingList = resourceRecommendMapper.selectByResourceId(resourceID);
|
||||
if (existingList != null && !existingList.isEmpty()) {
|
||||
continue;
|
||||
// 检查是否已在该类型下推荐
|
||||
if (recommendType != null) {
|
||||
List<TbResourceRecommend> existingList = resourceRecommendMapper.selectByResourceIdAndType(resourceID, recommendType);
|
||||
if (existingList != null && !existingList.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
// 如果没有指定类型,检查是否在任何类型下已被推荐
|
||||
List<TbResourceRecommend> existingList = resourceRecommendMapper.selectByResourceId(resourceID);
|
||||
if (existingList != null && !existingList.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
TbResourceRecommend recommend = new TbResourceRecommend();
|
||||
recommend.setID(IDUtils.generateID());
|
||||
recommend.setResourceID(resourceID);
|
||||
recommend.setRecommendType(recommendType);
|
||||
recommend.setReason(reason);
|
||||
recommend.setOrderNum(0);
|
||||
recommend.setCreateTime(now);
|
||||
@@ -416,4 +442,104 @@ public class NCResourceRecommendServiceImpl implements ResourceRecommendService
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<ResourceRecommendVO> getRecommendPage(TbResourceRecommend filter, PageParam pageParam) {
|
||||
ResultDomain<ResourceRecommendVO> resultDomain = new ResultDomain<>();
|
||||
try {
|
||||
if (filter == null) {
|
||||
filter = new TbResourceRecommend();
|
||||
}
|
||||
|
||||
// 获取当前用户的部门角色(用于权限过滤)
|
||||
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
|
||||
|
||||
// 计算偏移量
|
||||
if (pageParam.getOffset() == 0 && pageParam.getPageNumber() > 0) {
|
||||
pageParam.setOffset((long) (pageParam.getPageNumber() - 1) * pageParam.getPageSize());
|
||||
}
|
||||
|
||||
List<ResourceRecommendVO> voList = resourceRecommendMapper.selectResourceRecommendsPage(filter, pageParam, userDeptRoles);
|
||||
long total = resourceRecommendMapper.countResourceRecommends(filter, userDeptRoles);
|
||||
|
||||
pageParam.setTotalElements(total);
|
||||
pageParam.setTotalPages((int) Math.ceil((double) total / pageParam.getPageSize()));
|
||||
|
||||
resultDomain.success("获取推荐资源分页成功", new PageDomain<ResourceRecommendVO>(pageParam, voList));
|
||||
return resultDomain;
|
||||
} catch (Exception e) {
|
||||
logger.error("获取推荐资源分页异常: {}", e.getMessage(), e);
|
||||
resultDomain.fail("获取推荐资源分页失败: " + e.getMessage());
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<Long> countRecommends(TbResourceRecommend filter) {
|
||||
ResultDomain<Long> resultDomain = new ResultDomain<>();
|
||||
try {
|
||||
if (filter == null) {
|
||||
filter = new TbResourceRecommend();
|
||||
}
|
||||
|
||||
// 获取当前用户的部门角色(用于权限过滤)
|
||||
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
|
||||
|
||||
long count = resourceRecommendMapper.countResourceRecommends(filter, userDeptRoles);
|
||||
resultDomain.success("统计成功", count);
|
||||
return resultDomain;
|
||||
} catch (Exception e) {
|
||||
logger.error("统计推荐资源异常: {}", e.getMessage(), e);
|
||||
resultDomain.fail("统计失败: " + e.getMessage());
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<ResourceRecommendVO> getRecommendsByType(Integer recommendType, Integer limit) {
|
||||
ResultDomain<ResourceRecommendVO> resultDomain = new ResultDomain<>();
|
||||
try {
|
||||
if (recommendType == null) {
|
||||
resultDomain.fail("推荐类型不能为空");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
// 获取当前用户的部门角色(用于权限过滤)
|
||||
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
|
||||
|
||||
List<ResourceRecommendVO> voList = resourceRecommendMapper.selectByRecommendType(recommendType, limit, userDeptRoles);
|
||||
|
||||
resultDomain.success("获取推荐资源列表成功", voList);
|
||||
return resultDomain;
|
||||
} catch (Exception e) {
|
||||
logger.error("根据类型获取推荐资源异常: {}", e.getMessage(), e);
|
||||
resultDomain.fail("获取推荐资源列表失败: " + e.getMessage());
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<Boolean> isResourceRecommendedByType(String resourceID, Integer recommendType) {
|
||||
ResultDomain<Boolean> resultDomain = new ResultDomain<>();
|
||||
try {
|
||||
if (!StringUtils.hasText(resourceID)) {
|
||||
resultDomain.fail("资源ID不能为空");
|
||||
return resultDomain;
|
||||
}
|
||||
if (recommendType == null) {
|
||||
resultDomain.fail("推荐类型不能为空");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
List<TbResourceRecommend> recommendList = resourceRecommendMapper.selectByResourceIdAndType(resourceID, recommendType);
|
||||
boolean isRecommended = recommendList != null && !recommendList.isEmpty();
|
||||
|
||||
resultDomain.success("检查成功", isRecommended);
|
||||
return resultDomain;
|
||||
} catch (Exception e) {
|
||||
logger.error("检查资源是否推荐异常: {}", e.getMessage(), e);
|
||||
resultDomain.fail("检查失败: " + e.getMessage());
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@ import org.xyzh.news.mapper.ResourceMapper;
|
||||
import org.xyzh.news.mapper.ResourceTagMapper;
|
||||
import org.xyzh.system.utils.LoginUtil;
|
||||
import org.xyzh.api.news.resource.ResourceService;
|
||||
import org.xyzh.api.usercenter.collection.UserCollectionService;
|
||||
import org.xyzh.api.system.permission.ResourcePermissionService;
|
||||
import org.xyzh.common.vo.UserDeptRoleVO;
|
||||
import org.xyzh.common.core.enums.ResourceType;
|
||||
@@ -49,9 +48,6 @@ public class NCResourceServiceImpl implements ResourceService {
|
||||
@Autowired
|
||||
private ResourceTagMapper resourceTagMapper;
|
||||
|
||||
@Autowired
|
||||
private UserCollectionService userCollectionService;
|
||||
|
||||
@Autowired
|
||||
private ResourcePermissionService resourcePermissionService;
|
||||
|
||||
@@ -98,6 +94,29 @@ public class NCResourceServiceImpl implements ResourceService {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<TbResource> getResourcePageOrderByViewCount(TbResource filter, PageParam pageParam) {
|
||||
ResultDomain<TbResource> resultDomain = new ResultDomain<>();
|
||||
try {
|
||||
if (filter == null) {
|
||||
filter = new TbResource();
|
||||
}
|
||||
// 获取当前用户的部门角色
|
||||
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
|
||||
List<TbResource> list = resourceMapper.selectResourcesPageOrderByViewCount(filter, pageParam, userDeptRoles);
|
||||
long total = resourceMapper.countResources(filter, userDeptRoles);
|
||||
pageParam.setTotalElements(total);
|
||||
pageParam.setTotalPages((int) Math.ceil((double) total / pageParam.getPageSize()));
|
||||
resultDomain.success("获取资源分页(按浏览次数排序)成功", new PageDomain<TbResource>(pageParam, list));
|
||||
return resultDomain;
|
||||
}
|
||||
catch (Exception e) {
|
||||
logger.error("获取资源分页(按浏览次数排序)异常: {}", e.getMessage(), e);
|
||||
resultDomain.fail("获取资源分页(按浏览次数排序)失败: " + e.getMessage());
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<ResourceVO> getResourceById(String resourceID) {
|
||||
ResultDomain<ResourceVO> resultDomain = new ResultDomain<>();
|
||||
@@ -560,54 +579,20 @@ public class NCResourceServiceImpl implements ResourceService {
|
||||
return resultDomain;
|
||||
}
|
||||
collection.setUserID(user.getID());
|
||||
try {
|
||||
// 参数验证
|
||||
if (!StringUtils.hasText(resourceID)) {
|
||||
resultDomain.fail("资源ID不能为空");
|
||||
return resultDomain;
|
||||
}
|
||||
if (collectionValue != 1 && collectionValue != -1) {
|
||||
resultDomain.fail("收藏值错误");
|
||||
return resultDomain;
|
||||
}
|
||||
ResultDomain<Boolean> isCollected = userCollectionService.isCollected(user.getID(), collection.getCollectionType(), resourceID);
|
||||
TbResource resource = new TbResource();
|
||||
resource.setResourceID(resourceID);
|
||||
if (isCollected.isSuccess() && isCollected.getData() && collectionValue == 1) {
|
||||
resultDomain.success("已收藏", resource);
|
||||
return resultDomain;
|
||||
}
|
||||
else if (isCollected.isSuccess() && isCollected.getData() && collectionValue == -1) {
|
||||
ResultDomain<Boolean> removeCollection = userCollectionService.removeCollection(collection);
|
||||
if (removeCollection.isSuccess()) {
|
||||
resourceMapper.updateResourceCollectCount(resourceID, -1);
|
||||
resultDomain.success("已取消收藏", resource);
|
||||
return resultDomain;
|
||||
} else {
|
||||
resultDomain.fail("取消收藏失败");
|
||||
return resultDomain;
|
||||
}
|
||||
}else if (isCollected.isSuccess() && !isCollected.getData() && collectionValue == 1) {
|
||||
collection.setID(IDUtils.generateID());
|
||||
collection.setCreateTime(new Date());
|
||||
ResultDomain<TbUserCollection> addCollection = userCollectionService.addCollection(collection);
|
||||
if (addCollection.isSuccess() && addCollection.getData() != null) {
|
||||
resourceMapper.updateResourceCollectCount(resourceID, 1);
|
||||
resultDomain.success("已收藏", resource);
|
||||
return resultDomain;
|
||||
} else {
|
||||
resultDomain.fail("收藏失败");
|
||||
return resultDomain;
|
||||
}
|
||||
}else {
|
||||
resultDomain.success("未收藏", resource);
|
||||
return resultDomain;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("增加资源收藏次数异常: {}", e.getMessage(), e);
|
||||
resultDomain.fail("增加收藏次数失败: " + e.getMessage());
|
||||
// 参数验证
|
||||
if (!StringUtils.hasText(resourceID)) {
|
||||
resultDomain.fail("资源ID不能为空");
|
||||
return resultDomain;
|
||||
}
|
||||
if (collectionValue != 1 && collectionValue != -1) {
|
||||
resultDomain.fail("收藏值错误");
|
||||
return resultDomain;
|
||||
}
|
||||
TbResource resource = new TbResource();
|
||||
resource.setResourceID(resourceID);
|
||||
resourceMapper.updateResourceCollectCount(resourceID, collectionValue);
|
||||
resultDomain.success("更新资源收藏次数成功", resource);
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -215,12 +215,12 @@ public class NCTagServiceImpl implements TagService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<TbTag> getAllTags() {
|
||||
public ResultDomain<TbTag> getTagList(TbTag filter) {
|
||||
ResultDomain<TbTag> resultDomain = new ResultDomain<>();
|
||||
try {
|
||||
// 获取当前用户的部门角色
|
||||
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
|
||||
List<TbTag> tags = tagMapper.selectTags(new TbTag(), userDeptRoles);
|
||||
List<TbTag> tags = tagMapper.selectTags(filter, userDeptRoles);
|
||||
resultDomain.success("查询成功", tags);
|
||||
return resultDomain;
|
||||
} catch (Exception e) {
|
||||
|
||||
@@ -336,6 +336,33 @@
|
||||
LIMIT #{pageParam.pageSize} OFFSET #{pageParam.offset}
|
||||
</select>
|
||||
|
||||
<select id="selectResourcesPageOrderByViewCount" resultMap="BaseResultMap">
|
||||
SELECT DISTINCT r.*
|
||||
FROM tb_resource r
|
||||
<include refid="Permission_Filter"/>
|
||||
WHERE r.deleted = 0
|
||||
<if test="filter.title != null and filter.title != ''">
|
||||
AND r.title LIKE CONCAT('%', #{filter.title}, '%')
|
||||
</if>
|
||||
<if test="filter.tagID != null and filter.tagID != ''">
|
||||
AND r.tag_id = #{filter.tagID}
|
||||
</if>
|
||||
<if test="filter.author != null and filter.author != ''">
|
||||
AND r.author LIKE CONCAT('%', #{filter.author}, '%')
|
||||
</if>
|
||||
<if test="filter.status != null">
|
||||
AND r.status = #{filter.status}
|
||||
</if>
|
||||
<if test="filter.isRecommend != null">
|
||||
AND r.is_recommend = #{filter.isRecommend}
|
||||
</if>
|
||||
<if test="filter.isBanner != null">
|
||||
AND r.is_banner = #{filter.isBanner}
|
||||
</if>
|
||||
ORDER BY r.view_count DESC, r.publish_time DESC, r.create_time DESC
|
||||
LIMIT #{pageParam.pageSize} OFFSET #{pageParam.offset}
|
||||
</select>
|
||||
|
||||
<!-- 统计资源总数 - 添加权限过滤 -->
|
||||
<select id="countResources" resultType="long">
|
||||
SELECT COUNT(DISTINCT r.id)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.resource.TbResourceRecommend">
|
||||
<id column="id" property="id" jdbcType="VARCHAR"/>
|
||||
<result column="resource_id" property="resourceID" jdbcType="VARCHAR"/>
|
||||
<result column="recommend_type" property="recommendType" jdbcType="INTEGER"/>
|
||||
<result column="order_num" property="orderNum" jdbcType="INTEGER"/>
|
||||
<result column="reason" property="reason" jdbcType="VARCHAR"/>
|
||||
<result column="creator" property="creator" jdbcType="VARCHAR"/>
|
||||
@@ -16,32 +17,119 @@
|
||||
<result column="deleted" property="deleted" jdbcType="BOOLEAN"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- ResourceRecommendVO结果映射(包含资源信息和权限信息) -->
|
||||
<resultMap id="ResourceRecommendVOResultMap" type="org.xyzh.common.vo.ResourceRecommendVO">
|
||||
<!-- 推荐表字段 -->
|
||||
<id column="id" property="id" jdbcType="VARCHAR"/>
|
||||
<result column="resource_id" property="resourceID" jdbcType="VARCHAR"/>
|
||||
<result column="recommend_type" property="recommendType" jdbcType="INTEGER"/>
|
||||
<result column="order_num" property="orderNum" jdbcType="INTEGER"/>
|
||||
<result column="reason" property="reason" jdbcType="VARCHAR"/>
|
||||
<result column="creator" property="creator" jdbcType="VARCHAR"/>
|
||||
<result column="updater" property="updater" jdbcType="VARCHAR"/>
|
||||
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="delete_time" property="deleteTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="deleted" property="deleted" jdbcType="BOOLEAN"/>
|
||||
<!-- 资源表字段 -->
|
||||
<result column="title" property="title" jdbcType="VARCHAR"/>
|
||||
<result column="summary" property="summary" jdbcType="VARCHAR"/>
|
||||
<result column="cover_image" property="coverImage" jdbcType="VARCHAR"/>
|
||||
<result column="tag_id" property="tagID" jdbcType="VARCHAR"/>
|
||||
<result column="author" property="author" jdbcType="VARCHAR"/>
|
||||
<result column="source" property="source" jdbcType="VARCHAR"/>
|
||||
<result column="source_url" property="sourceUrl" jdbcType="VARCHAR"/>
|
||||
<result column="view_count" property="viewCount" jdbcType="INTEGER"/>
|
||||
<result column="like_count" property="likeCount" jdbcType="INTEGER"/>
|
||||
<result column="collect_count" property="collectCount" jdbcType="INTEGER"/>
|
||||
<result column="status" property="status" jdbcType="INTEGER"/>
|
||||
<result column="is_recommend" property="isRecommend" jdbcType="BOOLEAN"/>
|
||||
<result column="is_banner" property="isBanner" jdbcType="BOOLEAN"/>
|
||||
<result column="publish_time" property="publishTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="resource_creator" property="resourceCreator" jdbcType="VARCHAR"/>
|
||||
<result column="resource_updater" property="resourceUpdater" jdbcType="VARCHAR"/>
|
||||
<result column="resource_create_time" property="resourceCreateTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="resource_update_time" property="resourceUpdateTime" jdbcType="TIMESTAMP"/>
|
||||
<!-- 权限字段 -->
|
||||
<result column="can_read" property="canRead" jdbcType="TINYINT"/>
|
||||
<result column="can_write" property="canWrite" jdbcType="TINYINT"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- 基础字段 -->
|
||||
<sql id="Base_Column_List">
|
||||
id, resource_id, order_num, reason, creator, updater, create_time,
|
||||
id, resource_id, recommend_type, order_num, reason, creator, updater, create_time,
|
||||
update_time, delete_time, deleted
|
||||
</sql>
|
||||
|
||||
<!-- 通用条件 -->
|
||||
<sql id="Where_Clause">
|
||||
<where>
|
||||
deleted = 0
|
||||
<if test="resourceID != null and resourceID != ''">
|
||||
AND resource_id = #{resourceID}
|
||||
</if>
|
||||
<if test="reason != null and reason != ''">
|
||||
AND reason LIKE CONCAT('%', #{reason}, '%')
|
||||
rr.deleted = 0
|
||||
<if test="filter != null">
|
||||
<if test="filter.id != null and filter.id != ''">
|
||||
AND rr.id = #{filter.id}
|
||||
</if>
|
||||
<if test="filter.resourceID != null and filter.resourceID != ''">
|
||||
AND rr.resource_id = #{filter.resourceID}
|
||||
</if>
|
||||
<if test="filter.recommendType != null">
|
||||
AND rr.recommend_type = #{filter.recommendType}
|
||||
</if>
|
||||
<if test="filter.reason != null and filter.reason != ''">
|
||||
AND rr.reason LIKE CONCAT('%', #{filter.reason}, '%')
|
||||
</if>
|
||||
</if>
|
||||
</where>
|
||||
</sql>
|
||||
|
||||
<!-- selectResourceRecommends -->
|
||||
<select id="selectResourceRecommends" resultMap="BaseResultMap">
|
||||
SELECT
|
||||
<include refid="Base_Column_List"/>
|
||||
FROM tb_resource_recommend
|
||||
<!-- 权限过滤条件(基于dept_path的高效继承,注意:需要先JOIN tb_resource表) -->
|
||||
<sql id="Permission_Filter">
|
||||
INNER JOIN tb_resource_permission rp ON r.resource_id = rp.resource_id
|
||||
AND rp.resource_type = 1
|
||||
AND rp.deleted = 0
|
||||
AND rp.can_read = 1
|
||||
AND (
|
||||
-- 全局权限:所有用户可访问
|
||||
(rp.dept_id IS NULL AND rp.role_id IS NULL)
|
||||
<if test="userDeptRoles != null and userDeptRoles.size() > 0">
|
||||
OR EXISTS (
|
||||
SELECT 1
|
||||
FROM (
|
||||
<foreach collection="userDeptRoles" item="udr" separator=" UNION ALL ">
|
||||
SELECT #{udr.deptID} AS dept_id, #{udr.deptPath} AS dept_path, #{udr.roleID} AS role_id
|
||||
</foreach>
|
||||
) user_roles
|
||||
LEFT JOIN tb_sys_dept perm_dept ON perm_dept.dept_id = rp.dept_id AND perm_dept.deleted = 0
|
||||
WHERE
|
||||
(rp.role_id IS NULL AND rp.dept_id IS NOT NULL
|
||||
AND user_roles.dept_path LIKE CONCAT(perm_dept.dept_path, '%'))
|
||||
OR (rp.dept_id IS NULL AND rp.role_id = user_roles.role_id)
|
||||
OR (rp.dept_id = user_roles.dept_id AND rp.role_id = user_roles.role_id)
|
||||
)
|
||||
</if>
|
||||
)
|
||||
</sql>
|
||||
|
||||
<!-- selectResourceRecommends - 返回VO,包含资源信息和权限 -->
|
||||
<select id="selectResourceRecommends" resultMap="ResourceRecommendVOResultMap">
|
||||
SELECT DISTINCT
|
||||
rr.id, rr.resource_id, rr.recommend_type, rr.order_num, rr.reason,
|
||||
rr.creator, rr.updater, rr.create_time, rr.update_time, rr.delete_time, rr.deleted,
|
||||
r.title, r.summary, r.cover_image, r.tag_id, r.author, r.source, r.source_url,
|
||||
r.view_count, r.like_count, r.collect_count, r.status, r.is_recommend, r.is_banner,
|
||||
r.publish_time, r.creator AS resource_creator, r.updater AS resource_updater,
|
||||
r.create_time AS resource_create_time, r.update_time AS resource_update_time,
|
||||
MAX(rp.can_read) AS can_read, MAX(rp.can_write) AS can_write
|
||||
FROM tb_resource_recommend rr
|
||||
INNER JOIN tb_resource r ON rr.resource_id = r.resource_id AND r.deleted = 0
|
||||
<include refid="Permission_Filter"/>
|
||||
<include refid="Where_Clause"/>
|
||||
ORDER BY order_num ASC, create_time DESC
|
||||
GROUP BY rr.id, rr.resource_id, rr.recommend_type, rr.order_num, rr.reason,
|
||||
rr.creator, rr.updater, rr.create_time, rr.update_time, rr.delete_time, rr.deleted,
|
||||
r.title, r.summary, r.cover_image, r.tag_id, r.author, r.source, r.source_url,
|
||||
r.view_count, r.like_count, r.collect_count, r.status, r.is_recommend, r.is_banner,
|
||||
r.publish_time, r.creator, r.updater, r.create_time, r.update_time
|
||||
ORDER BY rr.order_num ASC, rr.create_time DESC
|
||||
</select>
|
||||
|
||||
<!-- 根据推荐ID查询推荐信息 -->
|
||||
@@ -70,12 +158,43 @@
|
||||
ORDER BY order_num ASC, create_time DESC
|
||||
</select>
|
||||
|
||||
<!-- 根据类型查询推荐列表 -->
|
||||
<select id="selectByType" resultMap="BaseResultMap">
|
||||
<!-- 根据推荐类型查询推荐列表 - 返回VO,包含资源信息和权限 -->
|
||||
<select id="selectByRecommendType" resultMap="ResourceRecommendVOResultMap">
|
||||
SELECT DISTINCT
|
||||
rr.id, rr.resource_id, rr.recommend_type, rr.order_num, rr.reason,
|
||||
rr.creator, rr.updater, rr.create_time, rr.update_time, rr.delete_time, rr.deleted,
|
||||
r.title, r.summary, r.cover_image, r.tag_id, r.author, r.source, r.source_url,
|
||||
r.view_count, r.like_count, r.collect_count, r.status, r.is_recommend, r.is_banner,
|
||||
r.publish_time, r.creator AS resource_creator, r.updater AS resource_updater,
|
||||
r.create_time AS resource_create_time, r.update_time AS resource_update_time,
|
||||
MAX(rp.can_read) AS can_read, MAX(rp.can_write) AS can_write
|
||||
FROM tb_resource_recommend rr
|
||||
INNER JOIN tb_resource r ON rr.resource_id = r.resource_id AND r.deleted = 0
|
||||
<include refid="Permission_Filter"/>
|
||||
WHERE rr.deleted = 0
|
||||
<if test="recommendType != null">
|
||||
AND rr.recommend_type = #{recommendType}
|
||||
</if>
|
||||
GROUP BY rr.id, rr.resource_id, rr.recommend_type, rr.order_num, rr.reason,
|
||||
rr.creator, rr.updater, rr.create_time, rr.update_time, rr.delete_time, rr.deleted,
|
||||
r.title, r.summary, r.cover_image, r.tag_id, r.author, r.source, r.source_url,
|
||||
r.view_count, r.like_count, r.collect_count, r.status, r.is_recommend, r.is_banner,
|
||||
r.publish_time, r.creator, r.updater, r.create_time, r.update_time
|
||||
ORDER BY rr.order_num ASC, rr.create_time DESC
|
||||
<if test="limit != null and limit > 0">
|
||||
LIMIT #{limit}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<!-- 根据资源ID和推荐类型查询 -->
|
||||
<select id="selectByResourceIdAndType" resultMap="BaseResultMap">
|
||||
SELECT
|
||||
<include refid="Base_Column_List" />
|
||||
FROM tb_resource_recommend
|
||||
WHERE deleted = 0
|
||||
WHERE resource_id = #{resourceId} AND deleted = 0
|
||||
<if test="recommendType != null">
|
||||
AND recommend_type = #{recommendType}
|
||||
</if>
|
||||
ORDER BY order_num ASC, create_time DESC
|
||||
</select>
|
||||
|
||||
@@ -106,10 +225,10 @@
|
||||
<!-- 插入资源推荐 -->
|
||||
<insert id="insertResourceRecommend" parameterType="org.xyzh.common.dto.resource.TbResourceRecommend">
|
||||
INSERT INTO tb_resource_recommend (
|
||||
id, resource_id, order_num, reason, creator, updater, create_time,
|
||||
id, resource_id, recommend_type, order_num, reason, creator, updater, create_time,
|
||||
update_time, delete_time, deleted
|
||||
) VALUES (
|
||||
#{id}, #{resourceID}, #{orderNum}, #{reason}, #{creator}, #{updater}, #{createTime},
|
||||
#{id}, #{resourceID}, #{recommendType}, #{orderNum}, #{reason}, #{creator}, #{updater}, #{createTime},
|
||||
#{updateTime}, #{deleteTime}, #{deleted}
|
||||
)
|
||||
</insert>
|
||||
@@ -121,6 +240,9 @@
|
||||
<if test="resourceID != null and resourceID != ''">
|
||||
resource_id = #{resourceID},
|
||||
</if>
|
||||
<if test="recommendType != null">
|
||||
recommend_type = #{recommendType},
|
||||
</if>
|
||||
<if test="orderNum != null">
|
||||
order_num = #{orderNum},
|
||||
</if>
|
||||
@@ -152,12 +274,12 @@
|
||||
<!-- 批量插入资源推荐 -->
|
||||
<insert id="batchInsertResourceRecommends" parameterType="java.util.List">
|
||||
INSERT INTO tb_resource_recommend (
|
||||
id, resource_id, order_num, reason, creator, updater, create_time,
|
||||
id, resource_id, recommend_type, order_num, reason, creator, updater, create_time,
|
||||
update_time, delete_time, deleted
|
||||
) VALUES
|
||||
<foreach collection="resourceRecommendList" item="item" separator=",">
|
||||
(
|
||||
#{item.id}, #{item.resourceID}, #{item.orderNum}, #{item.reason}, #{item.creator},
|
||||
#{item.id}, #{item.resourceID}, #{item.recommendType}, #{item.orderNum}, #{item.reason}, #{item.creator},
|
||||
#{item.updater}, #{item.createTime}, #{item.updateTime}, #{item.deleteTime}, #{item.deleted}
|
||||
)
|
||||
</foreach>
|
||||
@@ -172,21 +294,37 @@
|
||||
</foreach>
|
||||
</delete>
|
||||
|
||||
<!-- 分页查询资源推荐 -->
|
||||
<select id="selectResourceRecommendsPage" resultMap="BaseResultMap">
|
||||
SELECT
|
||||
<include refid="Base_Column_List" />
|
||||
FROM tb_resource_recommend
|
||||
<!-- 分页查询资源推荐 - 返回VO,包含资源信息和权限 -->
|
||||
<select id="selectResourceRecommendsPage" resultMap="ResourceRecommendVOResultMap">
|
||||
SELECT DISTINCT
|
||||
rr.id, rr.resource_id, rr.recommend_type, rr.order_num, rr.reason,
|
||||
rr.creator, rr.updater, rr.create_time, rr.update_time, rr.delete_time, rr.deleted,
|
||||
r.title, r.summary, r.cover_image, r.tag_id, r.author, r.source, r.source_url,
|
||||
r.view_count, r.like_count, r.collect_count, r.status, r.is_recommend, r.is_banner,
|
||||
r.publish_time, r.creator AS resource_creator, r.updater AS resource_updater,
|
||||
r.create_time AS resource_create_time, r.update_time AS resource_update_time,
|
||||
MAX(rp.can_read) AS can_read, MAX(rp.can_write) AS can_write
|
||||
FROM tb_resource_recommend rr
|
||||
INNER JOIN tb_resource r ON rr.resource_id = r.resource_id AND r.deleted = 0
|
||||
<include refid="Permission_Filter"/>
|
||||
<include refid="Where_Clause" />
|
||||
ORDER BY order_num ASC, create_time DESC
|
||||
GROUP BY rr.id, rr.resource_id, rr.recommend_type, rr.order_num, rr.reason,
|
||||
rr.creator, rr.updater, rr.create_time, rr.update_time, rr.delete_time, rr.deleted,
|
||||
r.title, r.summary, r.cover_image, r.tag_id, r.author, r.source, r.source_url,
|
||||
r.view_count, r.like_count, r.collect_count, r.status, r.is_recommend, r.is_banner,
|
||||
r.publish_time, r.creator, r.updater, r.create_time, r.update_time
|
||||
ORDER BY rr.order_num ASC, rr.create_time DESC
|
||||
LIMIT #{pageParam.pageSize} OFFSET #{pageParam.offset}
|
||||
</select>
|
||||
|
||||
<!-- 统计资源推荐总数 -->
|
||||
<!-- 统计资源推荐总数 - 添加权限过滤 -->
|
||||
<select id="countResourceRecommends" resultType="long">
|
||||
SELECT COUNT(1)
|
||||
FROM tb_resource_recommend
|
||||
SELECT COUNT(DISTINCT rr.id)
|
||||
FROM tb_resource_recommend rr
|
||||
INNER JOIN tb_resource r ON rr.resource_id = r.resource_id AND r.deleted = 0
|
||||
<include refid="Permission_Filter"/>
|
||||
<include refid="Where_Clause" />
|
||||
</select>
|
||||
|
||||
|
||||
</mapper>
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
package org.xyzh.study.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.xyzh.common.dto.study.TbLearningTaskTag;
|
||||
import org.xyzh.common.vo.TagVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description 学习任务标签关联Mapper
|
||||
* @filename LearningTaskTagMapper.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-10-31
|
||||
*/
|
||||
@Mapper
|
||||
public interface LearningTaskTagMapper extends BaseMapper<TbLearningTaskTag> {
|
||||
|
||||
/**
|
||||
* 根据任务ID查询标签VO列表(包含标签详细信息)
|
||||
*/
|
||||
List<TagVO> selectByTaskId(@Param("taskId") String taskId);
|
||||
|
||||
/**
|
||||
* 根据标签ID查询任务关联列表
|
||||
*/
|
||||
List<TbLearningTaskTag> selectByTagId(@Param("tagId") String tagId);
|
||||
|
||||
/**
|
||||
* 批量插入任务标签关联
|
||||
*/
|
||||
int batchInsert(@Param("list") List<TbLearningTaskTag> list);
|
||||
|
||||
/**
|
||||
* 根据任务ID删除所有标签关联
|
||||
*/
|
||||
int deleteByTaskId(@Param("taskId") String taskId);
|
||||
|
||||
/**
|
||||
* 删除指定任务的指定标签
|
||||
*/
|
||||
int deleteByTaskIdAndTagId(@Param("taskId") String taskId, @Param("tagId") String tagId);
|
||||
}
|
||||
|
||||
@@ -29,7 +29,10 @@ import org.xyzh.study.mapper.TaskUserMapper;
|
||||
import org.xyzh.study.mapper.CourseMapper;
|
||||
import org.xyzh.system.utils.LoginUtil;
|
||||
import org.xyzh.study.mapper.TaskItemMapper;
|
||||
import org.xyzh.study.mapper.LearningTaskTagMapper;
|
||||
import org.xyzh.api.study.task.LearningTaskService;
|
||||
import org.xyzh.common.dto.study.TbLearningTaskTag;
|
||||
import org.xyzh.common.vo.TagVO;
|
||||
import org.xyzh.common.core.enums.TaskItemType;
|
||||
import org.xyzh.api.system.permission.ResourcePermissionService;
|
||||
import org.xyzh.common.vo.UserDeptRoleVO;
|
||||
@@ -59,6 +62,9 @@ public class SCLearningTaskServiceImpl implements LearningTaskService {
|
||||
@Autowired
|
||||
private TaskItemMapper taskItemMapper;
|
||||
|
||||
@Autowired
|
||||
private LearningTaskTagMapper learningTaskTagMapper;
|
||||
|
||||
@Autowired
|
||||
private ResourcePermissionService resourcePermissionService;
|
||||
|
||||
@@ -237,6 +243,22 @@ public class SCLearningTaskServiceImpl implements LearningTaskService {
|
||||
int learnCount = courseMapper.incrementLearnCount(item.getItemID(), taskUsers.size());
|
||||
}
|
||||
|
||||
// 绑定标签
|
||||
List<TagVO> taskTags = taskVO.getTaskTags();
|
||||
if (taskTags != null && !taskTags.isEmpty()) {
|
||||
List<TbLearningTaskTag> taskTagList = new ArrayList<>();
|
||||
for (TagVO tag : taskTags) {
|
||||
TbLearningTaskTag taskTag = new TbLearningTaskTag();
|
||||
taskTag.setID(IDUtils.generateID());
|
||||
taskTag.setTaskID(taskID);
|
||||
taskTag.setTagID(tag.getTagID());
|
||||
taskTag.setCreator(currentUser.getID());
|
||||
taskTag.setCreateTime(now);
|
||||
taskTagList.add(taskTag);
|
||||
}
|
||||
learningTaskTagMapper.batchInsert(taskTagList);
|
||||
}
|
||||
|
||||
// 创建任务资源权限
|
||||
try {
|
||||
List<UserDeptRoleVO> userDeptRoles = LoginUtil.getCurrentDeptRole();
|
||||
@@ -423,6 +445,57 @@ public class SCLearningTaskServiceImpl implements LearningTaskService {
|
||||
int learnCount = courseMapper.incrementLearnCount(taskID, usersToInsert.size());
|
||||
}
|
||||
|
||||
// 4. 处理标签关联
|
||||
List<TagVO> newTags = taskVO.getTaskTags();
|
||||
if (newTags == null) {
|
||||
newTags = new ArrayList<>();
|
||||
}
|
||||
|
||||
// 获取现有的标签关联
|
||||
List<TagVO> existingTags = learningTaskTagMapper.selectByTaskId(taskID);
|
||||
Map<String, TagVO> existingTagMap = existingTags.stream()
|
||||
.collect(Collectors.toMap(TagVO::getTagID, tag -> tag));
|
||||
|
||||
Set<String> newTagIDs = new HashSet<>();
|
||||
List<TbLearningTaskTag> tagsToInsert = new ArrayList<>();
|
||||
|
||||
// 处理新的标签关联
|
||||
for (TagVO tag : newTags) {
|
||||
String tagID = tag.getTagID();
|
||||
if (tagID == null || tagID.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
newTagIDs.add(tagID);
|
||||
|
||||
// 如果不存在,则新增
|
||||
if (!existingTagMap.containsKey(tagID)) {
|
||||
TbLearningTaskTag taskTag = new TbLearningTaskTag();
|
||||
taskTag.setID(IDUtils.generateID());
|
||||
taskTag.setTaskID(taskID);
|
||||
taskTag.setTagID(tagID);
|
||||
taskTag.setCreator(user.getID());
|
||||
taskTag.setCreateTime(now);
|
||||
tagsToInsert.add(taskTag);
|
||||
}
|
||||
}
|
||||
|
||||
// 找出要删除的标签关联
|
||||
List<String> tagIDsToDelete = existingTagMap.values().stream()
|
||||
.filter(taskTag -> !newTagIDs.contains(taskTag.getTagID()))
|
||||
.map(TagVO::getTagID)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
// 删除不再需要的标签
|
||||
for (String tagID : tagIDsToDelete) {
|
||||
learningTaskTagMapper.deleteByTaskIdAndTagId(taskID, tagID);
|
||||
}
|
||||
|
||||
// 插入新标签
|
||||
if (!tagsToInsert.isEmpty()) {
|
||||
learningTaskTagMapper.batchInsert(tagsToInsert);
|
||||
}
|
||||
|
||||
resultDomain.success("更新任务成功", taskVO);
|
||||
return resultDomain;
|
||||
}
|
||||
@@ -494,11 +567,13 @@ public class SCLearningTaskServiceImpl implements LearningTaskService {
|
||||
taskVO.setTaskCourses(taskCourses);
|
||||
taskVO.setTaskResources(taskResources);
|
||||
taskVO.setTaskUsers(taskUsers);
|
||||
|
||||
// 获取任务标签
|
||||
List<TagVO> taskTags = learningTaskTagMapper.selectByTaskId(taskID);
|
||||
taskVO.setTaskTags(taskTags);
|
||||
|
||||
taskVO.setTotalTaskNum(allTaskItems.size());
|
||||
|
||||
|
||||
|
||||
resultDomain.success("获取任务详情成功", taskVO);
|
||||
return resultDomain;
|
||||
}
|
||||
@@ -556,11 +631,13 @@ public class SCLearningTaskServiceImpl implements LearningTaskService {
|
||||
taskVO.setTaskCourses(taskCourses);
|
||||
taskVO.setTaskResources(taskResources);
|
||||
taskVO.setTaskUsers(taskUsers);
|
||||
|
||||
// 获取任务标签
|
||||
List<TagVO> taskTags = learningTaskTagMapper.selectByTaskId(taskID);
|
||||
taskVO.setTaskTags(taskTags);
|
||||
|
||||
taskVO.setTotalTaskNum(allTaskItems.size());
|
||||
|
||||
|
||||
|
||||
resultDomain.success("获取任务详情成功", taskVO);
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
<?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.study.mapper.LearningTaskTagMapper">
|
||||
|
||||
<!-- 结果映射 -->
|
||||
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.study.TbLearningTaskTag">
|
||||
<id column="id" property="id" jdbcType="VARCHAR"/>
|
||||
<result column="task_id" property="taskID" jdbcType="VARCHAR"/>
|
||||
<result column="tag_id" property="tagID" jdbcType="VARCHAR"/>
|
||||
<result column="creator" property="creator" jdbcType="VARCHAR"/>
|
||||
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- TagVO 结果映射 -->
|
||||
<resultMap id="TagVOResultMap" type="org.xyzh.common.vo.TagVO">
|
||||
<id column="id" property="id" jdbcType="VARCHAR"/>
|
||||
<result column="tag_id" property="tagID" jdbcType="VARCHAR"/>
|
||||
<result column="tag_name" property="tagName" jdbcType="VARCHAR"/>
|
||||
<result column="tag_color" property="tagColor" jdbcType="VARCHAR"/>
|
||||
<result column="creator" property="creator" jdbcType="VARCHAR"/>
|
||||
</resultMap>
|
||||
|
||||
<!-- 基础列 -->
|
||||
<sql id="Base_Column_List">
|
||||
id, task_id, tag_id, creator, create_time
|
||||
</sql>
|
||||
|
||||
<!-- 根据任务ID查询标签VO列表(包含标签详细信息) -->
|
||||
<select id="selectByTaskId" resultMap="TagVOResultMap">
|
||||
SELECT
|
||||
tlt.id,
|
||||
tlt.tag_id,
|
||||
t.name AS tag_name,
|
||||
t.color AS tag_color,
|
||||
tlt.creator
|
||||
FROM tb_learning_task_tag tlt
|
||||
INNER JOIN tb_tag t ON tlt.tag_id = t.tag_id AND t.deleted = 0
|
||||
WHERE tlt.task_id = #{taskId}
|
||||
ORDER BY tlt.create_time ASC
|
||||
</select>
|
||||
|
||||
<!-- 根据标签ID查询任务关联列表 -->
|
||||
<select id="selectByTagId" resultMap="BaseResultMap">
|
||||
SELECT
|
||||
<include refid="Base_Column_List"/>
|
||||
FROM tb_learning_task_tag
|
||||
WHERE tag_id = #{tagId}
|
||||
ORDER BY create_time DESC
|
||||
</select>
|
||||
|
||||
<!-- 批量插入任务标签关联 -->
|
||||
<insert id="batchInsert">
|
||||
INSERT INTO tb_learning_task_tag (
|
||||
id, task_id, tag_id, creator, create_time
|
||||
) VALUES
|
||||
<foreach collection="list" item="item" separator=",">
|
||||
(
|
||||
#{item.id}, #{item.taskID}, #{item.tagID},
|
||||
#{item.creator}, #{item.createTime}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
|
||||
<!-- 根据任务ID删除所有标签关联 -->
|
||||
<delete id="deleteByTaskId">
|
||||
DELETE FROM tb_learning_task_tag
|
||||
WHERE task_id = #{taskId}
|
||||
</delete>
|
||||
|
||||
<!-- 删除指定任务的指定标签 -->
|
||||
<delete id="deleteByTaskIdAndTagId">
|
||||
DELETE FROM tb_learning_task_tag
|
||||
WHERE task_id = #{taskId} AND tag_id = #{tagId}
|
||||
</delete>
|
||||
|
||||
</mapper>
|
||||
@@ -32,6 +32,16 @@
|
||||
<artifactId>api-system</artifactId>
|
||||
<version>${school-news.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.xyzh</groupId>
|
||||
<artifactId>api-news</artifactId>
|
||||
<version>${school-news.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.xyzh</groupId>
|
||||
<artifactId>api-study</artifactId>
|
||||
<version>${school-news.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.xyzh</groupId>
|
||||
|
||||
@@ -8,7 +8,7 @@ import org.xyzh.api.usercenter.collection.UserCollectionService;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.dto.usercenter.TbUserCollection;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.vo.UserCollectionVO;
|
||||
import org.xyzh.system.utils.LoginUtil;
|
||||
/**
|
||||
* @description 用户收藏控制器
|
||||
@@ -26,14 +26,13 @@ public class UserCollectionController {
|
||||
private UserCollectionService userCollectionService;
|
||||
|
||||
/**
|
||||
* 获取用户收藏列表
|
||||
* 获取用户收藏列表(扁平化VO,包含资源/课程详情)
|
||||
*/
|
||||
@GetMapping("/user/{userID}")
|
||||
public ResultDomain<TbUserCollection> getUserCollections(
|
||||
public ResultDomain<UserCollectionVO> getUserCollections(
|
||||
@PathVariable("userID") String userID,
|
||||
@RequestParam(required = false) Integer resourceType,
|
||||
@RequestParam(required = false) String resourceID) {
|
||||
return userCollectionService.getUserCollections(userID, resourceType);
|
||||
@RequestParam(required = false, name = "collectionType") Integer collectionType) {
|
||||
return userCollectionService.getUserCollections(userID, collectionType);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -57,8 +56,8 @@ public class UserCollectionController {
|
||||
*/
|
||||
@GetMapping("/check")
|
||||
public ResultDomain<Boolean> isCollected(
|
||||
@RequestParam(value = "collectionID", required = false) String collectionID,
|
||||
@RequestParam(value = "collectionType", required = false) Integer collectionType) {
|
||||
@RequestParam(name = "collectionID", required = false) String collectionID,
|
||||
@RequestParam(name = "collectionType", required = false) Integer collectionType) {
|
||||
ResultDomain<Boolean> resultDomain = new ResultDomain<>();
|
||||
TbSysUser user = LoginUtil.getCurrentUser();
|
||||
if (user == null) {
|
||||
@@ -74,8 +73,8 @@ public class UserCollectionController {
|
||||
@GetMapping("/count/{userID}")
|
||||
public ResultDomain<Integer> getCollectionCount(
|
||||
@PathVariable("userID") String userID,
|
||||
@RequestParam(required = false) Integer resourceType,
|
||||
@RequestParam(required = false) String resourceID) {
|
||||
return userCollectionService.getCollectionCount(userID, resourceType, resourceID);
|
||||
@RequestParam(name = "collectionType", required = false) Integer collectionType,
|
||||
@RequestParam(name = "collectionID", required = false) String collectionID) {
|
||||
return userCollectionService.getCollectionCount(userID, collectionType, collectionID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.xyzh.common.core.page.PageParam;
|
||||
import org.xyzh.common.dto.usercenter.TbUserCollection;
|
||||
import org.xyzh.common.vo.UserCollectionVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -26,6 +27,16 @@ public interface UserCollectionMapper extends BaseMapper<TbUserCollection> {
|
||||
* @since 2025-10-15
|
||||
*/
|
||||
List<TbUserCollection> selectUserCollections(TbUserCollection filter);
|
||||
|
||||
/**
|
||||
* @description 查询用户收藏列表(包含资源/课程详情)
|
||||
* @param userID 用户ID
|
||||
* @param collectionType 收藏类型(可选)
|
||||
* @return List<UserCollectionVO> 用户收藏VO列表
|
||||
* @author yslg
|
||||
* @since 2025-10-31
|
||||
*/
|
||||
List<UserCollectionVO> selectUserCollectionsVO(@Param("userID") String userID, @Param("collectionType") Integer collectionType);
|
||||
|
||||
/**
|
||||
* @description 根据用户ID查询收藏记录
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.xyzh.usercenter.service.impl;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
@@ -7,9 +8,13 @@ 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.resource.ResourceService;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.dto.resource.TbResource;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.dto.usercenter.TbUserCollection;
|
||||
import org.xyzh.common.vo.UserCollectionVO;
|
||||
import org.xyzh.system.utils.LoginUtil;
|
||||
import org.xyzh.usercenter.mapper.UserCollectionMapper;
|
||||
import org.xyzh.usercenter.service.UCUserCollectionService;
|
||||
@@ -29,26 +34,31 @@ public class UCUserCollectionServiceImpl implements UCUserCollectionService {
|
||||
@Autowired
|
||||
private UserCollectionMapper userCollectionMapper;
|
||||
|
||||
@Autowired
|
||||
private ResourceService resourceService;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public ResultDomain<TbUserCollection> addCollection(TbUserCollection userCollection) {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
TbSysUser user = LoginUtil.getCurrentUser();
|
||||
if (user == null) {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
resultDomain.fail("请先登录");
|
||||
return resultDomain;
|
||||
throw new RuntimeException("请先登录");
|
||||
}
|
||||
userCollection.setUserID(user.getID());
|
||||
userCollection.setCreateTime(new Date());
|
||||
int result = userCollectionMapper.insertUserCollection(userCollection);
|
||||
if (result > 0) {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
userCollection.setCollectionValue(1);
|
||||
ResultDomain<TbResource> resultDomainResource = resourceService.resourceCollect(userCollection);
|
||||
if (!resultDomainResource.isSuccess()) {
|
||||
throw new RuntimeException(resultDomainResource.getMessage());
|
||||
}
|
||||
resultDomain.success("添加收藏成功", userCollection);
|
||||
return resultDomain;
|
||||
} else {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
resultDomain.fail("添加收藏失败");
|
||||
return resultDomain;
|
||||
}
|
||||
resultDomain.fail("添加收藏失败");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -58,20 +68,24 @@ public class UCUserCollectionServiceImpl implements UCUserCollectionService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<TbUserCollection> getUserCollections(String userID, Integer collectionType) {
|
||||
TbUserCollection filter = new TbUserCollection();
|
||||
filter.setUserID(userID);
|
||||
filter.setCollectionType(collectionType);
|
||||
List<TbUserCollection> list = userCollectionMapper.selectUserCollections(filter);
|
||||
if (list != null && list.size() > 0) {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
resultDomain.success("获取收藏列表成功", list);
|
||||
return resultDomain;
|
||||
} else {
|
||||
ResultDomain<TbUserCollection> resultDomain = new ResultDomain<>();
|
||||
public ResultDomain<UserCollectionVO> getUserCollections(String userID, Integer collectionType) {
|
||||
ResultDomain<UserCollectionVO> resultDomain = new ResultDomain<>();
|
||||
|
||||
try {
|
||||
// 直接通过SQL JOIN一次性查询所有数据,避免N+1查询问题
|
||||
List<UserCollectionVO> voList = userCollectionMapper.selectUserCollectionsVO(userID, collectionType);
|
||||
|
||||
if (voList == null || voList.isEmpty()) {
|
||||
resultDomain.success("获取收藏列表成功", new ArrayList<>());
|
||||
} else {
|
||||
resultDomain.success("获取收藏列表成功", voList);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("获取收藏列表失败: userID={}, collectionType={}", userID, collectionType, e);
|
||||
resultDomain.fail("获取收藏列表失败");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -93,9 +107,22 @@ public class UCUserCollectionServiceImpl implements UCUserCollectionService {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public ResultDomain<Boolean> removeCollection(TbUserCollection userCollection) {
|
||||
TbSysUser user = LoginUtil.getCurrentUser();
|
||||
if (user == null) {
|
||||
throw new RuntimeException("请先登录");
|
||||
}
|
||||
userCollection.setUserID(user.getID());
|
||||
userCollection.setCollectionValue(-1);
|
||||
int result = userCollectionMapper.deleteUserCollection(userCollection);
|
||||
|
||||
if (result > 0) {
|
||||
userCollection.setCollectionValue(-1);
|
||||
ResultDomain<TbResource> resultDomainResource = resourceService.resourceCollect(userCollection);
|
||||
if (!resultDomainResource.isSuccess()) {
|
||||
throw new RuntimeException(resultDomainResource.getMessage());
|
||||
}
|
||||
ResultDomain<Boolean> resultDomain = new ResultDomain<>();
|
||||
resultDomain.success("删除收藏成功", true);
|
||||
return resultDomain;
|
||||
|
||||
@@ -5,11 +5,47 @@
|
||||
<!-- 结果映射 -->
|
||||
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.usercenter.TbUserCollection">
|
||||
<id column="id" property="id" />
|
||||
<result column="user_id" property=".userID" />
|
||||
<result column="user_id" property="userID" />
|
||||
<result column="collection_type" property="collectionType" />
|
||||
<result column="collection_id" property="collectionID" />
|
||||
<result column="create_time" property="createTime" />
|
||||
</resultMap>
|
||||
|
||||
<!-- UserCollectionVO结果映射 -->
|
||||
<resultMap id="UserCollectionVOResultMap" type="org.xyzh.common.vo.UserCollectionVO">
|
||||
<!-- 收藏基本信息 -->
|
||||
<id column="id" property="id" />
|
||||
<result column="user_id" property="userID" />
|
||||
<result column="collection_type" property="collectionType" />
|
||||
<result column="collection_id" property="collectionID" />
|
||||
<result column="collection_time" property="collectionTime" />
|
||||
<result column="create_time" property="createTime" />
|
||||
|
||||
<!-- 资源详情(collection_type=1时有效) -->
|
||||
<result column="resource_id" property="resourceID" />
|
||||
<result column="resource_title" property="title" />
|
||||
<result column="resource_content" property="content" />
|
||||
<result column="resource_summary" property="summary" />
|
||||
<result column="resource_cover_image" property="coverImage" />
|
||||
<result column="resource_tag_id" property="tagID" />
|
||||
<result column="resource_author" property="author" />
|
||||
<result column="resource_source" property="source" />
|
||||
<result column="resource_view_count" property="viewCount" />
|
||||
<result column="resource_like_count" property="likeCount" />
|
||||
<result column="resource_collect_count" property="collectCount" />
|
||||
<result column="resource_status" property="status" />
|
||||
<result column="resource_publish_time" property="publishTime" />
|
||||
|
||||
<!-- 课程详情(collection_type=2时有效) -->
|
||||
<result column="course_id" property="courseID" />
|
||||
<result column="course_name" property="courseName" />
|
||||
<result column="course_description" property="description" />
|
||||
<result column="course_duration" property="duration" />
|
||||
<result column="course_teacher" property="teacher" />
|
||||
<result column="course_status" property="courseStatus" />
|
||||
<result column="course_view_count" property="viewCount" />
|
||||
<result column="course_learn_count" property="learnCount" />
|
||||
</resultMap>
|
||||
|
||||
<!-- 字段列表 -->
|
||||
<sql id="Base_Column_List">
|
||||
@@ -291,5 +327,50 @@
|
||||
FROM tb_user_collection
|
||||
<include refid="Base_Where_Clause" />
|
||||
</select>
|
||||
|
||||
<!-- 查询用户收藏列表(包含资源/课程详情)- 一次性JOIN查询 -->
|
||||
<select id="selectUserCollectionsVO" resultMap="UserCollectionVOResultMap">
|
||||
SELECT
|
||||
uc.id,
|
||||
uc.user_id,
|
||||
uc.collection_type,
|
||||
uc.collection_id,
|
||||
uc.create_time as collection_time,
|
||||
uc.create_time,
|
||||
|
||||
<!-- 资源字段 -->
|
||||
r.resource_id,
|
||||
r.title as resource_title,
|
||||
r.content as resource_content,
|
||||
r.summary as resource_summary,
|
||||
r.cover_image as resource_cover_image,
|
||||
r.tag_id as resource_tag_id,
|
||||
r.author as resource_author,
|
||||
r.source as resource_source,
|
||||
r.view_count as resource_view_count,
|
||||
r.like_count as resource_like_count,
|
||||
r.collect_count as resource_collect_count,
|
||||
r.status as resource_status,
|
||||
r.publish_time as resource_publish_time,
|
||||
|
||||
<!-- 课程字段 -->
|
||||
c.course_id,
|
||||
c.name as course_name,
|
||||
c.description as course_description,
|
||||
c.cover_image as course_cover_image,
|
||||
c.duration as course_duration,
|
||||
c.teacher as course_teacher,
|
||||
c.status as course_status,
|
||||
c.view_count as course_view_count,
|
||||
c.learn_count as course_learn_count
|
||||
FROM tb_user_collection uc
|
||||
LEFT JOIN tb_resource r ON uc.collection_type = 1 AND uc.collection_id = r.resource_id
|
||||
LEFT JOIN tb_course c ON uc.collection_type = 2 AND uc.collection_id = c.course_id
|
||||
WHERE uc.user_id = #{userID}
|
||||
<if test="collectionType != null">
|
||||
AND uc.collection_type = #{collectionType}
|
||||
</if>
|
||||
ORDER BY uc.create_time DESC
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
Reference in New Issue
Block a user